mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-04 01:24:12 +08:00
Merge branch 'drm-intel-fixes' into drm-intel-next
This commit is contained in:
commit
8eb2c0ee67
@ -520,59 +520,20 @@ Support for power domains is provided through the pwr_domain field of struct
|
||||
device. This field is a pointer to an object of type struct dev_power_domain,
|
||||
defined in include/linux/pm.h, providing a set of power management callbacks
|
||||
analogous to the subsystem-level and device driver callbacks that are executed
|
||||
for the given device during all power transitions, in addition to the respective
|
||||
subsystem-level callbacks. Specifically, the power domain "suspend" callbacks
|
||||
(i.e. ->runtime_suspend(), ->suspend(), ->freeze(), ->poweroff(), etc.) are
|
||||
executed after the analogous subsystem-level callbacks, while the power domain
|
||||
"resume" callbacks (i.e. ->runtime_resume(), ->resume(), ->thaw(), ->restore,
|
||||
etc.) are executed before the analogous subsystem-level callbacks. Error codes
|
||||
returned by the "suspend" and "resume" power domain callbacks are ignored.
|
||||
for the given device during all power transitions, instead of the respective
|
||||
subsystem-level callbacks. Specifically, if a device's pm_domain pointer is
|
||||
not NULL, the ->suspend() callback from the object pointed to by it will be
|
||||
executed instead of its subsystem's (e.g. bus type's) ->suspend() callback and
|
||||
anlogously for all of the remaining callbacks. In other words, power management
|
||||
domain callbacks, if defined for the given device, always take precedence over
|
||||
the callbacks provided by the device's subsystem (e.g. bus type).
|
||||
|
||||
Power domain ->runtime_idle() callback is executed before the subsystem-level
|
||||
->runtime_idle() callback and the result returned by it is not ignored. Namely,
|
||||
if it returns error code, the subsystem-level ->runtime_idle() callback will not
|
||||
be called and the helper function rpm_idle() executing it will return error
|
||||
code. This mechanism is intended to help platforms where saving device state
|
||||
is a time consuming operation and should only be carried out if all devices
|
||||
in the power domain are idle, before turning off the shared power resource(s).
|
||||
Namely, the power domain ->runtime_idle() callback may return error code until
|
||||
the pm_runtime_idle() helper (or its asychronous version) has been called for
|
||||
all devices in the power domain (it is recommended that the returned error code
|
||||
be -EBUSY in those cases), preventing the subsystem-level ->runtime_idle()
|
||||
callback from being run prematurely.
|
||||
|
||||
The support for device power domains is only relevant to platforms needing to
|
||||
use the same subsystem-level (e.g. platform bus type) and device driver power
|
||||
management callbacks in many different power domain configurations and wanting
|
||||
to avoid incorporating the support for power domains into the subsystem-level
|
||||
callbacks. The other platforms need not implement it or take it into account
|
||||
in any way.
|
||||
|
||||
|
||||
System Devices
|
||||
--------------
|
||||
System devices (sysdevs) follow a slightly different API, which can be found in
|
||||
|
||||
include/linux/sysdev.h
|
||||
drivers/base/sys.c
|
||||
|
||||
System devices will be suspended with interrupts disabled, and after all other
|
||||
devices have been suspended. On resume, they will be resumed before any other
|
||||
devices, and also with interrupts disabled. These things occur in special
|
||||
"sysdev_driver" phases, which affect only system devices.
|
||||
|
||||
Thus, after the suspend_noirq (or freeze_noirq or poweroff_noirq) phase, when
|
||||
the non-boot CPUs are all offline and IRQs are disabled on the remaining online
|
||||
CPU, then a sysdev_driver.suspend phase is carried out, and the system enters a
|
||||
sleep state (or a system image is created). During resume (or after the image
|
||||
has been created or loaded) a sysdev_driver.resume phase is carried out, IRQs
|
||||
are enabled on the only online CPU, the non-boot CPUs are enabled, and the
|
||||
resume_noirq (or thaw_noirq or restore_noirq) phase begins.
|
||||
|
||||
Code to actually enter and exit the system-wide low power state sometimes
|
||||
involves hardware details that are only known to the boot firmware, and
|
||||
may leave a CPU running software (from SRAM or flash memory) that monitors
|
||||
the system and manages its wakeup sequence.
|
||||
The support for device power management domains is only relevant to platforms
|
||||
needing to use the same device driver power management callbacks in many
|
||||
different power domain configurations and wanting to avoid incorporating the
|
||||
support for power domains into subsystem-level callbacks, for example by
|
||||
modifying the platform bus type. Other platforms need not implement it or take
|
||||
it into account in any way.
|
||||
|
||||
|
||||
Device Low Power (suspend) States
|
||||
|
@ -566,11 +566,6 @@ to do this is:
|
||||
pm_runtime_set_active(dev);
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
The PM core always increments the run-time usage counter before calling the
|
||||
->prepare() callback and decrements it after calling the ->complete() callback.
|
||||
Hence disabling run-time PM temporarily like this will not cause any run-time
|
||||
suspend callbacks to be lost.
|
||||
|
||||
7. Generic subsystem callbacks
|
||||
|
||||
Subsystems may wish to conserve code space by using the set of generic power
|
||||
|
@ -76,6 +76,13 @@ A transfer's actual_length may be positive even when an error has been
|
||||
reported. That's because transfers often involve several packets, so that
|
||||
one or more packets could finish before an error stops further endpoint I/O.
|
||||
|
||||
For isochronous URBs, the urb status value is non-zero only if the URB is
|
||||
unlinked, the device is removed, the host controller is disabled, or the total
|
||||
transferred length is less than the requested length and the URB_SHORT_NOT_OK
|
||||
flag is set. Completion handlers for isochronous URBs should only see
|
||||
urb->status set to zero, -ENOENT, -ECONNRESET, -ESHUTDOWN, or -EREMOTEIO.
|
||||
Individual frame descriptor status fields may report more status codes.
|
||||
|
||||
|
||||
0 Transfer completed successfully
|
||||
|
||||
@ -132,7 +139,7 @@ one or more packets could finish before an error stops further endpoint I/O.
|
||||
device removal events immediately.
|
||||
|
||||
-EXDEV ISO transfer only partially completed
|
||||
look at individual frame status for details
|
||||
(only set in iso_frame_desc[n].status, not urb->status)
|
||||
|
||||
-EINVAL ISO madness, if this happens: Log off and go home
|
||||
|
||||
|
12
MAINTAINERS
12
MAINTAINERS
@ -6434,8 +6434,9 @@ S: Maintained
|
||||
F: drivers/usb/misc/rio500*
|
||||
|
||||
USB EHCI DRIVER
|
||||
M: Alan Stern <stern@rowland.harvard.edu>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Orphan
|
||||
S: Maintained
|
||||
F: Documentation/usb/ehci.txt
|
||||
F: drivers/usb/host/ehci*
|
||||
|
||||
@ -6465,6 +6466,12 @@ S: Maintained
|
||||
F: Documentation/hid/hiddev.txt
|
||||
F: drivers/hid/usbhid/
|
||||
|
||||
USB/IP DRIVERS
|
||||
M: Matt Mooney <mfm@muteddisk.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/staging/usbip/
|
||||
|
||||
USB ISP116X DRIVER
|
||||
M: Olav Kongas <ok@artecdesign.ee>
|
||||
L: linux-usb@vger.kernel.org
|
||||
@ -6494,8 +6501,9 @@ S: Maintained
|
||||
F: sound/usb/midi.*
|
||||
|
||||
USB OHCI DRIVER
|
||||
M: Alan Stern <stern@rowland.harvard.edu>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Orphan
|
||||
S: Maintained
|
||||
F: Documentation/usb/ohci.txt
|
||||
F: drivers/usb/host/ohci*
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc4
|
||||
EXTRAVERSION = -rc5
|
||||
NAME = Sneaky Weasel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -56,7 +56,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
|
||||
* Given a kernel address, find the home node of the underlying memory.
|
||||
*/
|
||||
#define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
|
||||
/*
|
||||
* Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
|
||||
|
@ -597,6 +597,8 @@ __common_mmu_cache_on:
|
||||
sub pc, lr, r0, lsr #32 @ properly flush pipeline
|
||||
#endif
|
||||
|
||||
#define PROC_ENTRY_SIZE (4*5)
|
||||
|
||||
/*
|
||||
* Here follow the relocatable cache support functions for the
|
||||
* various processors. This is a generic hook for locating an
|
||||
@ -624,7 +626,7 @@ call_cache_fn: adr r12, proc_types
|
||||
ARM( addeq pc, r12, r3 ) @ call cache function
|
||||
THUMB( addeq r12, r3 )
|
||||
THUMB( moveq pc, r12 ) @ call cache function
|
||||
add r12, r12, #4*5
|
||||
add r12, r12, #PROC_ENTRY_SIZE
|
||||
b 1b
|
||||
|
||||
/*
|
||||
@ -794,6 +796,16 @@ proc_types:
|
||||
|
||||
.size proc_types, . - proc_types
|
||||
|
||||
/*
|
||||
* If you get a "non-constant expression in ".if" statement"
|
||||
* error from the assembler on this line, check that you have
|
||||
* not accidentally written a "b" instruction where you should
|
||||
* have written W(b).
|
||||
*/
|
||||
.if (. - proc_types) % PROC_ENTRY_SIZE != 0
|
||||
.error "The size of one or more proc_types entries is wrong."
|
||||
.endif
|
||||
|
||||
/*
|
||||
* Turn off the Cache and MMU. ARMv3 does not support
|
||||
* reading the control register, but ARMv4 does.
|
||||
|
@ -13,6 +13,9 @@
|
||||
* Do not include any C declarations in this file - it is included by
|
||||
* assembler source.
|
||||
*/
|
||||
#ifndef __ASM_ASSEMBLER_H__
|
||||
#define __ASM_ASSEMBLER_H__
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#error "Only include this from assembly code"
|
||||
#endif
|
||||
@ -290,3 +293,4 @@
|
||||
.macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
|
||||
usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort
|
||||
.endm
|
||||
#endif /* __ASM_ASSEMBLER_H__ */
|
||||
|
@ -1,3 +1,5 @@
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* Interrupt handling. Preserves r7, r8, r9
|
||||
*/
|
||||
|
@ -193,8 +193,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
|
||||
offset -= 0x02000000;
|
||||
offset += sym->st_value - loc;
|
||||
|
||||
/* only Thumb addresses allowed (no interworking) */
|
||||
if (!(offset & 1) ||
|
||||
/*
|
||||
* For function symbols, only Thumb addresses are
|
||||
* allowed (no interworking).
|
||||
*
|
||||
* For non-function symbols, the destination
|
||||
* has no specific ARM/Thumb disposition, so
|
||||
* the branch is resolved under the assumption
|
||||
* that interworking is not required.
|
||||
*/
|
||||
if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&
|
||||
!(offset & 1)) ||
|
||||
offset <= (s32)0xff000000 ||
|
||||
offset >= (s32)0x01000000) {
|
||||
pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n",
|
||||
|
@ -318,9 +318,13 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
||||
smp_store_cpu_info(cpu);
|
||||
|
||||
/*
|
||||
* OK, now it's safe to let the boot CPU continue
|
||||
* OK, now it's safe to let the boot CPU continue. Wait for
|
||||
* the CPU migration code to notice that the CPU is online
|
||||
* before we continue.
|
||||
*/
|
||||
set_cpu_online(cpu, true);
|
||||
while (!cpu_active(cpu))
|
||||
cpu_relax();
|
||||
|
||||
/*
|
||||
* OK, it's off to the idle thread for us
|
||||
|
@ -35,6 +35,7 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
||||
tcfg->clocks = exynos4_serial_clocks;
|
||||
tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);
|
||||
}
|
||||
tcfg->flags |= NO_NEED_CHECK_CLKSRC;
|
||||
}
|
||||
|
||||
s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);
|
||||
|
@ -6,12 +6,14 @@ config ARCH_H7201
|
||||
bool "gms30c7201"
|
||||
depends on ARCH_H720X
|
||||
select CPU_H7201
|
||||
select ZONE_DMA
|
||||
help
|
||||
Say Y here if you are using the Hynix GMS30C7201 Reference Board
|
||||
|
||||
config ARCH_H7202
|
||||
bool "hms30c7202"
|
||||
select CPU_H7202
|
||||
select ZONE_DMA
|
||||
depends on ARCH_H720X
|
||||
help
|
||||
Say Y here if you are using the Hynix HMS30C7202 Reference Board
|
||||
|
@ -110,10 +110,18 @@ static pin_cfg_t mop500_pins_common[] = {
|
||||
GPIO168_KP_O0,
|
||||
|
||||
/* UART */
|
||||
GPIO0_U0_CTSn | PIN_INPUT_PULLUP,
|
||||
GPIO1_U0_RTSn | PIN_OUTPUT_HIGH,
|
||||
GPIO2_U0_RXD | PIN_INPUT_PULLUP,
|
||||
GPIO3_U0_TXD | PIN_OUTPUT_HIGH,
|
||||
/* uart-0 pins gpio configuration should be
|
||||
* kept intact to prevent glitch in tx line
|
||||
* when tty dev is opened. Later these pins
|
||||
* are configured to uart mop500_pins_uart0
|
||||
*
|
||||
* It will be replaced with uart configuration
|
||||
* once the issue is solved.
|
||||
*/
|
||||
GPIO0_GPIO | PIN_INPUT_PULLUP,
|
||||
GPIO1_GPIO | PIN_OUTPUT_HIGH,
|
||||
GPIO2_GPIO | PIN_INPUT_PULLUP,
|
||||
GPIO3_GPIO | PIN_OUTPUT_HIGH,
|
||||
|
||||
GPIO29_U2_RXD | PIN_INPUT_PULLUP,
|
||||
GPIO30_U2_TXD | PIN_OUTPUT_HIGH,
|
||||
|
@ -27,18 +27,21 @@
|
||||
#include <linux/leds-lp5521.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
#include <plat/ste_dma40.h>
|
||||
#include <plat/pincfg.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/setup.h>
|
||||
#include <mach/devices.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include "pins-db8500.h"
|
||||
#include "ste-dma40-db8500.h"
|
||||
#include "devices-db8500.h"
|
||||
#include "board-mop500.h"
|
||||
@ -393,12 +396,63 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
static pin_cfg_t mop500_pins_uart0[] = {
|
||||
GPIO0_U0_CTSn | PIN_INPUT_PULLUP,
|
||||
GPIO1_U0_RTSn | PIN_OUTPUT_HIGH,
|
||||
GPIO2_U0_RXD | PIN_INPUT_PULLUP,
|
||||
GPIO3_U0_TXD | PIN_OUTPUT_HIGH,
|
||||
};
|
||||
|
||||
#define PRCC_K_SOFTRST_SET 0x18
|
||||
#define PRCC_K_SOFTRST_CLEAR 0x1C
|
||||
static void ux500_uart0_reset(void)
|
||||
{
|
||||
void __iomem *prcc_rst_set, *prcc_rst_clr;
|
||||
|
||||
prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
|
||||
PRCC_K_SOFTRST_SET);
|
||||
prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
|
||||
PRCC_K_SOFTRST_CLEAR);
|
||||
|
||||
/* Activate soft reset PRCC_K_SOFTRST_CLEAR */
|
||||
writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
|
||||
udelay(1);
|
||||
|
||||
/* Release soft reset PRCC_K_SOFTRST_SET */
|
||||
writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
static void ux500_uart0_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = nmk_config_pins(mop500_pins_uart0,
|
||||
ARRAY_SIZE(mop500_pins_uart0));
|
||||
if (ret < 0)
|
||||
pr_err("pl011: uart pins_enable failed\n");
|
||||
}
|
||||
|
||||
static void ux500_uart0_exit(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = nmk_config_pins_sleep(mop500_pins_uart0,
|
||||
ARRAY_SIZE(mop500_pins_uart0));
|
||||
if (ret < 0)
|
||||
pr_err("pl011: uart pins_disable failed\n");
|
||||
}
|
||||
|
||||
static struct amba_pl011_data uart0_plat = {
|
||||
#ifdef CONFIG_STE_DMA40
|
||||
.dma_filter = stedma40_filter,
|
||||
.dma_rx_param = &uart0_dma_cfg_rx,
|
||||
.dma_tx_param = &uart0_dma_cfg_tx,
|
||||
#endif
|
||||
.init = ux500_uart0_init,
|
||||
.exit = ux500_uart0_exit,
|
||||
.reset = ux500_uart0_reset,
|
||||
};
|
||||
|
||||
static struct amba_pl011_data uart1_plat = {
|
||||
|
@ -210,19 +210,21 @@ cpu_v7_name:
|
||||
|
||||
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
|
||||
.globl cpu_v7_suspend_size
|
||||
.equ cpu_v7_suspend_size, 4 * 8
|
||||
.equ cpu_v7_suspend_size, 4 * 9
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
ENTRY(cpu_v7_do_suspend)
|
||||
stmfd sp!, {r4 - r11, lr}
|
||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
mrc p15, 0, r5, c13, c0, 1 @ Context ID
|
||||
mrc p15, 0, r6, c13, c0, 3 @ User r/o thread ID
|
||||
stmia r0!, {r4 - r6}
|
||||
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mrc p15, 0, r7, c2, c0, 0 @ TTB 0
|
||||
mrc p15, 0, r8, c2, c0, 1 @ TTB 1
|
||||
mrc p15, 0, r9, c1, c0, 0 @ Control register
|
||||
mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register
|
||||
mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control
|
||||
stmia r0, {r4 - r11}
|
||||
stmia r0, {r6 - r11}
|
||||
ldmfd sp!, {r4 - r11, pc}
|
||||
ENDPROC(cpu_v7_do_suspend)
|
||||
|
||||
@ -230,9 +232,11 @@ ENTRY(cpu_v7_do_resume)
|
||||
mov ip, #0
|
||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs
|
||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||
ldmia r0, {r4 - r11}
|
||||
ldmia r0!, {r4 - r6}
|
||||
mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||
mcr p15, 0, r5, c13, c0, 1 @ Context ID
|
||||
mcr p15, 0, r6, c13, c0, 3 @ User r/o thread ID
|
||||
ldmia r0, {r6 - r11}
|
||||
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||
mcr p15, 0, r7, c2, c0, 0 @ TTB 0
|
||||
mcr p15, 0, r8, c2, c0, 1 @ TTB 1
|
||||
@ -418,9 +422,9 @@ ENTRY(v7_processor_functions)
|
||||
.word cpu_v7_dcache_clean_area
|
||||
.word cpu_v7_switch_mm
|
||||
.word cpu_v7_set_pte_ext
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
.word cpu_v7_suspend_size
|
||||
.word cpu_v7_do_suspend
|
||||
.word cpu_v7_do_resume
|
||||
.size v7_processor_functions, . - v7_processor_functions
|
||||
|
||||
.section ".rodata"
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
static int cp6_trap(struct pt_regs *regs, unsigned int instr)
|
||||
{
|
||||
|
@ -224,6 +224,8 @@
|
||||
#define S5PV210_UFSTAT_RXMASK (255<<0)
|
||||
#define S5PV210_UFSTAT_RXSHIFT (0)
|
||||
|
||||
#define NO_NEED_CHECK_CLKSRC 1
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/* struct s3c24xx_uart_clksrc
|
||||
|
@ -14,12 +14,6 @@ extern struct pglist_data *node_data[];
|
||||
#define NODE_DATA(nid) (node_data[nid])
|
||||
|
||||
#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) \
|
||||
({ \
|
||||
pg_data_t *__pgdat = NODE_DATA(nid); \
|
||||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages - 1; \
|
||||
})
|
||||
|
||||
#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
|
||||
/*
|
||||
@ -44,7 +38,7 @@ static __inline__ int pfn_to_nid(unsigned long pfn)
|
||||
int node;
|
||||
|
||||
for (node = 0 ; node < MAX_NUMNODES ; node++)
|
||||
if (pfn >= node_start_pfn(node) && pfn <= node_end_pfn(node))
|
||||
if (pfn >= node_start_pfn(node) && pfn < node_end_pfn(node))
|
||||
break;
|
||||
|
||||
return node;
|
||||
|
@ -15,6 +15,7 @@
|
||||
* User space memory access functions
|
||||
*/
|
||||
#include <linux/thread_info.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/errno.h>
|
||||
|
||||
|
@ -14,13 +14,6 @@ extern struct node_map_data node_data[];
|
||||
|
||||
#define NODE_DATA(nid) (&node_data[nid].pg_data)
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) \
|
||||
({ \
|
||||
pg_data_t *__pgdat = NODE_DATA(nid); \
|
||||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
|
||||
})
|
||||
|
||||
/* We have these possible memory map layouts:
|
||||
* Astro: 0-3.75, 67.75-68, 4-64
|
||||
* zx1: 0-1, 257-260, 4-256
|
||||
|
@ -38,13 +38,6 @@ u64 memory_hotplug_max(void);
|
||||
#define memory_hotplug_max() memblock_end_of_DRAM()
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Following are macros that each numa implmentation must define.
|
||||
*/
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn)
|
||||
|
||||
#else
|
||||
#define memory_hotplug_max() memblock_end_of_DRAM()
|
||||
#endif /* CONFIG_NEED_MULTIPLE_NODES */
|
||||
|
@ -579,6 +579,7 @@ config S390_GUEST
|
||||
def_bool y
|
||||
prompt "s390 guest support for KVM (EXPERIMENTAL)"
|
||||
depends on 64BIT && EXPERIMENTAL
|
||||
select VIRTUALIZATION
|
||||
select VIRTIO
|
||||
select VIRTIO_RING
|
||||
select VIRTIO_CONSOLE
|
||||
|
@ -262,7 +262,7 @@ void smp_ctl_set_bit(int cr, int bit)
|
||||
|
||||
memset(&parms.orvals, 0, sizeof(parms.orvals));
|
||||
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
|
||||
parms.orvals[cr] = 1 << bit;
|
||||
parms.orvals[cr] = 1UL << bit;
|
||||
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
|
||||
}
|
||||
EXPORT_SYMBOL(smp_ctl_set_bit);
|
||||
@ -276,7 +276,7 @@ void smp_ctl_clear_bit(int cr, int bit)
|
||||
|
||||
memset(&parms.orvals, 0, sizeof(parms.orvals));
|
||||
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
|
||||
parms.andvals[cr] = ~(1L << bit);
|
||||
parms.andvals[cr] = ~(1UL << bit);
|
||||
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
|
||||
}
|
||||
EXPORT_SYMBOL(smp_ctl_clear_bit);
|
||||
|
@ -25,7 +25,7 @@ extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth);
|
||||
|
||||
#include "hwsampler.h"
|
||||
|
||||
#define DEFAULT_INTERVAL 4096
|
||||
#define DEFAULT_INTERVAL 4127518
|
||||
|
||||
#define DEFAULT_SDBT_BLOCKS 1
|
||||
#define DEFAULT_SDB_BLOCKS 511
|
||||
@ -151,6 +151,12 @@ static int oprofile_hwsampler_init(struct oprofile_operations *ops)
|
||||
if (oprofile_max_interval == 0)
|
||||
return -ENODEV;
|
||||
|
||||
/* The initial value should be sane */
|
||||
if (oprofile_hw_interval < oprofile_min_interval)
|
||||
oprofile_hw_interval = oprofile_min_interval;
|
||||
if (oprofile_hw_interval > oprofile_max_interval)
|
||||
oprofile_hw_interval = oprofile_max_interval;
|
||||
|
||||
if (oprofile_timer_init(ops))
|
||||
return -ENODEV;
|
||||
|
||||
|
@ -9,10 +9,6 @@
|
||||
extern struct pglist_data *node_data[];
|
||||
#define NODE_DATA(nid) (node_data[nid])
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
||||
NODE_DATA(nid)->node_spanned_pages)
|
||||
|
||||
static inline int pfn_to_nid(unsigned long pfn)
|
||||
{
|
||||
int nid;
|
||||
|
@ -8,8 +8,6 @@
|
||||
extern struct pglist_data *node_data[];
|
||||
|
||||
#define NODE_DATA(nid) (node_data[nid])
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn)
|
||||
|
||||
extern int numa_cpu_lookup_table[];
|
||||
extern cpumask_t numa_cpumask_lookup_table[];
|
||||
|
@ -40,17 +40,6 @@ static inline int pfn_to_nid(unsigned long pfn)
|
||||
return highbits_to_node[__pfn_to_highbits(pfn)];
|
||||
}
|
||||
|
||||
/*
|
||||
* Following are macros that each numa implmentation must define.
|
||||
*/
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) \
|
||||
({ \
|
||||
pg_data_t *__pgdat = NODE_DATA(nid); \
|
||||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
|
||||
})
|
||||
|
||||
#define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr)
|
||||
|
||||
static inline int pfn_valid(int pfn)
|
||||
|
6
arch/um/include/asm/percpu.h
Normal file
6
arch/um/include/asm/percpu.h
Normal file
@ -0,0 +1,6 @@
|
||||
#ifndef __UM_PERCPU_H
|
||||
#define __UM_PERCPU_H
|
||||
|
||||
#include <asm-generic/percpu.h>
|
||||
|
||||
#endif /* __UM_PERCPU_H */
|
@ -48,17 +48,6 @@ static inline int pfn_to_nid(unsigned long pfn)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Following are macros that each numa implmentation must define.
|
||||
*/
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) \
|
||||
({ \
|
||||
pg_data_t *__pgdat = NODE_DATA(nid); \
|
||||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
|
||||
})
|
||||
|
||||
static inline int pfn_valid(int pfn)
|
||||
{
|
||||
int nid = pfn_to_nid(pfn);
|
||||
|
@ -13,8 +13,5 @@ extern struct pglist_data *node_data[];
|
||||
|
||||
#define NODE_DATA(nid) (node_data[nid])
|
||||
|
||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
||||
NODE_DATA(nid)->node_spanned_pages)
|
||||
#endif
|
||||
#endif /* _ASM_X86_MMZONE_64_H */
|
||||
|
@ -188,7 +188,7 @@ static bool resource_contains(struct resource *res, resource_size_t point)
|
||||
return false;
|
||||
}
|
||||
|
||||
static void coalesce_windows(struct pci_root_info *info, int type)
|
||||
static void coalesce_windows(struct pci_root_info *info, unsigned long type)
|
||||
{
|
||||
int i, j;
|
||||
struct resource *res1, *res2;
|
||||
|
@ -927,7 +927,7 @@ static int throtl_dispatch(struct request_queue *q)
|
||||
|
||||
bio_list_init(&bio_list_on_stack);
|
||||
|
||||
throtl_log(td, "dispatch nr_queued=%lu read=%u write=%u",
|
||||
throtl_log(td, "dispatch nr_queued=%d read=%u write=%u",
|
||||
total_nr_queued(td), td->nr_queued[READ],
|
||||
td->nr_queued[WRITE]);
|
||||
|
||||
@ -1204,7 +1204,7 @@ int blk_throtl_bio(struct request_queue *q, struct bio **biop)
|
||||
}
|
||||
|
||||
queue_bio:
|
||||
throtl_log_tg(td, tg, "[%c] bio. bdisp=%u sz=%u bps=%llu"
|
||||
throtl_log_tg(td, tg, "[%c] bio. bdisp=%llu sz=%u bps=%llu"
|
||||
" iodisp=%u iops=%u queued=%d/%d",
|
||||
rw == READ ? 'R' : 'W',
|
||||
tg->bytes_disp[rw], bio->bi_size, tg->bps[rw],
|
||||
|
@ -988,9 +988,10 @@ static void cfq_group_served(struct cfq_data *cfqd, struct cfq_group *cfqg,
|
||||
|
||||
cfq_log_cfqg(cfqd, cfqg, "served: vt=%llu min_vt=%llu", cfqg->vdisktime,
|
||||
st->min_vdisktime);
|
||||
cfq_log_cfqq(cfqq->cfqd, cfqq, "sl_used=%u disp=%u charge=%u iops=%u"
|
||||
" sect=%u", used_sl, cfqq->slice_dispatch, charge,
|
||||
iops_mode(cfqd), cfqq->nr_sectors);
|
||||
cfq_log_cfqq(cfqq->cfqd, cfqq,
|
||||
"sl_used=%u disp=%u charge=%u iops=%u sect=%lu",
|
||||
used_sl, cfqq->slice_dispatch, charge,
|
||||
iops_mode(cfqd), cfqq->nr_sectors);
|
||||
cfq_blkiocg_update_timeslice_used(&cfqg->blkg, used_sl,
|
||||
unaccounted_sl);
|
||||
cfq_blkiocg_set_start_empty_time(&cfqg->blkg);
|
||||
@ -2023,8 +2024,8 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)
|
||||
*/
|
||||
if (sample_valid(cic->ttime_samples) &&
|
||||
(cfqq->slice_end - jiffies < cic->ttime_mean)) {
|
||||
cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%d",
|
||||
cic->ttime_mean);
|
||||
cfq_log_cfqq(cfqd, cfqq, "Not idling. think_time:%lu",
|
||||
cic->ttime_mean);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -2772,8 +2773,11 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd,
|
||||
smp_wmb();
|
||||
cic->key = cfqd_dead_key(cfqd);
|
||||
|
||||
if (ioc->ioc_data == cic)
|
||||
if (rcu_dereference(ioc->ioc_data) == cic) {
|
||||
spin_lock(&ioc->lock);
|
||||
rcu_assign_pointer(ioc->ioc_data, NULL);
|
||||
spin_unlock(&ioc->lock);
|
||||
}
|
||||
|
||||
if (cic->cfqq[BLK_RW_ASYNC]) {
|
||||
cfq_exit_cfqq(cfqd, cic->cfqq[BLK_RW_ASYNC]);
|
||||
|
@ -1371,6 +1371,7 @@ struct disk_events {
|
||||
struct gendisk *disk; /* the associated disk */
|
||||
spinlock_t lock;
|
||||
|
||||
struct mutex block_mutex; /* protects blocking */
|
||||
int block; /* event blocking depth */
|
||||
unsigned int pending; /* events already sent out */
|
||||
unsigned int clearing; /* events being cleared */
|
||||
@ -1414,22 +1415,44 @@ static unsigned long disk_events_poll_jiffies(struct gendisk *disk)
|
||||
return msecs_to_jiffies(intv_msecs);
|
||||
}
|
||||
|
||||
static void __disk_block_events(struct gendisk *disk, bool sync)
|
||||
/**
|
||||
* disk_block_events - block and flush disk event checking
|
||||
* @disk: disk to block events for
|
||||
*
|
||||
* On return from this function, it is guaranteed that event checking
|
||||
* isn't in progress and won't happen until unblocked by
|
||||
* disk_unblock_events(). Events blocking is counted and the actual
|
||||
* unblocking happens after the matching number of unblocks are done.
|
||||
*
|
||||
* Note that this intentionally does not block event checking from
|
||||
* disk_clear_events().
|
||||
*
|
||||
* CONTEXT:
|
||||
* Might sleep.
|
||||
*/
|
||||
void disk_block_events(struct gendisk *disk)
|
||||
{
|
||||
struct disk_events *ev = disk->ev;
|
||||
unsigned long flags;
|
||||
bool cancel;
|
||||
|
||||
if (!ev)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Outer mutex ensures that the first blocker completes canceling
|
||||
* the event work before further blockers are allowed to finish.
|
||||
*/
|
||||
mutex_lock(&ev->block_mutex);
|
||||
|
||||
spin_lock_irqsave(&ev->lock, flags);
|
||||
cancel = !ev->block++;
|
||||
spin_unlock_irqrestore(&ev->lock, flags);
|
||||
|
||||
if (cancel) {
|
||||
if (sync)
|
||||
cancel_delayed_work_sync(&disk->ev->dwork);
|
||||
else
|
||||
cancel_delayed_work(&disk->ev->dwork);
|
||||
}
|
||||
if (cancel)
|
||||
cancel_delayed_work_sync(&disk->ev->dwork);
|
||||
|
||||
mutex_unlock(&ev->block_mutex);
|
||||
}
|
||||
|
||||
static void __disk_unblock_events(struct gendisk *disk, bool check_now)
|
||||
@ -1460,27 +1483,6 @@ out_unlock:
|
||||
spin_unlock_irqrestore(&ev->lock, flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* disk_block_events - block and flush disk event checking
|
||||
* @disk: disk to block events for
|
||||
*
|
||||
* On return from this function, it is guaranteed that event checking
|
||||
* isn't in progress and won't happen until unblocked by
|
||||
* disk_unblock_events(). Events blocking is counted and the actual
|
||||
* unblocking happens after the matching number of unblocks are done.
|
||||
*
|
||||
* Note that this intentionally does not block event checking from
|
||||
* disk_clear_events().
|
||||
*
|
||||
* CONTEXT:
|
||||
* Might sleep.
|
||||
*/
|
||||
void disk_block_events(struct gendisk *disk)
|
||||
{
|
||||
if (disk->ev)
|
||||
__disk_block_events(disk, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* disk_unblock_events - unblock disk event checking
|
||||
* @disk: disk to unblock events for
|
||||
@ -1508,10 +1510,18 @@ void disk_unblock_events(struct gendisk *disk)
|
||||
*/
|
||||
void disk_check_events(struct gendisk *disk)
|
||||
{
|
||||
if (disk->ev) {
|
||||
__disk_block_events(disk, false);
|
||||
__disk_unblock_events(disk, true);
|
||||
struct disk_events *ev = disk->ev;
|
||||
unsigned long flags;
|
||||
|
||||
if (!ev)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&ev->lock, flags);
|
||||
if (!ev->block) {
|
||||
cancel_delayed_work(&ev->dwork);
|
||||
queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
|
||||
}
|
||||
spin_unlock_irqrestore(&ev->lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(disk_check_events);
|
||||
|
||||
@ -1546,7 +1556,7 @@ unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask)
|
||||
spin_unlock_irq(&ev->lock);
|
||||
|
||||
/* uncondtionally schedule event check and wait for it to finish */
|
||||
__disk_block_events(disk, true);
|
||||
disk_block_events(disk);
|
||||
queue_delayed_work(system_nrt_wq, &ev->dwork, 0);
|
||||
flush_delayed_work(&ev->dwork);
|
||||
__disk_unblock_events(disk, false);
|
||||
@ -1664,7 +1674,7 @@ static ssize_t disk_events_poll_msecs_store(struct device *dev,
|
||||
if (intv < 0 && intv != -1)
|
||||
return -EINVAL;
|
||||
|
||||
__disk_block_events(disk, true);
|
||||
disk_block_events(disk);
|
||||
disk->ev->poll_msecs = intv;
|
||||
__disk_unblock_events(disk, true);
|
||||
|
||||
@ -1750,6 +1760,7 @@ static void disk_add_events(struct gendisk *disk)
|
||||
INIT_LIST_HEAD(&ev->node);
|
||||
ev->disk = disk;
|
||||
spin_lock_init(&ev->lock);
|
||||
mutex_init(&ev->block_mutex);
|
||||
ev->block = 1;
|
||||
ev->poll_msecs = -1;
|
||||
INIT_DELAYED_WORK(&ev->dwork, disk_events_workfn);
|
||||
@ -1770,7 +1781,7 @@ static void disk_del_events(struct gendisk *disk)
|
||||
if (!disk->ev)
|
||||
return;
|
||||
|
||||
__disk_block_events(disk, true);
|
||||
disk_block_events(disk);
|
||||
|
||||
mutex_lock(&disk_events_mutex);
|
||||
list_del_init(&disk->ev->node);
|
||||
|
@ -4143,9 +4143,9 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||
* Devices which choke on SETXFER. Applies only if both the
|
||||
* device and controller are SATA.
|
||||
*/
|
||||
{ "PIONEER DVD-RW DVRTD08", "1.00", ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-212D", "1.28", ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-216D", "1.08", ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVRTD08", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
{ "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER },
|
||||
|
||||
/* End Marker */
|
||||
{ }
|
||||
|
@ -3797,6 +3797,12 @@ EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
|
||||
*/
|
||||
int ata_sas_port_start(struct ata_port *ap)
|
||||
{
|
||||
/*
|
||||
* the port is marked as frozen at allocation time, but if we don't
|
||||
* have new eh, we won't thaw it
|
||||
*/
|
||||
if (!ap->ops->error_handler)
|
||||
ap->pflags &= ~ATA_PFLAG_FROZEN;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_start);
|
||||
|
@ -161,6 +161,9 @@ static const struct pci_device_id marvell_pci_tbl[] = {
|
||||
{ PCI_DEVICE(0x11AB, 0x6121), },
|
||||
{ PCI_DEVICE(0x11AB, 0x6123), },
|
||||
{ PCI_DEVICE(0x11AB, 0x6145), },
|
||||
{ PCI_DEVICE(0x1B4B, 0x91A0), },
|
||||
{ PCI_DEVICE(0x1B4B, 0x91A4), },
|
||||
|
||||
{ } /* terminate list */
|
||||
};
|
||||
|
||||
|
@ -389,7 +389,7 @@ static void sata_dwc_tf_dump(struct ata_taskfile *tf)
|
||||
/*
|
||||
* Function: get_burst_length_encode
|
||||
* arguments: datalength: length in bytes of data
|
||||
* returns value to be programmed in register corrresponding to data length
|
||||
* returns value to be programmed in register corresponding to data length
|
||||
* This value is effectively the log(base 2) of the length
|
||||
*/
|
||||
static int get_burst_length_encode(int datalength)
|
||||
|
@ -367,7 +367,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);
|
||||
*
|
||||
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
||||
*/
|
||||
struct platform_device *__init_or_module platform_device_register_resndata(
|
||||
struct platform_device *platform_device_register_resndata(
|
||||
struct device *parent,
|
||||
const char *name, int id,
|
||||
const struct resource *res, unsigned int num,
|
||||
|
@ -387,7 +387,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
|
||||
clknb = container_of(nb, struct pm_clk_notifier_block, nb);
|
||||
|
||||
switch (action) {
|
||||
case BUS_NOTIFY_ADD_DEVICE:
|
||||
case BUS_NOTIFY_BIND_DRIVER:
|
||||
if (clknb->con_ids[0]) {
|
||||
for (con_id = clknb->con_ids; *con_id; con_id++)
|
||||
enable_clock(dev, *con_id);
|
||||
@ -395,7 +395,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
|
||||
enable_clock(dev, NULL);
|
||||
}
|
||||
break;
|
||||
case BUS_NOTIFY_DEL_DEVICE:
|
||||
case BUS_NOTIFY_UNBOUND_DRIVER:
|
||||
if (clknb->con_ids[0]) {
|
||||
for (con_id = clknb->con_ids; *con_id; con_id++)
|
||||
disable_clock(dev, *con_id);
|
||||
|
@ -57,7 +57,8 @@ static int async_error;
|
||||
*/
|
||||
void device_pm_init(struct device *dev)
|
||||
{
|
||||
dev->power.in_suspend = false;
|
||||
dev->power.is_prepared = false;
|
||||
dev->power.is_suspended = false;
|
||||
init_completion(&dev->power.completion);
|
||||
complete_all(&dev->power.completion);
|
||||
dev->power.wakeup = NULL;
|
||||
@ -91,7 +92,7 @@ void device_pm_add(struct device *dev)
|
||||
pr_debug("PM: Adding info for %s:%s\n",
|
||||
dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
if (dev->parent && dev->parent->power.in_suspend)
|
||||
if (dev->parent && dev->parent->power.is_prepared)
|
||||
dev_warn(dev, "parent %s should not be sleeping\n",
|
||||
dev_name(dev->parent));
|
||||
list_add_tail(&dev->power.entry, &dpm_list);
|
||||
@ -511,7 +512,14 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
|
||||
dpm_wait(dev->parent, async);
|
||||
device_lock(dev);
|
||||
|
||||
dev->power.in_suspend = false;
|
||||
/*
|
||||
* This is a fib. But we'll allow new children to be added below
|
||||
* a resumed device, even if the device hasn't been completed yet.
|
||||
*/
|
||||
dev->power.is_prepared = false;
|
||||
|
||||
if (!dev->power.is_suspended)
|
||||
goto Unlock;
|
||||
|
||||
if (dev->pwr_domain) {
|
||||
pm_dev_dbg(dev, state, "power domain ");
|
||||
@ -548,6 +556,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
|
||||
}
|
||||
|
||||
End:
|
||||
dev->power.is_suspended = false;
|
||||
|
||||
Unlock:
|
||||
device_unlock(dev);
|
||||
complete_all(&dev->power.completion);
|
||||
|
||||
@ -670,7 +681,7 @@ void dpm_complete(pm_message_t state)
|
||||
struct device *dev = to_device(dpm_prepared_list.prev);
|
||||
|
||||
get_device(dev);
|
||||
dev->power.in_suspend = false;
|
||||
dev->power.is_prepared = false;
|
||||
list_move(&dev->power.entry, &list);
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
|
||||
@ -835,11 +846,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
||||
device_lock(dev);
|
||||
|
||||
if (async_error)
|
||||
goto End;
|
||||
goto Unlock;
|
||||
|
||||
if (pm_wakeup_pending()) {
|
||||
async_error = -EBUSY;
|
||||
goto End;
|
||||
goto Unlock;
|
||||
}
|
||||
|
||||
if (dev->pwr_domain) {
|
||||
@ -877,6 +888,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
||||
}
|
||||
|
||||
End:
|
||||
dev->power.is_suspended = !error;
|
||||
|
||||
Unlock:
|
||||
device_unlock(dev);
|
||||
complete_all(&dev->power.completion);
|
||||
|
||||
@ -1042,7 +1056,7 @@ int dpm_prepare(pm_message_t state)
|
||||
put_device(dev);
|
||||
break;
|
||||
}
|
||||
dev->power.in_suspend = true;
|
||||
dev->power.is_prepared = true;
|
||||
if (!list_empty(&dev->power.entry))
|
||||
list_move_tail(&dev->power.entry, &dpm_prepared_list);
|
||||
put_device(dev);
|
||||
|
@ -139,6 +139,7 @@ static int cn_call_callback(struct sk_buff *skb)
|
||||
spin_unlock_bh(&dev->cbdev->queue_lock);
|
||||
|
||||
if (cbq != NULL) {
|
||||
err = 0;
|
||||
cbq->callback(msg, nsp);
|
||||
kfree_skb(skb);
|
||||
cn_queue_release_callback(cbq);
|
||||
|
@ -13,6 +13,7 @@ menu "Google Firmware Drivers"
|
||||
config GOOGLE_SMI
|
||||
tristate "SMI interface for Google platforms"
|
||||
depends on ACPI && DMI
|
||||
select EFI
|
||||
select EFI_VARS
|
||||
help
|
||||
Say Y here if you want to enable SMI callbacks for Google
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include "drmP.h"
|
||||
|
||||
/** @file drm_gem.c
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include "i915_drv.h"
|
||||
#include "i915_trace.h"
|
||||
#include "intel_drv.h"
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/pci.h>
|
||||
@ -359,8 +360,7 @@ i915_gem_shmem_pread_fast(struct drm_device *dev,
|
||||
if ((page_offset + remain) > PAGE_SIZE)
|
||||
page_length = PAGE_SIZE - page_offset;
|
||||
|
||||
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT,
|
||||
GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
|
||||
if (IS_ERR(page))
|
||||
return PTR_ERR(page);
|
||||
|
||||
@ -463,8 +463,7 @@ i915_gem_shmem_pread_slow(struct drm_device *dev,
|
||||
if ((data_page_offset + page_length) > PAGE_SIZE)
|
||||
page_length = PAGE_SIZE - data_page_offset;
|
||||
|
||||
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT,
|
||||
GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
|
||||
if (IS_ERR(page)) {
|
||||
ret = PTR_ERR(page);
|
||||
goto out;
|
||||
@ -797,8 +796,7 @@ i915_gem_shmem_pwrite_fast(struct drm_device *dev,
|
||||
if ((page_offset + remain) > PAGE_SIZE)
|
||||
page_length = PAGE_SIZE - page_offset;
|
||||
|
||||
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT,
|
||||
GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
|
||||
if (IS_ERR(page))
|
||||
return PTR_ERR(page);
|
||||
|
||||
@ -907,8 +905,7 @@ i915_gem_shmem_pwrite_slow(struct drm_device *dev,
|
||||
if ((data_page_offset + page_length) > PAGE_SIZE)
|
||||
page_length = PAGE_SIZE - data_page_offset;
|
||||
|
||||
page = read_cache_page_gfp(mapping, offset >> PAGE_SHIFT,
|
||||
GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
page = shmem_read_mapping_page(mapping, offset >> PAGE_SHIFT);
|
||||
if (IS_ERR(page)) {
|
||||
ret = PTR_ERR(page);
|
||||
goto out;
|
||||
@ -1558,12 +1555,10 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj,
|
||||
|
||||
inode = obj->base.filp->f_path.dentry->d_inode;
|
||||
mapping = inode->i_mapping;
|
||||
gfpmask |= mapping_gfp_mask(mapping);
|
||||
|
||||
for (i = 0; i < page_count; i++) {
|
||||
page = read_cache_page_gfp(mapping, i,
|
||||
GFP_HIGHUSER |
|
||||
__GFP_COLD |
|
||||
__GFP_RECLAIMABLE |
|
||||
gfpmask);
|
||||
page = shmem_read_mapping_page_gfp(mapping, i, gfpmask);
|
||||
if (IS_ERR(page))
|
||||
goto err_pages;
|
||||
|
||||
@ -1701,13 +1696,10 @@ i915_gem_object_truncate(struct drm_i915_gem_object *obj)
|
||||
/* Our goal here is to return as much of the memory as
|
||||
* is possible back to the system as we are called from OOM.
|
||||
* To do this we must instruct the shmfs to drop all of its
|
||||
* backing pages, *now*. Here we mirror the actions taken
|
||||
* when by shmem_delete_inode() to release the backing store.
|
||||
* backing pages, *now*.
|
||||
*/
|
||||
inode = obj->base.filp->f_path.dentry->d_inode;
|
||||
truncate_inode_pages(inode->i_mapping, 0);
|
||||
if (inode->i_op->truncate_range)
|
||||
inode->i_op->truncate_range(inode, 0, (loff_t)-1);
|
||||
shmem_truncate_range(inode, 0, (loff_t)-1);
|
||||
|
||||
obj->madv = __I915_MADV_PURGED;
|
||||
}
|
||||
@ -3688,6 +3680,7 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct drm_i915_gem_object *obj;
|
||||
struct address_space *mapping;
|
||||
|
||||
obj = kzalloc(sizeof(*obj), GFP_KERNEL);
|
||||
if (obj == NULL)
|
||||
@ -3698,6 +3691,9 @@ struct drm_i915_gem_object *i915_gem_alloc_object(struct drm_device *dev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mapping = obj->base.filp->f_path.dentry->d_inode->i_mapping;
|
||||
mapping_set_gfp_mask(mapping, GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
|
||||
i915_gem_info_add_obj(dev_priv, size);
|
||||
|
||||
obj->base.write_domain = I915_GEM_DOMAIN_CPU;
|
||||
@ -4089,8 +4085,7 @@ void i915_gem_detach_phys_object(struct drm_device *dev,
|
||||
|
||||
page_count = obj->base.size / PAGE_SIZE;
|
||||
for (i = 0; i < page_count; i++) {
|
||||
struct page *page = read_cache_page_gfp(mapping, i,
|
||||
GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
struct page *page = shmem_read_mapping_page(mapping, i);
|
||||
if (!IS_ERR(page)) {
|
||||
char *dst = kmap_atomic(page);
|
||||
memcpy(dst, vaddr + i*PAGE_SIZE, PAGE_SIZE);
|
||||
@ -4151,8 +4146,7 @@ i915_gem_attach_phys_object(struct drm_device *dev,
|
||||
struct page *page;
|
||||
char *dst, *src;
|
||||
|
||||
page = read_cache_page_gfp(mapping, i,
|
||||
GFP_HIGHUSER | __GFP_RECLAIMABLE);
|
||||
page = shmem_read_mapping_page(mapping, i);
|
||||
if (IS_ERR(page))
|
||||
return PTR_ERR(page);
|
||||
|
||||
|
@ -2013,9 +2013,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev)
|
||||
rdev->config.evergreen.tile_config |= (3 << 0);
|
||||
break;
|
||||
}
|
||||
/* num banks is 8 on all fusion asics */
|
||||
/* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */
|
||||
if (rdev->flags & RADEON_IS_IGP)
|
||||
rdev->config.evergreen.tile_config |= 8 << 4;
|
||||
rdev->config.evergreen.tile_config |= 1 << 4;
|
||||
else
|
||||
rdev->config.evergreen.tile_config |=
|
||||
((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4;
|
||||
|
@ -179,6 +179,7 @@ void radeon_pm_resume(struct radeon_device *rdev);
|
||||
void radeon_combios_get_power_modes(struct radeon_device *rdev);
|
||||
void radeon_atombios_get_power_modes(struct radeon_device *rdev);
|
||||
void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 voltage_type);
|
||||
int radeon_atom_get_max_vddc(struct radeon_device *rdev, u16 *voltage);
|
||||
void rs690_pm_info(struct radeon_device *rdev);
|
||||
extern int rv6xx_get_temp(struct radeon_device *rdev);
|
||||
extern int rv770_get_temp(struct radeon_device *rdev);
|
||||
|
@ -2320,6 +2320,14 @@ static bool radeon_atombios_parse_pplib_clock_info(struct radeon_device *rdev,
|
||||
le16_to_cpu(clock_info->r600.usVDDC);
|
||||
}
|
||||
|
||||
/* patch up vddc if necessary */
|
||||
if (rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage == 0xff01) {
|
||||
u16 vddc;
|
||||
|
||||
if (radeon_atom_get_max_vddc(rdev, &vddc) == 0)
|
||||
rdev->pm.power_state[state_index].clock_info[mode_index].voltage.voltage = vddc;
|
||||
}
|
||||
|
||||
if (rdev->flags & RADEON_IS_IGP) {
|
||||
/* skip invalid modes */
|
||||
if (rdev->pm.power_state[state_index].clock_info[mode_index].sclk == 0)
|
||||
@ -2630,7 +2638,35 @@ void radeon_atom_set_voltage(struct radeon_device *rdev, u16 voltage_level, u8 v
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
}
|
||||
|
||||
int radeon_atom_get_max_vddc(struct radeon_device *rdev,
|
||||
u16 *voltage)
|
||||
{
|
||||
union set_voltage args;
|
||||
int index = GetIndexIntoMasterTable(COMMAND, SetVoltage);
|
||||
u8 frev, crev;
|
||||
|
||||
if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
|
||||
return -EINVAL;
|
||||
|
||||
switch (crev) {
|
||||
case 1:
|
||||
return -EINVAL;
|
||||
case 2:
|
||||
args.v2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE;
|
||||
args.v2.ucVoltageMode = 0;
|
||||
args.v2.usVoltageLevel = 0;
|
||||
|
||||
atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
|
||||
|
||||
*voltage = le16_to_cpu(args.v2.usVoltageLevel);
|
||||
break;
|
||||
default:
|
||||
DRM_ERROR("Unknown table version %d, %d\n", frev, crev);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
|
||||
{
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <linux/sched.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/shmem_fs.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/slab.h>
|
||||
@ -484,7 +485,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
|
||||
swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
|
||||
|
||||
for (i = 0; i < ttm->num_pages; ++i) {
|
||||
from_page = read_mapping_page(swap_space, i, NULL);
|
||||
from_page = shmem_read_mapping_page(swap_space, i);
|
||||
if (IS_ERR(from_page)) {
|
||||
ret = PTR_ERR(from_page);
|
||||
goto out_err;
|
||||
@ -557,7 +558,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
|
||||
from_page = ttm->pages[i];
|
||||
if (unlikely(from_page == NULL))
|
||||
continue;
|
||||
to_page = read_mapping_page(swap_space, i, NULL);
|
||||
to_page = shmem_read_mapping_page(swap_space, i);
|
||||
if (unlikely(IS_ERR(to_page))) {
|
||||
ret = PTR_ERR(to_page);
|
||||
goto out_err;
|
||||
|
@ -1423,6 +1423,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACETRAVELLER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_SPACENAVIGATOR) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_LUMIO, USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROCHIP, USB_DEVICE_ID_PICOLCD_BOOTLOADER) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV) },
|
||||
|
@ -449,6 +449,7 @@
|
||||
|
||||
#define USB_VENDOR_ID_LUMIO 0x202e
|
||||
#define USB_DEVICE_ID_CRYSTALTOUCH 0x0006
|
||||
#define USB_DEVICE_ID_CRYSTALTOUCH_DUAL 0x0007
|
||||
|
||||
#define USB_VENDOR_ID_MCC 0x09db
|
||||
#define USB_DEVICE_ID_MCC_PMD1024LS 0x0076
|
||||
|
@ -271,6 +271,8 @@ static int mt_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
}
|
||||
return 1;
|
||||
case HID_DG_CONTACTID:
|
||||
if (!td->maxcontacts)
|
||||
td->maxcontacts = MT_DEFAULT_MAXCONTACT;
|
||||
input_mt_init_slots(hi->input, td->maxcontacts);
|
||||
td->last_slot_field = usage->hid;
|
||||
td->last_field_index = field->index;
|
||||
@ -547,9 +549,6 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
if (ret)
|
||||
goto fail;
|
||||
|
||||
if (!td->maxcontacts)
|
||||
td->maxcontacts = MT_DEFAULT_MAXCONTACT;
|
||||
|
||||
td->slots = kzalloc(td->maxcontacts * sizeof(struct mt_slot),
|
||||
GFP_KERNEL);
|
||||
if (!td->slots) {
|
||||
@ -677,6 +676,9 @@ static const struct hid_device_id mt_devices[] = {
|
||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_LUMIO,
|
||||
USB_DEVICE_ID_CRYSTALTOUCH) },
|
||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_LUMIO,
|
||||
USB_DEVICE_ID_CRYSTALTOUCH_DUAL) },
|
||||
|
||||
/* MosArt panels */
|
||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
||||
@ -707,10 +709,10 @@ static const struct hid_device_id mt_devices[] = {
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM,
|
||||
USB_DEVICE_ID_MTP)},
|
||||
{ .driver_data = MT_CLS_CONFIDENCE,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_STM,
|
||||
USB_DEVICE_ID_MTP_STM)},
|
||||
{ .driver_data = MT_CLS_CONFIDENCE,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM,
|
||||
HID_USB_DEVICE(USB_VENDOR_ID_STANTUM_SITRONIX,
|
||||
USB_DEVICE_ID_MTP_SITRONIX)},
|
||||
|
||||
/* Touch International panels */
|
||||
|
@ -1463,9 +1463,9 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||
struct c4iw_qp_attributes attrs;
|
||||
int disconnect = 1;
|
||||
int release = 0;
|
||||
int abort = 0;
|
||||
struct tid_info *t = dev->rdev.lldi.tids;
|
||||
unsigned int tid = GET_TID(hdr);
|
||||
int ret;
|
||||
|
||||
ep = lookup_tid(t, tid);
|
||||
PDBG("%s ep %p tid %u\n", __func__, ep, ep->hwtid);
|
||||
@ -1501,10 +1501,12 @@ static int peer_close(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||
start_ep_timer(ep);
|
||||
__state_set(&ep->com, CLOSING);
|
||||
attrs.next_state = C4IW_QP_STATE_CLOSING;
|
||||
abort = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,
|
||||
ret = c4iw_modify_qp(ep->com.qp->rhp, ep->com.qp,
|
||||
C4IW_QP_ATTR_NEXT_STATE, &attrs, 1);
|
||||
peer_close_upcall(ep);
|
||||
disconnect = 1;
|
||||
if (ret != -ECONNRESET) {
|
||||
peer_close_upcall(ep);
|
||||
disconnect = 1;
|
||||
}
|
||||
break;
|
||||
case ABORTING:
|
||||
disconnect = 0;
|
||||
@ -2109,15 +2111,16 @@ int c4iw_ep_disconnect(struct c4iw_ep *ep, int abrupt, gfp_t gfp)
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&ep->com.mutex);
|
||||
if (close) {
|
||||
if (abrupt)
|
||||
ret = abort_connection(ep, NULL, gfp);
|
||||
else
|
||||
if (abrupt) {
|
||||
close_complete_upcall(ep);
|
||||
ret = send_abort(ep, NULL, gfp);
|
||||
} else
|
||||
ret = send_halfclose(ep, gfp);
|
||||
if (ret)
|
||||
fatal = 1;
|
||||
}
|
||||
mutex_unlock(&ep->com.mutex);
|
||||
if (fatal)
|
||||
release_ep_resources(ep);
|
||||
return ret;
|
||||
@ -2301,6 +2304,31 @@ static int fw6_msg(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int peer_abort_intr(struct c4iw_dev *dev, struct sk_buff *skb)
|
||||
{
|
||||
struct cpl_abort_req_rss *req = cplhdr(skb);
|
||||
struct c4iw_ep *ep;
|
||||
struct tid_info *t = dev->rdev.lldi.tids;
|
||||
unsigned int tid = GET_TID(req);
|
||||
|
||||
ep = lookup_tid(t, tid);
|
||||
if (is_neg_adv_abort(req->status)) {
|
||||
PDBG("%s neg_adv_abort ep %p tid %u\n", __func__, ep,
|
||||
ep->hwtid);
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
PDBG("%s ep %p tid %u state %u\n", __func__, ep, ep->hwtid,
|
||||
ep->com.state);
|
||||
|
||||
/*
|
||||
* Wake up any threads in rdma_init() or rdma_fini().
|
||||
*/
|
||||
c4iw_wake_up(&ep->com.wr_wait, -ECONNRESET);
|
||||
sched(dev, skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Most upcalls from the T4 Core go to sched() to
|
||||
* schedule the processing on a work queue.
|
||||
@ -2317,7 +2345,7 @@ c4iw_handler_func c4iw_handlers[NUM_CPL_CMDS] = {
|
||||
[CPL_PASS_ESTABLISH] = sched,
|
||||
[CPL_PEER_CLOSE] = sched,
|
||||
[CPL_CLOSE_CON_RPL] = sched,
|
||||
[CPL_ABORT_REQ_RSS] = sched,
|
||||
[CPL_ABORT_REQ_RSS] = peer_abort_intr,
|
||||
[CPL_RDMA_TERMINATE] = sched,
|
||||
[CPL_FW4_ACK] = sched,
|
||||
[CPL_SET_TCB_RPL] = set_tcb_rpl,
|
||||
|
@ -801,6 +801,10 @@ struct ib_cq *c4iw_create_cq(struct ib_device *ibdev, int entries,
|
||||
if (ucontext) {
|
||||
memsize = roundup(memsize, PAGE_SIZE);
|
||||
hwentries = memsize / sizeof *chp->cq.queue;
|
||||
while (hwentries > T4_MAX_IQ_SIZE) {
|
||||
memsize -= PAGE_SIZE;
|
||||
hwentries = memsize / sizeof *chp->cq.queue;
|
||||
}
|
||||
}
|
||||
chp->cq.size = hwentries;
|
||||
chp->cq.memsize = memsize;
|
||||
|
@ -625,7 +625,7 @@ pbl_done:
|
||||
mhp->attr.perms = c4iw_ib_to_tpt_access(acc);
|
||||
mhp->attr.va_fbo = virt;
|
||||
mhp->attr.page_size = shift - 12;
|
||||
mhp->attr.len = (u32) length;
|
||||
mhp->attr.len = length;
|
||||
|
||||
err = register_mem(rhp, php, mhp, shift);
|
||||
if (err)
|
||||
|
@ -1207,11 +1207,8 @@ int c4iw_modify_qp(struct c4iw_dev *rhp, struct c4iw_qp *qhp,
|
||||
c4iw_get_ep(&qhp->ep->com);
|
||||
}
|
||||
ret = rdma_fini(rhp, qhp, ep);
|
||||
if (ret) {
|
||||
if (internal)
|
||||
c4iw_get_ep(&qhp->ep->com);
|
||||
if (ret)
|
||||
goto err;
|
||||
}
|
||||
break;
|
||||
case C4IW_QP_STATE_TERMINATE:
|
||||
set_state(qhp, C4IW_QP_STATE_TERMINATE);
|
||||
|
@ -469,6 +469,8 @@ static u8 ib_rate_to_delay[IB_RATE_120_GBPS + 1] = {
|
||||
#define IB_7322_LT_STATE_RECOVERIDLE 0x0f
|
||||
#define IB_7322_LT_STATE_CFGENH 0x10
|
||||
#define IB_7322_LT_STATE_CFGTEST 0x11
|
||||
#define IB_7322_LT_STATE_CFGWAITRMTTEST 0x12
|
||||
#define IB_7322_LT_STATE_CFGWAITENH 0x13
|
||||
|
||||
/* link state machine states from IBC */
|
||||
#define IB_7322_L_STATE_DOWN 0x0
|
||||
@ -498,8 +500,10 @@ static const u8 qib_7322_physportstate[0x20] = {
|
||||
IB_PHYSPORTSTATE_LINK_ERR_RECOVER,
|
||||
[IB_7322_LT_STATE_CFGENH] = IB_PHYSPORTSTATE_CFG_ENH,
|
||||
[IB_7322_LT_STATE_CFGTEST] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
||||
[0x12] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
||||
[0x13] = IB_PHYSPORTSTATE_CFG_WAIT_ENH,
|
||||
[IB_7322_LT_STATE_CFGWAITRMTTEST] =
|
||||
IB_PHYSPORTSTATE_CFG_TRAIN,
|
||||
[IB_7322_LT_STATE_CFGWAITENH] =
|
||||
IB_PHYSPORTSTATE_CFG_WAIT_ENH,
|
||||
[0x14] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
||||
[0x15] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
||||
[0x16] = IB_PHYSPORTSTATE_CFG_TRAIN,
|
||||
@ -1692,7 +1696,9 @@ static void handle_serdes_issues(struct qib_pportdata *ppd, u64 ibcst)
|
||||
break;
|
||||
}
|
||||
|
||||
if (ibclt == IB_7322_LT_STATE_CFGTEST &&
|
||||
if (((ibclt >= IB_7322_LT_STATE_CFGTEST &&
|
||||
ibclt <= IB_7322_LT_STATE_CFGWAITENH) ||
|
||||
ibclt == IB_7322_LT_STATE_LINKUP) &&
|
||||
(ibcst & SYM_MASK(IBCStatusA_0, LinkSpeedQDR))) {
|
||||
force_h1(ppd);
|
||||
ppd->cpspec->qdr_reforce = 1;
|
||||
@ -7301,12 +7307,17 @@ static void ibsd_wr_allchans(struct qib_pportdata *ppd, int addr, unsigned data,
|
||||
static void serdes_7322_los_enable(struct qib_pportdata *ppd, int enable)
|
||||
{
|
||||
u64 data = qib_read_kreg_port(ppd, krp_serdesctrl);
|
||||
printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS %s\n",
|
||||
ppd->dd->unit, ppd->port, (enable ? "on" : "off"));
|
||||
if (enable)
|
||||
u8 state = SYM_FIELD(data, IBSerdesCtrl_0, RXLOSEN);
|
||||
|
||||
if (enable && !state) {
|
||||
printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS on\n",
|
||||
ppd->dd->unit, ppd->port);
|
||||
data |= SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
|
||||
else
|
||||
} else if (!enable && state) {
|
||||
printk(KERN_INFO QIB_DRV_NAME " IB%u:%u Turning LOS off\n",
|
||||
ppd->dd->unit, ppd->port);
|
||||
data &= ~SYM_MASK(IBSerdesCtrl_0, RXLOSEN);
|
||||
}
|
||||
qib_write_kreg_port(ppd, krp_serdesctrl, data);
|
||||
}
|
||||
|
||||
|
@ -96,8 +96,12 @@ void qib_handle_e_ibstatuschanged(struct qib_pportdata *ppd, u64 ibcs)
|
||||
* states, or if it transitions from any of the up (INIT or better)
|
||||
* states into any of the down states (except link recovery), then
|
||||
* call the chip-specific code to take appropriate actions.
|
||||
*
|
||||
* ppd->lflags could be 0 if this is the first time the interrupt
|
||||
* handlers has been called but the link is already up.
|
||||
*/
|
||||
if (lstate >= IB_PORT_INIT && (ppd->lflags & QIBL_LINKDOWN) &&
|
||||
if (lstate >= IB_PORT_INIT &&
|
||||
(!ppd->lflags || (ppd->lflags & QIBL_LINKDOWN)) &&
|
||||
ltstate == IB_PHYSPORTSTATE_LINKUP) {
|
||||
/* transitioned to UP */
|
||||
if (dd->f_ib_updown(ppd, 1, ibcs))
|
||||
|
@ -593,7 +593,7 @@ static void lp5521_unregister_sysfs(struct i2c_client *client)
|
||||
&lp5521_led_attribute_group);
|
||||
}
|
||||
|
||||
static int __init lp5521_init_led(struct lp5521_led *led,
|
||||
static int __devinit lp5521_init_led(struct lp5521_led *led,
|
||||
struct i2c_client *client,
|
||||
int chan, struct lp5521_platform_data *pdata)
|
||||
{
|
||||
@ -637,7 +637,7 @@ static int __init lp5521_init_led(struct lp5521_led *led,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lp5521_probe(struct i2c_client *client,
|
||||
static int __devinit lp5521_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct lp5521_chip *chip;
|
||||
|
@ -826,7 +826,7 @@ static int __init lp5523_init_engine(struct lp5523_engine *engine, int id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev,
|
||||
static int __devinit lp5523_init_led(struct lp5523_led *led, struct device *dev,
|
||||
int chan, struct lp5523_platform_data *pdata)
|
||||
{
|
||||
char name[32];
|
||||
@ -872,7 +872,7 @@ static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev,
|
||||
|
||||
static struct i2c_driver lp5523_driver;
|
||||
|
||||
static int lp5523_probe(struct i2c_client *client,
|
||||
static int __devinit lp5523_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct lp5523_chip *chip;
|
||||
|
@ -7088,6 +7088,7 @@ static int remove_and_add_spares(mddev_t *mddev)
|
||||
list_for_each_entry(rdev, &mddev->disks, same_set) {
|
||||
if (rdev->raid_disk >= 0 &&
|
||||
!test_bit(In_sync, &rdev->flags) &&
|
||||
!test_bit(Faulty, &rdev->flags) &&
|
||||
!test_bit(Blocked, &rdev->flags))
|
||||
spares++;
|
||||
if (rdev->raid_disk < 0
|
||||
|
@ -47,7 +47,7 @@ static uint32_t sg_dwiter_read_buffer(struct sg_mapping_iter *miter)
|
||||
|
||||
static inline bool needs_unaligned_copy(const void *ptr)
|
||||
{
|
||||
#ifdef HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||
return false;
|
||||
#else
|
||||
return ((ptr - NULL) & 3) != 0;
|
||||
|
@ -270,7 +270,7 @@ ioc4_variant(struct ioc4_driver_data *idd)
|
||||
return IOC4_VARIANT_PCI_RT;
|
||||
}
|
||||
|
||||
static void __devinit
|
||||
static void
|
||||
ioc4_load_modules(struct work_struct *work)
|
||||
{
|
||||
request_module("sgiioc4");
|
||||
|
@ -120,6 +120,7 @@ static int recur_count = REC_NUM_DEFAULT;
|
||||
static enum cname cpoint = CN_INVALID;
|
||||
static enum ctype cptype = CT_NONE;
|
||||
static int count = DEFAULT_COUNT;
|
||||
static DEFINE_SPINLOCK(count_lock);
|
||||
|
||||
module_param(recur_count, int, 0644);
|
||||
MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, "\
|
||||
@ -230,11 +231,14 @@ static const char *cp_name_to_str(enum cname name)
|
||||
static int lkdtm_parse_commandline(void)
|
||||
{
|
||||
int i;
|
||||
unsigned long flags;
|
||||
|
||||
if (cpoint_count < 1 || recur_count < 1)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&count_lock, flags);
|
||||
count = cpoint_count;
|
||||
spin_unlock_irqrestore(&count_lock, flags);
|
||||
|
||||
/* No special parameters */
|
||||
if (!cpoint_type && !cpoint_name)
|
||||
@ -349,6 +353,9 @@ static void lkdtm_do_action(enum ctype which)
|
||||
|
||||
static void lkdtm_handler(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&count_lock, flags);
|
||||
count--;
|
||||
printk(KERN_INFO "lkdtm: Crash point %s of type %s hit, trigger in %d rounds\n",
|
||||
cp_name_to_str(cpoint), cp_type_to_str(cptype), count);
|
||||
@ -357,6 +364,7 @@ static void lkdtm_handler(void)
|
||||
lkdtm_do_action(cptype);
|
||||
count = cpoint_count;
|
||||
}
|
||||
spin_unlock_irqrestore(&count_lock, flags);
|
||||
}
|
||||
|
||||
static int lkdtm_register_cpoint(enum cname which)
|
||||
|
@ -317,7 +317,8 @@ EXPORT_SYMBOL_GPL(pti_request_masterchannel);
|
||||
* a master, channel ID address
|
||||
* used to write to PTI HW.
|
||||
*
|
||||
* @mc: master, channel apeture ID address to be released.
|
||||
* @mc: master, channel apeture ID address to be released. This
|
||||
* will de-allocate the structure via kfree().
|
||||
*/
|
||||
void pti_release_masterchannel(struct pti_masterchannel *mc)
|
||||
{
|
||||
@ -475,8 +476,10 @@ static int pti_tty_install(struct tty_driver *driver, struct tty_struct *tty)
|
||||
else
|
||||
pti_tty_data->mc = pti_request_masterchannel(2);
|
||||
|
||||
if (pti_tty_data->mc == NULL)
|
||||
if (pti_tty_data->mc == NULL) {
|
||||
kfree(pti_tty_data);
|
||||
return -ENXIO;
|
||||
}
|
||||
tty->driver_data = pti_tty_data;
|
||||
}
|
||||
|
||||
@ -495,7 +498,7 @@ static void pti_tty_cleanup(struct tty_struct *tty)
|
||||
if (pti_tty_data == NULL)
|
||||
return;
|
||||
pti_release_masterchannel(pti_tty_data->mc);
|
||||
kfree(tty->driver_data);
|
||||
kfree(pti_tty_data);
|
||||
tty->driver_data = NULL;
|
||||
}
|
||||
|
||||
@ -581,7 +584,7 @@ static int pti_char_open(struct inode *inode, struct file *filp)
|
||||
static int pti_char_release(struct inode *inode, struct file *filp)
|
||||
{
|
||||
pti_release_masterchannel(filp->private_data);
|
||||
kfree(filp->private_data);
|
||||
filp->private_data = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -605,7 +605,7 @@ long st_unregister(struct st_proto_s *proto)
|
||||
pr_debug("%s: %d ", __func__, proto->chnl_id);
|
||||
|
||||
st_kim_ref(&st_gdata, 0);
|
||||
if (proto->chnl_id >= ST_MAX_CHANNELS) {
|
||||
if (!st_gdata || proto->chnl_id >= ST_MAX_CHANNELS) {
|
||||
pr_err(" chnl_id %d not supported", proto->chnl_id);
|
||||
return -EPROTONOSUPPORT;
|
||||
}
|
||||
|
@ -245,9 +245,9 @@ void skip_change_remote_baud(unsigned char **ptr, long *len)
|
||||
pr_err("invalid action after change remote baud command");
|
||||
} else {
|
||||
*ptr = *ptr + sizeof(struct bts_action) +
|
||||
((struct bts_action *)nxt_action)->size;
|
||||
((struct bts_action *)cur_action)->size;
|
||||
*len = *len - (sizeof(struct bts_action) +
|
||||
((struct bts_action *)nxt_action)->size);
|
||||
((struct bts_action *)cur_action)->size);
|
||||
/* warn user on not commenting these in firmware */
|
||||
pr_warn("skipping the wait event of change remote baud");
|
||||
}
|
||||
@ -604,6 +604,10 @@ void st_kim_ref(struct st_data_s **core_data, int id)
|
||||
struct kim_data_s *kim_gdata;
|
||||
/* get kim_gdata reference from platform device */
|
||||
pdev = st_get_plat_device(id);
|
||||
if (!pdev) {
|
||||
*core_data = NULL;
|
||||
return;
|
||||
}
|
||||
kim_gdata = dev_get_drvdata(&pdev->dev);
|
||||
*core_data = kim_gdata->core_data;
|
||||
}
|
||||
|
@ -1024,7 +1024,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
|
||||
INIT_LIST_HEAD(&md->part);
|
||||
md->usage = 1;
|
||||
|
||||
ret = mmc_init_queue(&md->queue, card, &md->lock);
|
||||
ret = mmc_init_queue(&md->queue, card, &md->lock, subname);
|
||||
if (ret)
|
||||
goto err_putdisk;
|
||||
|
||||
@ -1297,6 +1297,9 @@ static void mmc_blk_remove(struct mmc_card *card)
|
||||
struct mmc_blk_data *md = mmc_get_drvdata(card);
|
||||
|
||||
mmc_blk_remove_parts(card, md);
|
||||
mmc_claim_host(card->host);
|
||||
mmc_blk_part_switch(card, md);
|
||||
mmc_release_host(card->host);
|
||||
mmc_blk_remove_req(md);
|
||||
mmc_set_drvdata(card, NULL);
|
||||
}
|
||||
|
@ -106,10 +106,12 @@ static void mmc_request(struct request_queue *q)
|
||||
* @mq: mmc queue
|
||||
* @card: mmc card to attach this queue
|
||||
* @lock: queue lock
|
||||
* @subname: partition subname
|
||||
*
|
||||
* Initialise a MMC card request queue.
|
||||
*/
|
||||
int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock)
|
||||
int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card,
|
||||
spinlock_t *lock, const char *subname)
|
||||
{
|
||||
struct mmc_host *host = card->host;
|
||||
u64 limit = BLK_BOUNCE_HIGH;
|
||||
@ -133,12 +135,7 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
|
||||
mq->queue->limits.max_discard_sectors = UINT_MAX;
|
||||
if (card->erased_byte == 0)
|
||||
mq->queue->limits.discard_zeroes_data = 1;
|
||||
if (!mmc_can_trim(card) && is_power_of_2(card->erase_size)) {
|
||||
mq->queue->limits.discard_granularity =
|
||||
card->erase_size << 9;
|
||||
mq->queue->limits.discard_alignment =
|
||||
card->erase_size << 9;
|
||||
}
|
||||
mq->queue->limits.discard_granularity = card->pref_erase << 9;
|
||||
if (mmc_can_secure_erase_trim(card))
|
||||
queue_flag_set_unlocked(QUEUE_FLAG_SECDISCARD,
|
||||
mq->queue);
|
||||
@ -209,8 +206,8 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card, spinlock_t *lock
|
||||
|
||||
sema_init(&mq->thread_sem, 1);
|
||||
|
||||
mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd/%d",
|
||||
host->index);
|
||||
mq->thread = kthread_run(mmc_queue_thread, mq, "mmcqd/%d%s",
|
||||
host->index, subname ? subname : "");
|
||||
|
||||
if (IS_ERR(mq->thread)) {
|
||||
ret = PTR_ERR(mq->thread);
|
||||
|
@ -19,7 +19,8 @@ struct mmc_queue {
|
||||
unsigned int bounce_sg_len;
|
||||
};
|
||||
|
||||
extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *);
|
||||
extern int mmc_init_queue(struct mmc_queue *, struct mmc_card *, spinlock_t *,
|
||||
const char *);
|
||||
extern void mmc_cleanup_queue(struct mmc_queue *);
|
||||
extern void mmc_queue_suspend(struct mmc_queue *);
|
||||
extern void mmc_queue_resume(struct mmc_queue *);
|
||||
|
@ -1245,7 +1245,7 @@ static unsigned int mmc_mmc_erase_timeout(struct mmc_card *card,
|
||||
*/
|
||||
timeout_clks <<= 1;
|
||||
timeout_us += (timeout_clks * 1000) /
|
||||
(card->host->ios.clock / 1000);
|
||||
(mmc_host_clk_rate(card->host) / 1000);
|
||||
|
||||
erase_timeout = timeout_us / 1000;
|
||||
|
||||
|
@ -691,15 +691,54 @@ static int mmc_sdio_resume(struct mmc_host *host)
|
||||
static int mmc_sdio_power_restore(struct mmc_host *host)
|
||||
{
|
||||
int ret;
|
||||
u32 ocr;
|
||||
|
||||
BUG_ON(!host);
|
||||
BUG_ON(!host->card);
|
||||
|
||||
mmc_claim_host(host);
|
||||
|
||||
/*
|
||||
* Reset the card by performing the same steps that are taken by
|
||||
* mmc_rescan_try_freq() and mmc_attach_sdio() during a "normal" probe.
|
||||
*
|
||||
* sdio_reset() is technically not needed. Having just powered up the
|
||||
* hardware, it should already be in reset state. However, some
|
||||
* platforms (such as SD8686 on OLPC) do not instantly cut power,
|
||||
* meaning that a reset is required when restoring power soon after
|
||||
* powering off. It is harmless in other cases.
|
||||
*
|
||||
* The CMD5 reset (mmc_send_io_op_cond()), according to the SDIO spec,
|
||||
* is not necessary for non-removable cards. However, it is required
|
||||
* for OLPC SD8686 (which expects a [CMD5,5,3,7] init sequence), and
|
||||
* harmless in other situations.
|
||||
*
|
||||
* With these steps taken, mmc_select_voltage() is also required to
|
||||
* restore the correct voltage setting of the card.
|
||||
*/
|
||||
sdio_reset(host);
|
||||
mmc_go_idle(host);
|
||||
mmc_send_if_cond(host, host->ocr_avail);
|
||||
|
||||
ret = mmc_send_io_op_cond(host, 0, &ocr);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
if (host->ocr_avail_sdio)
|
||||
host->ocr_avail = host->ocr_avail_sdio;
|
||||
|
||||
host->ocr = mmc_select_voltage(host, ocr & ~0x7F);
|
||||
if (!host->ocr) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = mmc_sdio_init_card(host, host->ocr, host->card,
|
||||
mmc_card_keep_power(host));
|
||||
if (!ret && host->sdio_irqs)
|
||||
mmc_signal_sdio_irq(host);
|
||||
|
||||
out:
|
||||
mmc_release_host(host);
|
||||
|
||||
return ret;
|
||||
|
@ -189,7 +189,7 @@ static int sdio_bus_remove(struct device *dev)
|
||||
|
||||
/* Then undo the runtime PM settings in sdio_bus_probe() */
|
||||
if (func->card->host->caps & MMC_CAP_POWER_OFF_CARD)
|
||||
pm_runtime_put_noidle(dev);
|
||||
pm_runtime_put_sync(dev);
|
||||
|
||||
out:
|
||||
return ret;
|
||||
|
@ -25,6 +25,11 @@
|
||||
#include <linux/mmc/core.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
/* For archs that don't support NO_IRQ (such as mips), provide a dummy value */
|
||||
#ifndef NO_IRQ
|
||||
#define NO_IRQ 0
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
enum {
|
||||
|
@ -429,7 +429,6 @@ static int omap_hsmmc_reg_get(struct omap_hsmmc_host *host)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
mmc_slot(host).ocr_mask = mmc_regulator_get_ocrmask(reg);
|
||||
|
||||
/* Allow an aux regulator */
|
||||
reg = regulator_get(host->dev, "vmmc_aux");
|
||||
@ -962,7 +961,8 @@ static void omap_hsmmc_dma_cleanup(struct omap_hsmmc_host *host, int errno)
|
||||
spin_unlock(&host->irq_lock);
|
||||
|
||||
if (host->use_dma && dma_ch != -1) {
|
||||
dma_unmap_sg(mmc_dev(host->mmc), host->data->sg, host->dma_len,
|
||||
dma_unmap_sg(mmc_dev(host->mmc), host->data->sg,
|
||||
host->data->sg_len,
|
||||
omap_hsmmc_get_dma_dir(host, host->data));
|
||||
omap_free_dma(dma_ch);
|
||||
}
|
||||
@ -1346,7 +1346,7 @@ static void omap_hsmmc_dma_cb(int lch, u16 ch_status, void *cb_data)
|
||||
return;
|
||||
}
|
||||
|
||||
dma_unmap_sg(mmc_dev(host->mmc), data->sg, host->dma_len,
|
||||
dma_unmap_sg(mmc_dev(host->mmc), data->sg, data->sg_len,
|
||||
omap_hsmmc_get_dma_dir(host, data));
|
||||
|
||||
req_in_progress = host->req_in_progress;
|
||||
|
@ -92,7 +92,7 @@ static int __devinit sh_mobile_sdhi_probe(struct platform_device *pdev)
|
||||
mmc_data->ocr_mask = p->tmio_ocr_mask;
|
||||
mmc_data->capabilities |= p->tmio_caps;
|
||||
|
||||
if (p->dma_slave_tx >= 0 && p->dma_slave_rx >= 0) {
|
||||
if (p->dma_slave_tx > 0 && p->dma_slave_rx > 0) {
|
||||
priv->param_tx.slave_id = p->dma_slave_tx;
|
||||
priv->param_rx.slave_id = p->dma_slave_rx;
|
||||
priv->dma_priv.chan_priv_tx = &priv->param_tx;
|
||||
@ -165,13 +165,14 @@ static int sh_mobile_sdhi_remove(struct platform_device *pdev)
|
||||
|
||||
p->pdata = NULL;
|
||||
|
||||
tmio_mmc_host_remove(host);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
irq = platform_get_irq(pdev, i);
|
||||
if (irq >= 0)
|
||||
free_irq(irq, host);
|
||||
}
|
||||
|
||||
tmio_mmc_host_remove(host);
|
||||
clk_disable(priv->clk);
|
||||
clk_put(priv->clk);
|
||||
kfree(priv);
|
||||
|
@ -824,8 +824,8 @@ static int tmio_mmc_get_ro(struct mmc_host *mmc)
|
||||
struct tmio_mmc_host *host = mmc_priv(mmc);
|
||||
struct tmio_mmc_data *pdata = host->pdata;
|
||||
|
||||
return ((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) ||
|
||||
!(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT));
|
||||
return !((pdata->flags & TMIO_MMC_WRPROTECT_DISABLE) ||
|
||||
(sd_ctrl_read32(host, CTL_STATUS) & TMIO_STAT_WRPROTECT));
|
||||
}
|
||||
|
||||
static int tmio_mmc_get_cd(struct mmc_host *mmc)
|
||||
|
@ -2096,7 +2096,7 @@ static struct mmc_host_ops vub300_mmc_ops = {
|
||||
static int vub300_probe(struct usb_interface *interface,
|
||||
const struct usb_device_id *id)
|
||||
{ /* NOT irq */
|
||||
struct vub300_mmc_host *vub300 = NULL;
|
||||
struct vub300_mmc_host *vub300;
|
||||
struct usb_host_interface *iface_desc;
|
||||
struct usb_device *udev = usb_get_dev(interface_to_usbdev(interface));
|
||||
int i;
|
||||
@ -2118,23 +2118,20 @@ static int vub300_probe(struct usb_interface *interface,
|
||||
command_out_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!command_out_urb) {
|
||||
retval = -ENOMEM;
|
||||
dev_err(&vub300->udev->dev,
|
||||
"not enough memory for the command_out_urb\n");
|
||||
dev_err(&udev->dev, "not enough memory for command_out_urb\n");
|
||||
goto error0;
|
||||
}
|
||||
command_res_urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
if (!command_res_urb) {
|
||||
retval = -ENOMEM;
|
||||
dev_err(&vub300->udev->dev,
|
||||
"not enough memory for the command_res_urb\n");
|
||||
dev_err(&udev->dev, "not enough memory for command_res_urb\n");
|
||||
goto error1;
|
||||
}
|
||||
/* this also allocates memory for our VUB300 mmc host device */
|
||||
mmc = mmc_alloc_host(sizeof(struct vub300_mmc_host), &udev->dev);
|
||||
if (!mmc) {
|
||||
retval = -ENOMEM;
|
||||
dev_err(&vub300->udev->dev,
|
||||
"not enough memory for the mmc_host\n");
|
||||
dev_err(&udev->dev, "not enough memory for the mmc_host\n");
|
||||
goto error4;
|
||||
}
|
||||
/* MMC core transfer sizes tunable parameters */
|
||||
|
@ -624,7 +624,7 @@ static int pci_pm_prepare(struct device *dev)
|
||||
* system from the sleep state, we'll have to prevent it from signaling
|
||||
* wake-up.
|
||||
*/
|
||||
pm_runtime_resume(dev);
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
if (drv && drv->pm && drv->pm->prepare)
|
||||
error = drv->pm->prepare(dev);
|
||||
@ -638,6 +638,8 @@ static void pci_pm_complete(struct device *dev)
|
||||
|
||||
if (drv && drv->pm && drv->pm->complete)
|
||||
drv->pm->complete(dev);
|
||||
|
||||
pm_runtime_put_sync(dev);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_PM_SLEEP */
|
||||
|
@ -3284,7 +3284,7 @@ static int pci_set_vga_state_arch(struct pci_dev *dev, bool decode,
|
||||
* @dev: the PCI device
|
||||
* @decode: true = enable decoding, false = disable decoding
|
||||
* @command_bits: PCI_COMMAND_IO and/or PCI_COMMAND_MEMORY
|
||||
* @change_bridge_flags: traverse ancestors and change bridges
|
||||
* @flags: traverse ancestors and change bridges
|
||||
* CHANGE_BRIDGE_ONLY / CHANGE_BRIDGE
|
||||
*/
|
||||
int pci_set_vga_state(struct pci_dev *dev, bool decode,
|
||||
|
@ -168,7 +168,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
|
||||
res->flags |= pci_calc_resource_flags(l) | IORESOURCE_SIZEALIGN;
|
||||
if (type == pci_bar_io) {
|
||||
l &= PCI_BASE_ADDRESS_IO_MASK;
|
||||
mask = PCI_BASE_ADDRESS_IO_MASK & IO_SPACE_LIMIT;
|
||||
mask = PCI_BASE_ADDRESS_IO_MASK & (u32) IO_SPACE_LIMIT;
|
||||
} else {
|
||||
l &= PCI_BASE_ADDRESS_MEM_MASK;
|
||||
mask = (u32)PCI_BASE_ADDRESS_MEM_MASK;
|
||||
|
@ -2761,6 +2761,8 @@ static void ricoh_mmc_fixup_r5c832(struct pci_dev *dev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
|
||||
DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5C832, ricoh_mmc_fixup_r5c832);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
|
||||
DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_RICOH, PCI_DEVICE_ID_RICOH_R5CE823, ricoh_mmc_fixup_r5c832);
|
||||
#endif /*CONFIG_MMC_RICOH_MMC*/
|
||||
|
||||
#if defined(CONFIG_DMAR) || defined(CONFIG_INTR_REMAP)
|
||||
|
@ -149,6 +149,7 @@ static const struct i2c_device_id ds1307_id[] = {
|
||||
{ "ds1340", ds_1340 },
|
||||
{ "ds3231", ds_3231 },
|
||||
{ "m41t00", m41t00 },
|
||||
{ "pt7c4338", ds_1307 },
|
||||
{ "rx8025", rx_8025 },
|
||||
{ }
|
||||
};
|
||||
|
@ -78,7 +78,6 @@ struct vt8500_rtc {
|
||||
void __iomem *regbase;
|
||||
struct resource *res;
|
||||
int irq_alarm;
|
||||
int irq_hz;
|
||||
struct rtc_device *rtc;
|
||||
spinlock_t lock; /* Protects this structure */
|
||||
};
|
||||
@ -100,10 +99,6 @@ static irqreturn_t vt8500_rtc_irq(int irq, void *dev_id)
|
||||
if (isr & 1)
|
||||
events |= RTC_AF | RTC_IRQF;
|
||||
|
||||
/* Only second/minute interrupts are supported */
|
||||
if (isr & 2)
|
||||
events |= RTC_UF | RTC_IRQF;
|
||||
|
||||
rtc_update_irq(vt8500_rtc->rtc, 1, events);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@ -199,27 +194,12 @@ static int vt8500_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vt8500_update_irq_enable(struct device *dev, unsigned int enabled)
|
||||
{
|
||||
struct vt8500_rtc *vt8500_rtc = dev_get_drvdata(dev);
|
||||
unsigned long tmp = readl(vt8500_rtc->regbase + VT8500_RTC_CR);
|
||||
|
||||
if (enabled)
|
||||
tmp |= VT8500_RTC_CR_SM_SEC | VT8500_RTC_CR_SM_ENABLE;
|
||||
else
|
||||
tmp &= ~VT8500_RTC_CR_SM_ENABLE;
|
||||
|
||||
writel(tmp, vt8500_rtc->regbase + VT8500_RTC_CR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops vt8500_rtc_ops = {
|
||||
.read_time = vt8500_rtc_read_time,
|
||||
.set_time = vt8500_rtc_set_time,
|
||||
.read_alarm = vt8500_rtc_read_alarm,
|
||||
.set_alarm = vt8500_rtc_set_alarm,
|
||||
.alarm_irq_enable = vt8500_alarm_irq_enable,
|
||||
.update_irq_enable = vt8500_update_irq_enable,
|
||||
};
|
||||
|
||||
static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
|
||||
@ -248,13 +228,6 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
vt8500_rtc->irq_hz = platform_get_irq(pdev, 1);
|
||||
if (vt8500_rtc->irq_hz < 0) {
|
||||
dev_err(&pdev->dev, "No 1Hz IRQ resource defined\n");
|
||||
ret = -ENXIO;
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
vt8500_rtc->res = request_mem_region(vt8500_rtc->res->start,
|
||||
resource_size(vt8500_rtc->res),
|
||||
"vt8500-rtc");
|
||||
@ -272,9 +245,8 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
|
||||
goto err_release;
|
||||
}
|
||||
|
||||
/* Enable the second/minute interrupt generation and enable RTC */
|
||||
writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H
|
||||
| VT8500_RTC_CR_SM_ENABLE | VT8500_RTC_CR_SM_SEC,
|
||||
/* Enable RTC and set it to 24-hour mode */
|
||||
writel(VT8500_RTC_CR_ENABLE | VT8500_RTC_CR_24H,
|
||||
vt8500_rtc->regbase + VT8500_RTC_CR);
|
||||
|
||||
vt8500_rtc->rtc = rtc_device_register("vt8500-rtc", &pdev->dev,
|
||||
@ -286,26 +258,16 @@ static int __devinit vt8500_rtc_probe(struct platform_device *pdev)
|
||||
goto err_unmap;
|
||||
}
|
||||
|
||||
ret = request_irq(vt8500_rtc->irq_hz, vt8500_rtc_irq, 0,
|
||||
"rtc 1Hz", vt8500_rtc);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "can't get irq %i, err %d\n",
|
||||
vt8500_rtc->irq_hz, ret);
|
||||
goto err_unreg;
|
||||
}
|
||||
|
||||
ret = request_irq(vt8500_rtc->irq_alarm, vt8500_rtc_irq, 0,
|
||||
"rtc alarm", vt8500_rtc);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "can't get irq %i, err %d\n",
|
||||
vt8500_rtc->irq_alarm, ret);
|
||||
goto err_free_hz;
|
||||
goto err_unreg;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_hz:
|
||||
free_irq(vt8500_rtc->irq_hz, vt8500_rtc);
|
||||
err_unreg:
|
||||
rtc_device_unregister(vt8500_rtc->rtc);
|
||||
err_unmap:
|
||||
@ -323,7 +285,6 @@ static int __devexit vt8500_rtc_remove(struct platform_device *pdev)
|
||||
struct vt8500_rtc *vt8500_rtc = platform_get_drvdata(pdev);
|
||||
|
||||
free_irq(vt8500_rtc->irq_alarm, vt8500_rtc);
|
||||
free_irq(vt8500_rtc->irq_hz, vt8500_rtc);
|
||||
|
||||
rtc_device_unregister(vt8500_rtc->rtc);
|
||||
|
||||
|
@ -7,6 +7,7 @@ config BRCMSMAC
|
||||
default n
|
||||
depends on PCI
|
||||
depends on WLAN && MAC80211
|
||||
depends on X86 || MIPS
|
||||
select BRCMUTIL
|
||||
select FW_LOADER
|
||||
select CRC_CCITT
|
||||
@ -20,6 +21,7 @@ config BRCMFMAC
|
||||
default n
|
||||
depends on MMC
|
||||
depends on WLAN && CFG80211
|
||||
depends on X86 || MIPS
|
||||
select BRCMUTIL
|
||||
select FW_LOADER
|
||||
select WIRELESS_EXT
|
||||
|
@ -2,6 +2,7 @@ config COMEDI
|
||||
tristate "Data acquisition support (comedi)"
|
||||
default N
|
||||
depends on m
|
||||
depends on BROKEN || FRV || M32R || MN10300 || SUPERH || TILE || X86
|
||||
---help---
|
||||
Enable support a wide range of data acquisition devices
|
||||
for Linux.
|
||||
@ -160,6 +161,7 @@ config COMEDI_PCL730
|
||||
|
||||
config COMEDI_PCL812
|
||||
tristate "Advantech PCL-812/813 and ADlink ACL-8112/8113/8113/8216"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for Advantech PCL-812/PG, PCL-813/B, ADLink
|
||||
@ -171,6 +173,7 @@ config COMEDI_PCL812
|
||||
|
||||
config COMEDI_PCL816
|
||||
tristate "Advantech PCL-814 and PCL-816 ISA card support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for Advantech PCL-814 and PCL-816 ISA cards
|
||||
@ -180,6 +183,7 @@ config COMEDI_PCL816
|
||||
|
||||
config COMEDI_PCL818
|
||||
tristate "Advantech PCL-718 and PCL-818 ISA card support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for Advantech PCL-818 ISA cards
|
||||
@ -269,6 +273,7 @@ config COMEDI_DAS800
|
||||
|
||||
config COMEDI_DAS1800
|
||||
tristate "DAS1800 and compatible ISA card support"
|
||||
depends on VIRT_TO_BUS
|
||||
select COMEDI_FC
|
||||
default N
|
||||
---help---
|
||||
@ -340,6 +345,7 @@ config COMEDI_DT2817
|
||||
config COMEDI_DT282X
|
||||
tristate "Data Translation DT2821 series and DT-EZ ISA card support"
|
||||
select COMEDI_FC
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for Data Translation DT2821 series including DT-EZ
|
||||
@ -419,6 +425,7 @@ config COMEDI_ADQ12B
|
||||
config COMEDI_NI_AT_A2150
|
||||
tristate "NI AT-A2150 ISA card support"
|
||||
depends on COMEDI_NI_COMMON
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for National Instruments AT-A2150 cards
|
||||
@ -536,6 +543,7 @@ if COMEDI_PCI_DRIVERS && PCI
|
||||
|
||||
config COMEDI_ADDI_APCI_035
|
||||
tristate "ADDI-DATA APCI_035 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_035 cards
|
||||
@ -545,6 +553,7 @@ config COMEDI_ADDI_APCI_035
|
||||
|
||||
config COMEDI_ADDI_APCI_1032
|
||||
tristate "ADDI-DATA APCI_1032 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_1032 cards
|
||||
@ -554,6 +563,7 @@ config COMEDI_ADDI_APCI_1032
|
||||
|
||||
config COMEDI_ADDI_APCI_1500
|
||||
tristate "ADDI-DATA APCI_1500 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_1500 cards
|
||||
@ -563,6 +573,7 @@ config COMEDI_ADDI_APCI_1500
|
||||
|
||||
config COMEDI_ADDI_APCI_1516
|
||||
tristate "ADDI-DATA APCI_1516 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_1516 cards
|
||||
@ -572,6 +583,7 @@ config COMEDI_ADDI_APCI_1516
|
||||
|
||||
config COMEDI_ADDI_APCI_1564
|
||||
tristate "ADDI-DATA APCI_1564 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_1564 cards
|
||||
@ -581,6 +593,7 @@ config COMEDI_ADDI_APCI_1564
|
||||
|
||||
config COMEDI_ADDI_APCI_16XX
|
||||
tristate "ADDI-DATA APCI_16xx support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_16xx cards
|
||||
@ -590,6 +603,7 @@ config COMEDI_ADDI_APCI_16XX
|
||||
|
||||
config COMEDI_ADDI_APCI_2016
|
||||
tristate "ADDI-DATA APCI_2016 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_2016 cards
|
||||
@ -599,6 +613,7 @@ config COMEDI_ADDI_APCI_2016
|
||||
|
||||
config COMEDI_ADDI_APCI_2032
|
||||
tristate "ADDI-DATA APCI_2032 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_2032 cards
|
||||
@ -608,6 +623,7 @@ config COMEDI_ADDI_APCI_2032
|
||||
|
||||
config COMEDI_ADDI_APCI_2200
|
||||
tristate "ADDI-DATA APCI_2200 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_2200 cards
|
||||
@ -617,6 +633,7 @@ config COMEDI_ADDI_APCI_2200
|
||||
|
||||
config COMEDI_ADDI_APCI_3001
|
||||
tristate "ADDI-DATA APCI_3001 support"
|
||||
depends on VIRT_TO_BUS
|
||||
select COMEDI_FC
|
||||
default N
|
||||
---help---
|
||||
@ -627,6 +644,7 @@ config COMEDI_ADDI_APCI_3001
|
||||
|
||||
config COMEDI_ADDI_APCI_3120
|
||||
tristate "ADDI-DATA APCI_3520 support"
|
||||
depends on VIRT_TO_BUS
|
||||
select COMEDI_FC
|
||||
default N
|
||||
---help---
|
||||
@ -637,6 +655,7 @@ config COMEDI_ADDI_APCI_3120
|
||||
|
||||
config COMEDI_ADDI_APCI_3501
|
||||
tristate "ADDI-DATA APCI_3501 support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_3501 cards
|
||||
@ -646,6 +665,7 @@ config COMEDI_ADDI_APCI_3501
|
||||
|
||||
config COMEDI_ADDI_APCI_3XXX
|
||||
tristate "ADDI-DATA APCI_3xxx support"
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADDI-DATA APCI_3xxx cards
|
||||
@ -712,6 +732,7 @@ config COMEDI_ADL_PCI9111
|
||||
config COMEDI_ADL_PCI9118
|
||||
tristate "ADLink PCI-9118DG, PCI-9118HG, PCI-9118HR support"
|
||||
select COMEDI_FC
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for ADlink PCI-9118DG, PCI-9118HG, PCI-9118HR cards
|
||||
@ -1287,6 +1308,7 @@ config COMEDI_NI_LABPC
|
||||
depends on COMEDI_MITE
|
||||
select COMEDI_8255
|
||||
select COMEDI_FC
|
||||
depends on VIRT_TO_BUS
|
||||
default N
|
||||
---help---
|
||||
Enable support for National Instruments Lab-PC and compatibles
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
menuconfig IIO
|
||||
tristate "Industrial I/O support"
|
||||
depends on !S390
|
||||
depends on GENERIC_HARDIRQS
|
||||
help
|
||||
The industrial I/O subsystem provides a unified framework for
|
||||
drivers for many different types of embedded sensors using a
|
||||
|
@ -84,7 +84,6 @@ struct adis16204_state {
|
||||
|
||||
int adis16204_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
enum adis16204_scan {
|
||||
ADIS16204_SCAN_SUPPLY,
|
||||
ADIS16204_SCAN_ACC_X,
|
||||
@ -93,6 +92,7 @@ enum adis16204_scan {
|
||||
ADIS16204_SCAN_TEMP,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
void adis16204_remove_trigger(struct iio_dev *indio_dev);
|
||||
int adis16204_probe_trigger(struct iio_dev *indio_dev);
|
||||
|
||||
|
@ -121,8 +121,6 @@ struct adis16209_state {
|
||||
|
||||
int adis16209_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
|
||||
#define ADIS16209_SCAN_SUPPLY 0
|
||||
#define ADIS16209_SCAN_ACC_X 1
|
||||
#define ADIS16209_SCAN_ACC_Y 2
|
||||
@ -132,6 +130,8 @@ int adis16209_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
#define ADIS16209_SCAN_INCLI_Y 6
|
||||
#define ADIS16209_SCAN_ROT 7
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
|
||||
void adis16209_remove_trigger(struct iio_dev *indio_dev);
|
||||
int adis16209_probe_trigger(struct iio_dev *indio_dev);
|
||||
|
||||
|
@ -104,7 +104,6 @@ struct adis16260_state {
|
||||
|
||||
int adis16260_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
/* At the moment triggers are only used for ring buffer
|
||||
* filling. This may change!
|
||||
*/
|
||||
@ -115,6 +114,7 @@ int adis16260_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
#define ADIS16260_SCAN_TEMP 3
|
||||
#define ADIS16260_SCAN_ANGL 4
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
void adis16260_remove_trigger(struct iio_dev *indio_dev);
|
||||
int adis16260_probe_trigger(struct iio_dev *indio_dev);
|
||||
|
||||
|
@ -158,7 +158,6 @@ struct adis16400_state {
|
||||
|
||||
int adis16400_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
/* At the moment triggers are only used for ring buffer
|
||||
* filling. This may change!
|
||||
*/
|
||||
@ -182,6 +181,7 @@ int adis16400_set_irq(struct iio_dev *indio_dev, bool enable);
|
||||
#define ADIS16300_SCAN_INCLI_X 12
|
||||
#define ADIS16300_SCAN_INCLI_Y 13
|
||||
|
||||
#ifdef CONFIG_IIO_RING_BUFFER
|
||||
void adis16400_remove_trigger(struct iio_dev *indio_dev);
|
||||
int adis16400_probe_trigger(struct iio_dev *indio_dev);
|
||||
|
||||
|
@ -189,7 +189,7 @@ int mei_hw_init(struct mei_device *dev)
|
||||
mutex_lock(&dev->device_lock);
|
||||
}
|
||||
|
||||
if (!err && !dev->recvd_msg) {
|
||||
if (err <= 0 && !dev->recvd_msg) {
|
||||
dev->mei_state = MEI_DISABLED;
|
||||
dev_dbg(&dev->pdev->dev,
|
||||
"wait_event_interruptible_timeout failed"
|
||||
|
@ -169,10 +169,15 @@ int mei_wd_stop(struct mei_device *dev, bool preserve)
|
||||
ret = wait_event_interruptible_timeout(dev->wait_stop_wd,
|
||||
dev->wd_stopped, 10 * HZ);
|
||||
mutex_lock(&dev->device_lock);
|
||||
if (!dev->wd_stopped)
|
||||
dev_dbg(&dev->pdev->dev, "stop wd failed to complete.\n");
|
||||
else
|
||||
dev_dbg(&dev->pdev->dev, "stop wd complete.\n");
|
||||
if (dev->wd_stopped) {
|
||||
dev_dbg(&dev->pdev->dev, "stop wd complete ret=%d.\n", ret);
|
||||
ret = 0;
|
||||
} else {
|
||||
if (!ret)
|
||||
ret = -ETIMEDOUT;
|
||||
dev_warn(&dev->pdev->dev,
|
||||
"stop wd failed to complete ret=%d.\n", ret);
|
||||
}
|
||||
|
||||
if (preserve)
|
||||
dev->wd_timeout = wd_timeout;
|
||||
|
@ -386,7 +386,7 @@ static int tcm_loop_device_reset(struct scsi_cmnd *sc)
|
||||
*/
|
||||
se_cmd->se_tmr_req = core_tmr_alloc_req(se_cmd, (void *)tl_tmr,
|
||||
TMR_LUN_RESET);
|
||||
if (!se_cmd->se_tmr_req)
|
||||
if (IS_ERR(se_cmd->se_tmr_req))
|
||||
goto release;
|
||||
/*
|
||||
* Locate the underlying TCM struct se_lun from sc->device->lun
|
||||
@ -1017,6 +1017,7 @@ static int tcm_loop_make_nexus(
|
||||
struct se_portal_group *se_tpg;
|
||||
struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba;
|
||||
struct tcm_loop_nexus *tl_nexus;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
if (tl_tpg->tl_hba->tl_nexus) {
|
||||
printk(KERN_INFO "tl_tpg->tl_hba->tl_nexus already exists\n");
|
||||
@ -1033,8 +1034,10 @@ static int tcm_loop_make_nexus(
|
||||
* Initialize the struct se_session pointer
|
||||
*/
|
||||
tl_nexus->se_sess = transport_init_session();
|
||||
if (!tl_nexus->se_sess)
|
||||
if (IS_ERR(tl_nexus->se_sess)) {
|
||||
ret = PTR_ERR(tl_nexus->se_sess);
|
||||
goto out;
|
||||
}
|
||||
/*
|
||||
* Since we are running in 'demo mode' this call with generate a
|
||||
* struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI
|
||||
@ -1060,7 +1063,7 @@ static int tcm_loop_make_nexus(
|
||||
|
||||
out:
|
||||
kfree(tl_nexus);
|
||||
return -ENOMEM;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int tcm_loop_drop_nexus(
|
||||
@ -1140,7 +1143,7 @@ static ssize_t tcm_loop_tpg_store_nexus(
|
||||
* the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call
|
||||
* tcm_loop_make_nexus()
|
||||
*/
|
||||
if (strlen(page) > TL_WWN_ADDR_LEN) {
|
||||
if (strlen(page) >= TL_WWN_ADDR_LEN) {
|
||||
printk(KERN_ERR "Emulated NAA Sas Address: %s, exceeds"
|
||||
" max: %d\n", page, TL_WWN_ADDR_LEN);
|
||||
return -EINVAL;
|
||||
@ -1321,7 +1324,7 @@ struct se_wwn *tcm_loop_make_scsi_hba(
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
check_len:
|
||||
if (strlen(name) > TL_WWN_ADDR_LEN) {
|
||||
if (strlen(name) >= TL_WWN_ADDR_LEN) {
|
||||
printk(KERN_ERR "Emulated NAA %s Address: %s, exceeds"
|
||||
" max: %d\n", name, tcm_loop_dump_proto_id(tl_hba),
|
||||
TL_WWN_ADDR_LEN);
|
||||
|
@ -304,7 +304,7 @@ struct target_fabric_configfs *target_fabric_configfs_init(
|
||||
printk(KERN_ERR "Unable to locate passed fabric name\n");
|
||||
return NULL;
|
||||
}
|
||||
if (strlen(name) > TARGET_FABRIC_NAME_SIZE) {
|
||||
if (strlen(name) >= TARGET_FABRIC_NAME_SIZE) {
|
||||
printk(KERN_ERR "Passed name: %s exceeds TARGET_FABRIC"
|
||||
"_NAME_SIZE\n", name);
|
||||
return NULL;
|
||||
@ -312,7 +312,7 @@ struct target_fabric_configfs *target_fabric_configfs_init(
|
||||
|
||||
tf = kzalloc(sizeof(struct target_fabric_configfs), GFP_KERNEL);
|
||||
if (!(tf))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
return NULL;
|
||||
|
||||
INIT_LIST_HEAD(&tf->tf_list);
|
||||
atomic_set(&tf->tf_access_cnt, 0);
|
||||
@ -851,7 +851,7 @@ static ssize_t target_core_dev_wwn_store_attr_vpd_unit_serial(
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if ((strlen(page) + 1) > INQUIRY_VPD_SERIAL_LEN) {
|
||||
if (strlen(page) >= INQUIRY_VPD_SERIAL_LEN) {
|
||||
printk(KERN_ERR "Emulated VPD Unit Serial exceeds"
|
||||
" INQUIRY_VPD_SERIAL_LEN: %d\n", INQUIRY_VPD_SERIAL_LEN);
|
||||
return -EOVERFLOW;
|
||||
@ -917,7 +917,7 @@ static ssize_t target_core_dev_wwn_show_attr_vpd_protocol_identifier(
|
||||
|
||||
transport_dump_vpd_proto_id(vpd, buf, VPD_TMP_BUF_SIZE);
|
||||
|
||||
if ((len + strlen(buf) > PAGE_SIZE))
|
||||
if ((len + strlen(buf) >= PAGE_SIZE))
|
||||
break;
|
||||
|
||||
len += sprintf(page+len, "%s", buf);
|
||||
@ -962,19 +962,19 @@ static ssize_t target_core_dev_wwn_show_attr_##_name( \
|
||||
\
|
||||
memset(buf, 0, VPD_TMP_BUF_SIZE); \
|
||||
transport_dump_vpd_assoc(vpd, buf, VPD_TMP_BUF_SIZE); \
|
||||
if ((len + strlen(buf) > PAGE_SIZE)) \
|
||||
if ((len + strlen(buf) >= PAGE_SIZE)) \
|
||||
break; \
|
||||
len += sprintf(page+len, "%s", buf); \
|
||||
\
|
||||
memset(buf, 0, VPD_TMP_BUF_SIZE); \
|
||||
transport_dump_vpd_ident_type(vpd, buf, VPD_TMP_BUF_SIZE); \
|
||||
if ((len + strlen(buf) > PAGE_SIZE)) \
|
||||
if ((len + strlen(buf) >= PAGE_SIZE)) \
|
||||
break; \
|
||||
len += sprintf(page+len, "%s", buf); \
|
||||
\
|
||||
memset(buf, 0, VPD_TMP_BUF_SIZE); \
|
||||
transport_dump_vpd_ident(vpd, buf, VPD_TMP_BUF_SIZE); \
|
||||
if ((len + strlen(buf) > PAGE_SIZE)) \
|
||||
if ((len + strlen(buf) >= PAGE_SIZE)) \
|
||||
break; \
|
||||
len += sprintf(page+len, "%s", buf); \
|
||||
} \
|
||||
@ -1299,7 +1299,7 @@ static ssize_t target_core_dev_pr_show_attr_res_pr_registered_i_pts(
|
||||
&i_buf[0] : "", pr_reg->pr_res_key,
|
||||
pr_reg->pr_res_generation);
|
||||
|
||||
if ((len + strlen(buf) > PAGE_SIZE))
|
||||
if ((len + strlen(buf) >= PAGE_SIZE))
|
||||
break;
|
||||
|
||||
len += sprintf(page+len, "%s", buf);
|
||||
@ -1496,7 +1496,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (strlen(i_port) > PR_APTPL_MAX_IPORT_LEN) {
|
||||
if (strlen(i_port) >= PR_APTPL_MAX_IPORT_LEN) {
|
||||
printk(KERN_ERR "APTPL metadata initiator_node="
|
||||
" exceeds PR_APTPL_MAX_IPORT_LEN: %d\n",
|
||||
PR_APTPL_MAX_IPORT_LEN);
|
||||
@ -1510,7 +1510,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (strlen(isid) > PR_REG_ISID_LEN) {
|
||||
if (strlen(isid) >= PR_REG_ISID_LEN) {
|
||||
printk(KERN_ERR "APTPL metadata initiator_isid"
|
||||
"= exceeds PR_REG_ISID_LEN: %d\n",
|
||||
PR_REG_ISID_LEN);
|
||||
@ -1571,7 +1571,7 @@ static ssize_t target_core_dev_pr_store_attr_res_aptpl_metadata(
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
if (strlen(t_port) > PR_APTPL_MAX_TPORT_LEN) {
|
||||
if (strlen(t_port) >= PR_APTPL_MAX_TPORT_LEN) {
|
||||
printk(KERN_ERR "APTPL metadata target_node="
|
||||
" exceeds PR_APTPL_MAX_TPORT_LEN: %d\n",
|
||||
PR_APTPL_MAX_TPORT_LEN);
|
||||
@ -3052,7 +3052,7 @@ static struct config_group *target_core_call_addhbatotarget(
|
||||
int ret;
|
||||
|
||||
memset(buf, 0, TARGET_CORE_NAME_MAX_LEN);
|
||||
if (strlen(name) > TARGET_CORE_NAME_MAX_LEN) {
|
||||
if (strlen(name) >= TARGET_CORE_NAME_MAX_LEN) {
|
||||
printk(KERN_ERR "Passed *name strlen(): %d exceeds"
|
||||
" TARGET_CORE_NAME_MAX_LEN: %d\n", (int)strlen(name),
|
||||
TARGET_CORE_NAME_MAX_LEN);
|
||||
|
@ -192,7 +192,7 @@ int transport_get_lun_for_tmr(
|
||||
&SE_NODE_ACL(se_sess)->device_list[unpacked_lun];
|
||||
if (deve->lun_flags & TRANSPORT_LUNFLAGS_INITIATOR_ACCESS) {
|
||||
se_lun = se_cmd->se_lun = se_tmr->tmr_lun = deve->se_lun;
|
||||
dev = se_tmr->tmr_dev = se_lun->lun_se_dev;
|
||||
dev = se_lun->lun_se_dev;
|
||||
se_cmd->pr_res_key = deve->pr_res_key;
|
||||
se_cmd->orig_fe_lun = unpacked_lun;
|
||||
se_cmd->se_orig_obj_ptr = SE_LUN(se_cmd)->lun_se_dev;
|
||||
@ -216,6 +216,7 @@ int transport_get_lun_for_tmr(
|
||||
se_cmd->se_cmd_flags |= SCF_SCSI_CDB_EXCEPTION;
|
||||
return -1;
|
||||
}
|
||||
se_tmr->tmr_dev = dev;
|
||||
|
||||
spin_lock(&dev->se_tmr_lock);
|
||||
list_add_tail(&se_tmr->tmr_list, &dev->dev_tmr_list);
|
||||
@ -1430,7 +1431,7 @@ struct se_lun_acl *core_dev_init_initiator_node_lun_acl(
|
||||
struct se_lun_acl *lacl;
|
||||
struct se_node_acl *nacl;
|
||||
|
||||
if (strlen(initiatorname) > TRANSPORT_IQN_LEN) {
|
||||
if (strlen(initiatorname) >= TRANSPORT_IQN_LEN) {
|
||||
printk(KERN_ERR "%s InitiatorName exceeds maximum size.\n",
|
||||
TPG_TFO(tpg)->get_fabric_name());
|
||||
*ret = -EOVERFLOW;
|
||||
|
@ -1916,7 +1916,7 @@ static int __core_scsi3_update_aptpl_buf(
|
||||
pr_reg->pr_res_mapped_lun);
|
||||
}
|
||||
|
||||
if ((len + strlen(tmp) > pr_aptpl_buf_len)) {
|
||||
if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
|
||||
printk(KERN_ERR "Unable to update renaming"
|
||||
" APTPL metadata\n");
|
||||
spin_unlock(&T10_RES(su_dev)->registration_lock);
|
||||
@ -1934,7 +1934,7 @@ static int __core_scsi3_update_aptpl_buf(
|
||||
TPG_TFO(tpg)->tpg_get_tag(tpg),
|
||||
lun->lun_sep->sep_rtpi, lun->unpacked_lun, reg_count);
|
||||
|
||||
if ((len + strlen(tmp) > pr_aptpl_buf_len)) {
|
||||
if ((len + strlen(tmp) >= pr_aptpl_buf_len)) {
|
||||
printk(KERN_ERR "Unable to update renaming"
|
||||
" APTPL metadata\n");
|
||||
spin_unlock(&T10_RES(su_dev)->registration_lock);
|
||||
@ -1986,7 +1986,7 @@ static int __core_scsi3_write_aptpl_to_file(
|
||||
memset(iov, 0, sizeof(struct iovec));
|
||||
memset(path, 0, 512);
|
||||
|
||||
if (strlen(&wwn->unit_serial[0]) > 512) {
|
||||
if (strlen(&wwn->unit_serial[0]) >= 512) {
|
||||
printk(KERN_ERR "WWN value for struct se_device does not fit"
|
||||
" into path buffer\n");
|
||||
return -1;
|
||||
|
@ -75,10 +75,16 @@ void core_tmr_release_req(
|
||||
{
|
||||
struct se_device *dev = tmr->tmr_dev;
|
||||
|
||||
if (!dev) {
|
||||
kmem_cache_free(se_tmr_req_cache, tmr);
|
||||
return;
|
||||
}
|
||||
|
||||
spin_lock(&dev->se_tmr_lock);
|
||||
list_del(&tmr->tmr_list);
|
||||
kmem_cache_free(se_tmr_req_cache, tmr);
|
||||
spin_unlock(&dev->se_tmr_lock);
|
||||
|
||||
kmem_cache_free(se_tmr_req_cache, tmr);
|
||||
}
|
||||
|
||||
static void core_tmr_handle_tas_abort(
|
||||
|
@ -536,13 +536,13 @@ EXPORT_SYMBOL(transport_register_session);
|
||||
void transport_deregister_session_configfs(struct se_session *se_sess)
|
||||
{
|
||||
struct se_node_acl *se_nacl;
|
||||
|
||||
unsigned long flags;
|
||||
/*
|
||||
* Used by struct se_node_acl's under ConfigFS to locate active struct se_session
|
||||
*/
|
||||
se_nacl = se_sess->se_node_acl;
|
||||
if ((se_nacl)) {
|
||||
spin_lock_irq(&se_nacl->nacl_sess_lock);
|
||||
spin_lock_irqsave(&se_nacl->nacl_sess_lock, flags);
|
||||
list_del(&se_sess->sess_acl_list);
|
||||
/*
|
||||
* If the session list is empty, then clear the pointer.
|
||||
@ -556,7 +556,7 @@ void transport_deregister_session_configfs(struct se_session *se_sess)
|
||||
se_nacl->acl_sess_list.prev,
|
||||
struct se_session, sess_acl_list);
|
||||
}
|
||||
spin_unlock_irq(&se_nacl->nacl_sess_lock);
|
||||
spin_unlock_irqrestore(&se_nacl->nacl_sess_lock, flags);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(transport_deregister_session_configfs);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user