Merge commit 'v2.6.37-rc6' into sched/core
Merge reason: Update to the latest -rc. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
ca680888d5
|
@ -173,12 +173,13 @@ prototypes:
|
|||
sector_t (*bmap)(struct address_space *, sector_t);
|
||||
int (*invalidatepage) (struct page *, unsigned long);
|
||||
int (*releasepage) (struct page *, int);
|
||||
void (*freepage)(struct page *);
|
||||
int (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
|
||||
loff_t offset, unsigned long nr_segs);
|
||||
int (*launder_page) (struct page *);
|
||||
|
||||
locking rules:
|
||||
All except set_page_dirty may block
|
||||
All except set_page_dirty and freepage may block
|
||||
|
||||
BKL PageLocked(page) i_mutex
|
||||
writepage: no yes, unlocks (see below)
|
||||
|
@ -193,6 +194,7 @@ perform_write: no n/a yes
|
|||
bmap: no
|
||||
invalidatepage: no yes
|
||||
releasepage: no yes
|
||||
freepage: no yes
|
||||
direct_IO: no
|
||||
launder_page: no yes
|
||||
|
||||
|
@ -288,6 +290,9 @@ buffers from the page in preparation for freeing it. It returns zero to
|
|||
indicate that the buffers are (or may be) freeable. If ->releasepage is zero,
|
||||
the kernel assumes that the fs has no private interest in the buffers.
|
||||
|
||||
->freepage() is called when the kernel is done dropping the page
|
||||
from the page cache.
|
||||
|
||||
->launder_page() may be called prior to releasing a page if
|
||||
it is still found to be dirty. It returns zero if the page was successfully
|
||||
cleaned, or an error value if not. Note that in order to prevent the page
|
||||
|
|
|
@ -534,6 +534,7 @@ struct address_space_operations {
|
|||
sector_t (*bmap)(struct address_space *, sector_t);
|
||||
int (*invalidatepage) (struct page *, unsigned long);
|
||||
int (*releasepage) (struct page *, int);
|
||||
void (*freepage)(struct page *);
|
||||
ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
|
||||
loff_t offset, unsigned long nr_segs);
|
||||
struct page* (*get_xip_page)(struct address_space *, sector_t,
|
||||
|
@ -678,6 +679,12 @@ struct address_space_operations {
|
|||
need to ensure this. Possibly it can clear the PageUptodate
|
||||
bit if it cannot free private data yet.
|
||||
|
||||
freepage: freepage is called once the page is no longer visible in
|
||||
the page cache in order to allow the cleanup of any private
|
||||
data. Since it may be called by the memory reclaimer, it
|
||||
should not assume that the original address_space mapping still
|
||||
exists, and it should not block.
|
||||
|
||||
direct_IO: called by the generic read/write routines to perform
|
||||
direct_IO - that is IO requests which bypass the page cache
|
||||
and transfer data directly between the storage and the
|
||||
|
|
16
MAINTAINERS
16
MAINTAINERS
|
@ -559,14 +559,14 @@ W: http://maxim.org.za/at91_26.html
|
|||
S: Maintained
|
||||
|
||||
ARM/BCMRING ARM ARCHITECTURE
|
||||
M: Leo Chen <leochen@broadcom.com>
|
||||
M: Jiandong Zheng <jdzheng@broadcom.com>
|
||||
M: Scott Branden <sbranden@broadcom.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/mach-bcmring
|
||||
|
||||
ARM/BCMRING MTD NAND DRIVER
|
||||
M: Leo Chen <leochen@broadcom.com>
|
||||
M: Jiandong Zheng <jdzheng@broadcom.com>
|
||||
M: Scott Branden <sbranden@broadcom.com>
|
||||
L: linux-mtd@lists.infradead.org
|
||||
S: Maintained
|
||||
|
@ -815,7 +815,7 @@ F: drivers/mmc/host/msm_sdcc.c
|
|||
F: drivers/mmc/host/msm_sdcc.h
|
||||
F: drivers/serial/msm_serial.h
|
||||
F: drivers/serial/msm_serial.c
|
||||
T: git git://codeaurora.org/quic/kernel/dwalker/linux-msm.git
|
||||
T: git git://codeaurora.org/quic/kernel/davidb/linux-msm.git
|
||||
S: Maintained
|
||||
|
||||
ARM/TOSA MACHINE SUPPORT
|
||||
|
@ -5932,7 +5932,6 @@ F: include/linux/tty.h
|
|||
|
||||
TULIP NETWORK DRIVERS
|
||||
M: Grant Grundler <grundler@parisc-linux.org>
|
||||
M: Kyle McMartin <kyle@mcmartin.ca>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/tulip/
|
||||
|
@ -6584,6 +6583,15 @@ F: include/linux/mfd/wm8400*
|
|||
F: include/sound/wm????.h
|
||||
F: sound/soc/codecs/wm*
|
||||
|
||||
WORKQUEUE
|
||||
M: Tejun Heo <tj@kernel.org>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq.git
|
||||
S: Maintained
|
||||
F: include/linux/workqueue.h
|
||||
F: kernel/workqueue.c
|
||||
F: Documentation/workqueue.txt
|
||||
|
||||
X.25 NETWORK LAYER
|
||||
M: Andrew Hendry <andrew.hendry@gmail.com>
|
||||
L: linux-x25@vger.kernel.org
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 37
|
||||
EXTRAVERSION = -rc5
|
||||
EXTRAVERSION = -rc6
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -1311,7 +1311,7 @@ config HZ
|
|||
|
||||
config THUMB2_KERNEL
|
||||
bool "Compile the kernel in Thumb-2 mode"
|
||||
depends on CPU_V7 && EXPERIMENTAL
|
||||
depends on CPU_V7 && !CPU_V6 && EXPERIMENTAL
|
||||
select AEABI
|
||||
select ARM_ASM_UNIFIED
|
||||
help
|
||||
|
@ -1759,7 +1759,7 @@ comment "At least one emulation must be selected"
|
|||
|
||||
config FPE_NWFPE
|
||||
bool "NWFPE math emulation"
|
||||
depends on !AEABI || OABI_COMPAT
|
||||
depends on (!AEABI || OABI_COMPAT) && !THUMB2_KERNEL
|
||||
---help---
|
||||
Say Y to include the NWFPE floating point emulator in the kernel.
|
||||
This is necessary to run most binaries. Linux does not currently
|
||||
|
|
|
@ -126,7 +126,6 @@ static APBC_CLK(twsi3, MMP2_TWSI3, 0, 26000000);
|
|||
static APBC_CLK(twsi4, MMP2_TWSI4, 0, 26000000);
|
||||
static APBC_CLK(twsi5, MMP2_TWSI5, 0, 26000000);
|
||||
static APBC_CLK(twsi6, MMP2_TWSI6, 0, 26000000);
|
||||
static APBC_CLK(rtc, MMP2_RTC, 0, 32768);
|
||||
|
||||
static APMU_CLK(nand, NAND, 0xbf, 100000000);
|
||||
|
||||
|
|
|
@ -216,7 +216,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
|||
{
|
||||
.name = "wl1271",
|
||||
.mmc = 3,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
|
||||
.gpio_wp = -EINVAL,
|
||||
.gpio_cd = -EINVAL,
|
||||
.nonremovable = true,
|
||||
|
|
|
@ -297,7 +297,7 @@ static int __init _omap2_init_reprogram_sdrc(void)
|
|||
return 0;
|
||||
|
||||
dpll3_m2_ck = clk_get(NULL, "dpll3_m2_ck");
|
||||
if (!dpll3_m2_ck)
|
||||
if (IS_ERR(dpll3_m2_ck))
|
||||
return -EINVAL;
|
||||
|
||||
rate = clk_get_rate(dpll3_m2_ck);
|
||||
|
|
|
@ -161,6 +161,23 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
|
|||
printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val);
|
||||
}
|
||||
|
||||
void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds)
|
||||
{
|
||||
u32 tick_rate, cycles;
|
||||
|
||||
if (!seconds && !milliseconds)
|
||||
return;
|
||||
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
|
||||
cycles = tick_rate * seconds + tick_rate * milliseconds / 1000;
|
||||
omap_dm_timer_stop(gptimer_wakeup);
|
||||
omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
|
||||
|
||||
pr_info("PM: Resume timer in %u.%03u secs"
|
||||
" (%d ticks at %d ticks/sec.)\n",
|
||||
seconds, milliseconds, cycles, tick_rate);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
@ -354,23 +371,6 @@ void pm_dbg_update_time(struct powerdomain *pwrdm, int prev)
|
|||
pwrdm->timer = t;
|
||||
}
|
||||
|
||||
void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds)
|
||||
{
|
||||
u32 tick_rate, cycles;
|
||||
|
||||
if (!seconds && !milliseconds)
|
||||
return;
|
||||
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
|
||||
cycles = tick_rate * seconds + tick_rate * milliseconds / 1000;
|
||||
omap_dm_timer_stop(gptimer_wakeup);
|
||||
omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
|
||||
|
||||
pr_info("PM: Resume timer in %u.%03u secs"
|
||||
" (%d ticks at %d ticks/sec.)\n",
|
||||
seconds, milliseconds, cycles, tick_rate);
|
||||
}
|
||||
|
||||
static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user)
|
||||
{
|
||||
struct seq_file *s = (struct seq_file *)user;
|
||||
|
|
|
@ -53,6 +53,19 @@
|
|||
#include <plat/powerdomain.h>
|
||||
#include <plat/clockdomain.h>
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static suspend_state_t suspend_state = PM_SUSPEND_ON;
|
||||
static inline bool is_suspending(void)
|
||||
{
|
||||
return (suspend_state != PM_SUSPEND_ON);
|
||||
}
|
||||
#else
|
||||
static inline bool is_suspending(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void (*omap2_sram_idle)(void);
|
||||
static void (*omap2_sram_suspend)(u32 dllctrl, void __iomem *sdrc_dlla_ctrl,
|
||||
void __iomem *sdrc_power);
|
||||
|
@ -120,8 +133,9 @@ static void omap2_enter_full_retention(void)
|
|||
goto no_sleep;
|
||||
|
||||
/* Block console output in case it is on one of the OMAP UARTs */
|
||||
if (try_acquire_console_sem())
|
||||
goto no_sleep;
|
||||
if (!is_suspending())
|
||||
if (try_acquire_console_sem())
|
||||
goto no_sleep;
|
||||
|
||||
omap_uart_prepare_idle(0);
|
||||
omap_uart_prepare_idle(1);
|
||||
|
@ -136,7 +150,8 @@ static void omap2_enter_full_retention(void)
|
|||
omap_uart_resume_idle(1);
|
||||
omap_uart_resume_idle(0);
|
||||
|
||||
release_console_sem();
|
||||
if (!is_suspending())
|
||||
release_console_sem();
|
||||
|
||||
no_sleep:
|
||||
if (omap2_pm_debug) {
|
||||
|
@ -284,6 +299,12 @@ out:
|
|||
local_irq_enable();
|
||||
}
|
||||
|
||||
static int omap2_pm_begin(suspend_state_t state)
|
||||
{
|
||||
suspend_state = state;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int omap2_pm_prepare(void)
|
||||
{
|
||||
/* We cannot sleep in idle until we have resumed */
|
||||
|
@ -333,10 +354,17 @@ static void omap2_pm_finish(void)
|
|||
enable_hlt();
|
||||
}
|
||||
|
||||
static void omap2_pm_end(void)
|
||||
{
|
||||
suspend_state = PM_SUSPEND_ON;
|
||||
}
|
||||
|
||||
static struct platform_suspend_ops omap_pm_ops = {
|
||||
.begin = omap2_pm_begin,
|
||||
.prepare = omap2_pm_prepare,
|
||||
.enter = omap2_pm_enter,
|
||||
.finish = omap2_pm_finish,
|
||||
.end = omap2_pm_end,
|
||||
.valid = suspend_valid_only_mem,
|
||||
};
|
||||
|
||||
|
|
|
@ -50,6 +50,19 @@
|
|||
#include "sdrc.h"
|
||||
#include "control.h"
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static suspend_state_t suspend_state = PM_SUSPEND_ON;
|
||||
static inline bool is_suspending(void)
|
||||
{
|
||||
return (suspend_state != PM_SUSPEND_ON);
|
||||
}
|
||||
#else
|
||||
static inline bool is_suspending(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Scratchpad offsets */
|
||||
#define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4
|
||||
#define OMAP343X_TABLE_VALUE_OFFSET 0xc0
|
||||
|
@ -387,10 +400,11 @@ void omap_sram_idle(void)
|
|||
}
|
||||
|
||||
/* Block console output in case it is on one of the OMAP UARTs */
|
||||
if (per_next_state < PWRDM_POWER_ON ||
|
||||
core_next_state < PWRDM_POWER_ON)
|
||||
if (try_acquire_console_sem())
|
||||
goto console_still_active;
|
||||
if (!is_suspending())
|
||||
if (per_next_state < PWRDM_POWER_ON ||
|
||||
core_next_state < PWRDM_POWER_ON)
|
||||
if (try_acquire_console_sem())
|
||||
goto console_still_active;
|
||||
|
||||
/* PER */
|
||||
if (per_next_state < PWRDM_POWER_ON) {
|
||||
|
@ -470,7 +484,8 @@ void omap_sram_idle(void)
|
|||
omap_uart_resume_idle(3);
|
||||
}
|
||||
|
||||
release_console_sem();
|
||||
if (!is_suspending())
|
||||
release_console_sem();
|
||||
|
||||
console_still_active:
|
||||
/* Disable IO-PAD and IO-CHAIN wakeup */
|
||||
|
@ -514,8 +529,6 @@ out:
|
|||
}
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static suspend_state_t suspend_state;
|
||||
|
||||
static int omap3_pm_prepare(void)
|
||||
{
|
||||
disable_hlt();
|
||||
|
|
|
@ -243,13 +243,14 @@
|
|||
#define OMAP24XX_EN_GPT1_MASK (1 << 0)
|
||||
|
||||
/* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */
|
||||
#define OMAP24XX_ST_GPIOS_SHIFT (1 << 2)
|
||||
#define OMAP24XX_ST_GPIOS_MASK 2
|
||||
#define OMAP24XX_ST_GPT1_SHIFT (1 << 0)
|
||||
#define OMAP24XX_ST_GPT1_MASK 0
|
||||
#define OMAP24XX_ST_GPIOS_SHIFT 2
|
||||
#define OMAP24XX_ST_GPIOS_MASK (1 << 2)
|
||||
#define OMAP24XX_ST_GPT1_SHIFT 0
|
||||
#define OMAP24XX_ST_GPT1_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST_MDM and PM_WKST_MDM shared bits */
|
||||
#define OMAP2430_ST_MDM_SHIFT (1 << 0)
|
||||
#define OMAP2430_ST_MDM_SHIFT 0
|
||||
#define OMAP2430_ST_MDM_MASK (1 << 0)
|
||||
|
||||
|
||||
/* 3430 register bits shared between CM & PRM registers */
|
||||
|
|
|
@ -241,7 +241,8 @@ static inline void palmtx_keys_init(void) {}
|
|||
/******************************************************************************
|
||||
* NAND Flash
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE)
|
||||
#if defined(CONFIG_MTD_NAND_PLATFORM) || \
|
||||
defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
|
||||
static void palmtx_nand_cmd_ctl(struct mtd_info *mtd, int cmd,
|
||||
unsigned int ctrl)
|
||||
{
|
||||
|
|
|
@ -203,6 +203,10 @@ ENTRY(v6_flush_kern_dcache_area)
|
|||
* - end - virtual end address of region
|
||||
*/
|
||||
v6_dma_inv_range:
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldrb r2, [r0] @ read for ownership
|
||||
strb r2, [r0] @ write for ownership
|
||||
#endif
|
||||
tst r0, #D_CACHE_LINE_SIZE - 1
|
||||
bic r0, r0, #D_CACHE_LINE_SIZE - 1
|
||||
#ifdef HARVARD_CACHE
|
||||
|
@ -211,6 +215,10 @@ v6_dma_inv_range:
|
|||
mcrne p15, 0, r0, c7, c11, 1 @ clean unified line
|
||||
#endif
|
||||
tst r1, #D_CACHE_LINE_SIZE - 1
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldrneb r2, [r1, #-1] @ read for ownership
|
||||
strneb r2, [r1, #-1] @ write for ownership
|
||||
#endif
|
||||
bic r1, r1, #D_CACHE_LINE_SIZE - 1
|
||||
#ifdef HARVARD_CACHE
|
||||
mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line
|
||||
|
@ -218,10 +226,6 @@ v6_dma_inv_range:
|
|||
mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line
|
||||
#endif
|
||||
1:
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldr r2, [r0] @ read for ownership
|
||||
str r2, [r0] @ write for ownership
|
||||
#endif
|
||||
#ifdef HARVARD_CACHE
|
||||
mcr p15, 0, r0, c7, c6, 1 @ invalidate D line
|
||||
#else
|
||||
|
@ -229,6 +233,10 @@ v6_dma_inv_range:
|
|||
#endif
|
||||
add r0, r0, #D_CACHE_LINE_SIZE
|
||||
cmp r0, r1
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldrlo r2, [r0] @ read for ownership
|
||||
strlo r2, [r0] @ write for ownership
|
||||
#endif
|
||||
blo 1b
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
|
||||
|
@ -263,12 +271,12 @@ v6_dma_clean_range:
|
|||
* - end - virtual end address of region
|
||||
*/
|
||||
ENTRY(v6_dma_flush_range)
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldrb r2, [r0] @ read for ownership
|
||||
strb r2, [r0] @ write for ownership
|
||||
#endif
|
||||
bic r0, r0, #D_CACHE_LINE_SIZE - 1
|
||||
1:
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldr r2, [r0] @ read for ownership
|
||||
str r2, [r0] @ write for ownership
|
||||
#endif
|
||||
#ifdef HARVARD_CACHE
|
||||
mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line
|
||||
#else
|
||||
|
@ -276,6 +284,10 @@ ENTRY(v6_dma_flush_range)
|
|||
#endif
|
||||
add r0, r0, #D_CACHE_LINE_SIZE
|
||||
cmp r0, r1
|
||||
#ifdef CONFIG_DMA_CACHE_RWFO
|
||||
ldrlob r2, [r0] @ read for ownership
|
||||
strlob r2, [r0] @ write for ownership
|
||||
#endif
|
||||
blo 1b
|
||||
mov r0, #0
|
||||
mcr p15, 0, r0, c7, c10, 4 @ drain write buffer
|
||||
|
|
|
@ -173,15 +173,22 @@ ENTRY(v7_coherent_user_range)
|
|||
UNWIND(.fnstart )
|
||||
dcache_line_size r2, r3
|
||||
sub r3, r2, #1
|
||||
bic r0, r0, r3
|
||||
bic r12, r0, r3
|
||||
1:
|
||||
USER( mcr p15, 0, r0, c7, c11, 1 ) @ clean D line to the point of unification
|
||||
dsb
|
||||
USER( mcr p15, 0, r0, c7, c5, 1 ) @ invalidate I line
|
||||
add r0, r0, r2
|
||||
2:
|
||||
cmp r0, r1
|
||||
USER( mcr p15, 0, r12, c7, c11, 1 ) @ clean D line to the point of unification
|
||||
add r12, r12, r2
|
||||
cmp r12, r1
|
||||
blo 1b
|
||||
dsb
|
||||
icache_line_size r2, r3
|
||||
sub r3, r2, #1
|
||||
bic r12, r0, r3
|
||||
2:
|
||||
USER( mcr p15, 0, r12, c7, c5, 1 ) @ invalidate I line
|
||||
add r12, r12, r2
|
||||
cmp r12, r1
|
||||
blo 2b
|
||||
3:
|
||||
mov r0, #0
|
||||
ALT_SMP(mcr p15, 0, r0, c7, c1, 6) @ invalidate BTB Inner Shareable
|
||||
ALT_UP(mcr p15, 0, r0, c7, c5, 6) @ invalidate BTB
|
||||
|
@ -194,10 +201,10 @@ ENTRY(v7_coherent_user_range)
|
|||
* isn't mapped, just try the next page.
|
||||
*/
|
||||
9001:
|
||||
mov r0, r0, lsr #12
|
||||
mov r0, r0, lsl #12
|
||||
add r0, r0, #4096
|
||||
b 2b
|
||||
mov r12, r12, lsr #12
|
||||
mov r12, r12, lsl #12
|
||||
add r12, r12, #4096
|
||||
b 3b
|
||||
UNWIND(.fnend )
|
||||
ENDPROC(v7_coherent_kern_range)
|
||||
ENDPROC(v7_coherent_user_range)
|
||||
|
|
|
@ -61,17 +61,27 @@
|
|||
.endm
|
||||
|
||||
/*
|
||||
* cache_line_size - get the cache line size from the CSIDR register
|
||||
* (available on ARMv7+). It assumes that the CSSR register was configured
|
||||
* to access the L1 data cache CSIDR.
|
||||
* dcache_line_size - get the minimum D-cache line size from the CTR register
|
||||
* on ARMv7.
|
||||
*/
|
||||
.macro dcache_line_size, reg, tmp
|
||||
mrc p15, 1, \tmp, c0, c0, 0 @ read CSIDR
|
||||
and \tmp, \tmp, #7 @ cache line size encoding
|
||||
mov \reg, #16 @ size offset
|
||||
mrc p15, 0, \tmp, c0, c0, 1 @ read ctr
|
||||
lsr \tmp, \tmp, #16
|
||||
and \tmp, \tmp, #0xf @ cache line size encoding
|
||||
mov \reg, #4 @ bytes per word
|
||||
mov \reg, \reg, lsl \tmp @ actual cache line size
|
||||
.endm
|
||||
|
||||
/*
|
||||
* icache_line_size - get the minimum I-cache line size from the CTR register
|
||||
* on ARMv7.
|
||||
*/
|
||||
.macro icache_line_size, reg, tmp
|
||||
mrc p15, 0, \tmp, c0, c0, 1 @ read ctr
|
||||
and \tmp, \tmp, #0xf @ cache line size encoding
|
||||
mov \reg, #4 @ bytes per word
|
||||
mov \reg, \reg, lsl \tmp @ actual cache line size
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Sanity check the PTE configuration for the code below - which makes
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <plat/common.h>
|
||||
#include <plat/board.h>
|
||||
|
@ -164,7 +165,7 @@ static int __init omap_init_clocksource_32k(void)
|
|||
return -ENODEV;
|
||||
|
||||
sync_32k_ick = clk_get(NULL, "omap_32ksync_ick");
|
||||
if (sync_32k_ick)
|
||||
if (!IS_ERR(sync_32k_ick))
|
||||
clk_enable(sync_32k_ick);
|
||||
|
||||
clocksource_32k.mult = clocksource_hz2mult(32768,
|
||||
|
|
|
@ -166,7 +166,7 @@ static void __init omap_detect_sram(void)
|
|||
cpu_is_omap1710())
|
||||
omap_sram_size = 0x4000; /* 16K */
|
||||
else if (cpu_is_omap1611())
|
||||
omap_sram_size = 0x3e800; /* 250K */
|
||||
omap_sram_size = SZ_256K;
|
||||
else {
|
||||
printk(KERN_ERR "Could not detect SRAM size\n");
|
||||
omap_sram_size = 0x4000;
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
#
|
||||
# http://www.arm.linux.org.uk/developer/machines/?action=new
|
||||
#
|
||||
# Last update: Thu Sep 9 22:43:01 2010
|
||||
# Last update: Sun Dec 12 23:24:27 2010
|
||||
#
|
||||
# machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number
|
||||
#
|
||||
|
@ -2321,7 +2321,7 @@ mx31txtr MACH_MX31TXTR MX31TXTR 2332
|
|||
u380 MACH_U380 U380 2333
|
||||
oamp3_hualu MACH_HUALU_BOARD HUALU_BOARD 2334
|
||||
npcmx50 MACH_NPCMX50 NPCMX50 2335
|
||||
mx51_lange51 MACH_MX51_LANGE51 MX51_LANGE51 2336
|
||||
mx51_efikamx MACH_MX51_EFIKAMX MX51_EFIKAMX 2336
|
||||
mx51_lange52 MACH_MX51_LANGE52 MX51_LANGE52 2337
|
||||
riom MACH_RIOM RIOM 2338
|
||||
comcas MACH_COMCAS COMCAS 2339
|
||||
|
@ -2355,7 +2355,7 @@ at91sam9263cs MACH_AT91SAM9263CS AT91SAM9263CS 2366
|
|||
csb732 MACH_CSB732 CSB732 2367
|
||||
u8500 MACH_U8500 U8500 2368
|
||||
huqiu MACH_HUQIU HUQIU 2369
|
||||
mx51_kunlun MACH_MX51_KUNLUN MX51_KUNLUN 2370
|
||||
mx51_efikasb MACH_MX51_EFIKASB MX51_EFIKASB 2370
|
||||
pmt1g MACH_PMT1G PMT1G 2371
|
||||
htcelf MACH_HTCELF HTCELF 2372
|
||||
armadillo420 MACH_ARMADILLO420 ARMADILLO420 2373
|
||||
|
@ -2971,7 +2971,7 @@ premierwave_en MACH_PREMIERWAVE_EN PREMIERWAVE_EN 2985
|
|||
wasabi MACH_WASABI WASABI 2986
|
||||
vivow MACH_VIVOW VIVOW 2987
|
||||
mx50_rdp MACH_MX50_RDP MX50_RDP 2988
|
||||
universal MACH_UNIVERSAL UNIVERSAL 2989
|
||||
universal_c210 MACH_UNIVERSAL_C210 UNIVERSAL_C210 2989
|
||||
real6410 MACH_REAL6410 REAL6410 2990
|
||||
spx_sakura MACH_SPX_SAKURA SPX_SAKURA 2991
|
||||
ij3k_2440 MACH_IJ3K_2440 IJ3K_2440 2992
|
||||
|
@ -3044,3 +3044,178 @@ harvest_desoto MACH_HARVEST_DESOTO HARVEST_DESOTO 3059
|
|||
msm8x60_qrdc MACH_MSM8X60_QRDC MSM8X60_QRDC 3060
|
||||
spear900 MACH_SPEAR900 SPEAR900 3061
|
||||
pcontrol_g20 MACH_PCONTROL_G20 PCONTROL_G20 3062
|
||||
rdstor MACH_RDSTOR RDSTOR 3063
|
||||
usdloader MACH_USDLOADER USDLOADER 3064
|
||||
tsoploader MACH_TSOPLOADER TSOPLOADER 3065
|
||||
kronos MACH_KRONOS KRONOS 3066
|
||||
ffcore MACH_FFCORE FFCORE 3067
|
||||
mone MACH_MONE MONE 3068
|
||||
unit2s MACH_UNIT2S UNIT2S 3069
|
||||
acer_a5 MACH_ACER_A5 ACER_A5 3070
|
||||
etherpro_isp MACH_ETHERPRO_ISP ETHERPRO_ISP 3071
|
||||
stretchs7000 MACH_STRETCHS7000 STRETCHS7000 3072
|
||||
p87_smartsim MACH_P87_SMARTSIM P87_SMARTSIM 3073
|
||||
tulip MACH_TULIP TULIP 3074
|
||||
sunflower MACH_SUNFLOWER SUNFLOWER 3075
|
||||
rib MACH_RIB RIB 3076
|
||||
clod MACH_CLOD CLOD 3077
|
||||
rump MACH_RUMP RUMP 3078
|
||||
tenderloin MACH_TENDERLOIN TENDERLOIN 3079
|
||||
shortloin MACH_SHORTLOIN SHORTLOIN 3080
|
||||
crespo MACH_CRESPO CRESPO 3081
|
||||
antares MACH_ANTARES ANTARES 3082
|
||||
wb40n MACH_WB40N WB40N 3083
|
||||
herring MACH_HERRING HERRING 3084
|
||||
naxy400 MACH_NAXY400 NAXY400 3085
|
||||
naxy1200 MACH_NAXY1200 NAXY1200 3086
|
||||
vpr200 MACH_VPR200 VPR200 3087
|
||||
bug20 MACH_BUG20 BUG20 3088
|
||||
goflexnet MACH_GOFLEXNET GOFLEXNET 3089
|
||||
torbreck MACH_TORBRECK TORBRECK 3090
|
||||
saarb_mg1 MACH_SAARB_MG1 SAARB_MG1 3091
|
||||
callisto MACH_CALLISTO CALLISTO 3092
|
||||
multhsu MACH_MULTHSU MULTHSU 3093
|
||||
saluda MACH_SALUDA SALUDA 3094
|
||||
pemp_omap3_apollo MACH_PEMP_OMAP3_APOLLO PEMP_OMAP3_APOLLO 3095
|
||||
vc0718 MACH_VC0718 VC0718 3096
|
||||
mvblx MACH_MVBLX MVBLX 3097
|
||||
inhand_apeiron MACH_INHAND_APEIRON INHAND_APEIRON 3098
|
||||
inhand_fury MACH_INHAND_FURY INHAND_FURY 3099
|
||||
inhand_siren MACH_INHAND_SIREN INHAND_SIREN 3100
|
||||
hdnvp MACH_HDNVP HDNVP 3101
|
||||
softwinner MACH_SOFTWINNER SOFTWINNER 3102
|
||||
prima2_evb MACH_PRIMA2_EVB PRIMA2_EVB 3103
|
||||
nas6210 MACH_NAS6210 NAS6210 3104
|
||||
unisdev MACH_UNISDEV UNISDEV 3105
|
||||
sbca11 MACH_SBCA11 SBCA11 3106
|
||||
saga MACH_SAGA SAGA 3107
|
||||
ns_k330 MACH_NS_K330 NS_K330 3108
|
||||
tanna MACH_TANNA TANNA 3109
|
||||
imate8502 MACH_IMATE8502 IMATE8502 3110
|
||||
aspen MACH_ASPEN ASPEN 3111
|
||||
daintree_cwac MACH_DAINTREE_CWAC DAINTREE_CWAC 3112
|
||||
zmx25 MACH_ZMX25 ZMX25 3113
|
||||
maple1 MACH_MAPLE1 MAPLE1 3114
|
||||
qsd8x72_surf MACH_QSD8X72_SURF QSD8X72_SURF 3115
|
||||
qsd8x72_ffa MACH_QSD8X72_FFA QSD8X72_FFA 3116
|
||||
abilene MACH_ABILENE ABILENE 3117
|
||||
eigen_ttr MACH_EIGEN_TTR EIGEN_TTR 3118
|
||||
iomega_ix2_200 MACH_IOMEGA_IX2_200 IOMEGA_IX2_200 3119
|
||||
coretec_vcx7400 MACH_CORETEC_VCX7400 CORETEC_VCX7400 3120
|
||||
santiago MACH_SANTIAGO SANTIAGO 3121
|
||||
mx257sol MACH_MX257SOL MX257SOL 3122
|
||||
strasbourg MACH_STRASBOURG STRASBOURG 3123
|
||||
msm8x60_fluid MACH_MSM8X60_FLUID MSM8X60_FLUID 3124
|
||||
smartqv5 MACH_SMARTQV5 SMARTQV5 3125
|
||||
smartqv3 MACH_SMARTQV3 SMARTQV3 3126
|
||||
smartqv7 MACH_SMARTQV7 SMARTQV7 3127
|
||||
paz00 MACH_PAZ00 PAZ00 3128
|
||||
acmenetusfoxg20 MACH_ACMENETUSFOXG20 ACMENETUSFOXG20 3129
|
||||
htcwillow MACH_HTCWILLOW HTCWILLOW 3130
|
||||
fwbd_0404 MACH_FWBD_0404 FWBD_0404 3131
|
||||
hdgu MACH_HDGU HDGU 3132
|
||||
pyramid MACH_PYRAMID PYRAMID 3133
|
||||
epiphan MACH_EPIPHAN EPIPHAN 3134
|
||||
omap_bender MACH_OMAP_BENDER OMAP_BENDER 3135
|
||||
gurnard MACH_GURNARD GURNARD 3136
|
||||
gtl_it5100 MACH_GTL_IT5100 GTL_IT5100 3137
|
||||
bcm2708 MACH_BCM2708 BCM2708 3138
|
||||
mx51_ggc MACH_MX51_GGC MX51_GGC 3139
|
||||
sharespace MACH_SHARESPACE SHARESPACE 3140
|
||||
haba_knx_explorer MACH_HABA_KNX_EXPLORER HABA_KNX_EXPLORER 3141
|
||||
simtec_kirkmod MACH_SIMTEC_KIRKMOD SIMTEC_KIRKMOD 3142
|
||||
crux MACH_CRUX CRUX 3143
|
||||
mx51_bravo MACH_MX51_BRAVO MX51_BRAVO 3144
|
||||
charon MACH_CHARON CHARON 3145
|
||||
picocom3 MACH_PICOCOM3 PICOCOM3 3146
|
||||
picocom4 MACH_PICOCOM4 PICOCOM4 3147
|
||||
serrano MACH_SERRANO SERRANO 3148
|
||||
doubleshot MACH_DOUBLESHOT DOUBLESHOT 3149
|
||||
evsy MACH_EVSY EVSY 3150
|
||||
huashan MACH_HUASHAN HUASHAN 3151
|
||||
lausanne MACH_LAUSANNE LAUSANNE 3152
|
||||
emerald MACH_EMERALD EMERALD 3153
|
||||
tqma35 MACH_TQMA35 TQMA35 3154
|
||||
marvel MACH_MARVEL MARVEL 3155
|
||||
manuae MACH_MANUAE MANUAE 3156
|
||||
chacha MACH_CHACHA CHACHA 3157
|
||||
lemon MACH_LEMON LEMON 3158
|
||||
csc MACH_CSC CSC 3159
|
||||
gira_knxip_router MACH_GIRA_KNXIP_ROUTER GIRA_KNXIP_ROUTER 3160
|
||||
t20 MACH_T20 T20 3161
|
||||
hdmini MACH_HDMINI HDMINI 3162
|
||||
sciphone_g2 MACH_SCIPHONE_G2 SCIPHONE_G2 3163
|
||||
express MACH_EXPRESS EXPRESS 3164
|
||||
express_kt MACH_EXPRESS_KT EXPRESS_KT 3165
|
||||
maximasp MACH_MAXIMASP MAXIMASP 3166
|
||||
nitrogen_imx51 MACH_NITROGEN_IMX51 NITROGEN_IMX51 3167
|
||||
nitrogen_imx53 MACH_NITROGEN_IMX53 NITROGEN_IMX53 3168
|
||||
sunfire MACH_SUNFIRE SUNFIRE 3169
|
||||
arowana MACH_AROWANA AROWANA 3170
|
||||
tegra_daytona MACH_TEGRA_DAYTONA TEGRA_DAYTONA 3171
|
||||
tegra_swordfish MACH_TEGRA_SWORDFISH TEGRA_SWORDFISH 3172
|
||||
edison MACH_EDISON EDISON 3173
|
||||
svp8500v1 MACH_SVP8500V1 SVP8500V1 3174
|
||||
svp8500v2 MACH_SVP8500V2 SVP8500V2 3175
|
||||
svp5500 MACH_SVP5500 SVP5500 3176
|
||||
b5500 MACH_B5500 B5500 3177
|
||||
s5500 MACH_S5500 S5500 3178
|
||||
icon MACH_ICON ICON 3179
|
||||
elephant MACH_ELEPHANT ELEPHANT 3180
|
||||
msm8x60_fusion MACH_MSM8X60_FUSION MSM8X60_FUSION 3181
|
||||
shooter MACH_SHOOTER SHOOTER 3182
|
||||
spade_lte MACH_SPADE_LTE SPADE_LTE 3183
|
||||
philhwani MACH_PHILHWANI PHILHWANI 3184
|
||||
gsncomm MACH_GSNCOMM GSNCOMM 3185
|
||||
strasbourg_a2 MACH_STRASBOURG_A2 STRASBOURG_A2 3186
|
||||
mmm MACH_MMM MMM 3187
|
||||
davinci_dm365_bv MACH_DAVINCI_DM365_BV DAVINCI_DM365_BV 3188
|
||||
ag5evm MACH_AG5EVM AG5EVM 3189
|
||||
sc575plc MACH_SC575PLC SC575PLC 3190
|
||||
sc575hmi MACH_SC575IPC SC575IPC 3191
|
||||
omap3_tdm3730 MACH_OMAP3_TDM3730 OMAP3_TDM3730 3192
|
||||
g7 MACH_G7 G7 3193
|
||||
top9000_eval MACH_TOP9000_EVAL TOP9000_EVAL 3194
|
||||
top9000_su MACH_TOP9000_SU TOP9000_SU 3195
|
||||
utm300 MACH_UTM300 UTM300 3196
|
||||
tsunagi MACH_TSUNAGI TSUNAGI 3197
|
||||
ts75xx MACH_TS75XX TS75XX 3198
|
||||
msm8x60_fusn_ffa MACH_MSM8X60_FUSN_FFA MSM8X60_FUSN_FFA 3199
|
||||
ts47xx MACH_TS47XX TS47XX 3200
|
||||
da850_k5 MACH_DA850_K5 DA850_K5 3201
|
||||
ax502 MACH_AX502 AX502 3202
|
||||
igep0032 MACH_IGEP0032 IGEP0032 3203
|
||||
antero MACH_ANTERO ANTERO 3204
|
||||
synergy MACH_SYNERGY SYNERGY 3205
|
||||
ics_if_voip MACH_ICS_IF_VOIP ICS_IF_VOIP 3206
|
||||
wlf_cragg_6410 MACH_WLF_CRAGG_6410 WLF_CRAGG_6410 3207
|
||||
punica MACH_PUNICA PUNICA 3208
|
||||
sbc_nt250 MACH_SBC_NT250 SBC_NT250 3209
|
||||
mx27_wmultra MACH_MX27_WMULTRA MX27_WMULTRA 3210
|
||||
mackerel MACH_MACKEREL MACKEREL 3211
|
||||
fa9x27 MACH_FA9X27 FA9X27 3213
|
||||
ns2816tb MACH_NS2816TB NS2816TB 3214
|
||||
ns2816_ntpad MACH_NS2816_NTPAD NS2816_NTPAD 3215
|
||||
ns2816_ntnb MACH_NS2816_NTNB NS2816_NTNB 3216
|
||||
kaen MACH_KAEN KAEN 3217
|
||||
nv1000 MACH_NV1000 NV1000 3218
|
||||
nuc950ts MACH_NUC950TS NUC950TS 3219
|
||||
nokia_rm680 MACH_NOKIA_RM680 NOKIA_RM680 3220
|
||||
ast2200 MACH_AST2200 AST2200 3221
|
||||
lead MACH_LEAD LEAD 3222
|
||||
unino1 MACH_UNINO1 UNINO1 3223
|
||||
greeco MACH_GREECO GREECO 3224
|
||||
verdi MACH_VERDI VERDI 3225
|
||||
dm6446_adbox MACH_DM6446_ADBOX DM6446_ADBOX 3226
|
||||
quad_salsa MACH_QUAD_SALSA QUAD_SALSA 3227
|
||||
abb_gma_1_1 MACH_ABB_GMA_1_1 ABB_GMA_1_1 3228
|
||||
svcid MACH_SVCID SVCID 3229
|
||||
msm8960_sim MACH_MSM8960_SIM MSM8960_SIM 3230
|
||||
msm8960_rumi3 MACH_MSM8960_RUMI3 MSM8960_RUMI3 3231
|
||||
icon_g MACH_ICON_G ICON_G 3232
|
||||
mb3 MACH_MB3 MB3 3233
|
||||
gsia18s MACH_GSIA18S GSIA18S 3234
|
||||
pivicc MACH_PIVICC PIVICC 3235
|
||||
pcm048 MACH_PCM048 PCM048 3236
|
||||
dds MACH_DDS DDS 3237
|
||||
chalten_xa1 MACH_CHALTEN_XA1 CHALTEN_XA1 3238
|
||||
|
|
|
@ -22,7 +22,8 @@ config SUPERH
|
|||
select HAVE_SPARSE_IRQ
|
||||
select RTC_LIB
|
||||
select GENERIC_ATOMIC64
|
||||
select GENERIC_HARDIRQS_NO_DEPRECATED
|
||||
# Support the deprecated APIs until MFD and GPIOLIB catch up.
|
||||
select GENERIC_HARDIRQS_NO_DEPRECATED if !MFD_SUPPORT && !GPIOLIB
|
||||
help
|
||||
The SuperH is a RISC processor targeted for use in embedded systems
|
||||
and consumer electronics; it was also used in the Sega Dreamcast
|
||||
|
|
|
@ -368,8 +368,9 @@
|
|||
#define __NR_sendmsg 355
|
||||
#define __NR_recvmsg 356
|
||||
#define __NR_recvmmsg 357
|
||||
#define __NR_accept4 358
|
||||
|
||||
#define NR_syscalls 358
|
||||
#define NR_syscalls 359
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
|
|
@ -375,3 +375,4 @@ ENTRY(sys_call_table)
|
|||
.long sys_sendmsg /* 355 */
|
||||
.long sys_recvmsg
|
||||
.long sys_recvmmsg
|
||||
.long sys_accept4
|
||||
|
|
|
@ -39,7 +39,7 @@ struct linux_dev_v2_funcs {
|
|||
int (*v2_dev_open)(char *devpath);
|
||||
void (*v2_dev_close)(int d);
|
||||
int (*v2_dev_read)(int d, char *buf, int nbytes);
|
||||
int (*v2_dev_write)(int d, char *buf, int nbytes);
|
||||
int (*v2_dev_write)(int d, const char *buf, int nbytes);
|
||||
int (*v2_dev_seek)(int d, int hi, int lo);
|
||||
|
||||
/* Never issued (multistage load support) */
|
||||
|
|
|
@ -60,25 +60,6 @@ extern char *prom_getbootargs(void);
|
|||
extern char *prom_mapio(char *virt_hint, int io_space, unsigned int phys_addr, unsigned int num_bytes);
|
||||
extern void prom_unmapio(char *virt_addr, unsigned int num_bytes);
|
||||
|
||||
/* Device operations. */
|
||||
|
||||
/* Open the device described by the passed string. Note, that the format
|
||||
* of the string is different on V0 vs. V2->higher proms. The caller must
|
||||
* know what he/she is doing! Returns the device descriptor, an int.
|
||||
*/
|
||||
extern int prom_devopen(char *device_string);
|
||||
|
||||
/* Close a previously opened device described by the passed integer
|
||||
* descriptor.
|
||||
*/
|
||||
extern int prom_devclose(int device_handle);
|
||||
|
||||
/* Do a seek operation on the device described by the passed integer
|
||||
* descriptor.
|
||||
*/
|
||||
extern void prom_seek(int device_handle, unsigned int seek_hival,
|
||||
unsigned int seek_lowval);
|
||||
|
||||
/* Miscellaneous routines, don't really fit in any category per se. */
|
||||
|
||||
/* Reboot the machine with the command line passed. */
|
||||
|
@ -121,19 +102,8 @@ extern int prom_getrev(void);
|
|||
/* Get the prom firmware revision. */
|
||||
extern int prom_getprev(void);
|
||||
|
||||
/* Character operations to/from the console.... */
|
||||
|
||||
/* Non-blocking get character from console. */
|
||||
extern int prom_nbgetchar(void);
|
||||
|
||||
/* Non-blocking put character to console. */
|
||||
extern int prom_nbputchar(char character);
|
||||
|
||||
/* Blocking get character from console. */
|
||||
extern char prom_getchar(void);
|
||||
|
||||
/* Blocking put character to console. */
|
||||
extern void prom_putchar(char character);
|
||||
/* Write a buffer of characters to the console. */
|
||||
extern void prom_console_write_buf(const char *buf, int len);
|
||||
|
||||
/* Prom's internal routines, don't use in kernel/boot code. */
|
||||
extern void prom_printf(const char *fmt, ...);
|
||||
|
@ -238,7 +208,6 @@ extern int prom_node_has_property(phandle node, char *property);
|
|||
extern int prom_setprop(phandle node, const char *prop_name, char *prop_value,
|
||||
int value_size);
|
||||
|
||||
extern phandle prom_pathtoinode(char *path);
|
||||
extern phandle prom_inst2pkg(int);
|
||||
|
||||
/* Dorking with Bus ranges... */
|
||||
|
|
|
@ -67,27 +67,6 @@ extern void prom_init(void *cif_handler, void *cif_stack);
|
|||
/* Boot argument acquisition, returns the boot command line string. */
|
||||
extern char *prom_getbootargs(void);
|
||||
|
||||
/* Device utilities. */
|
||||
|
||||
/* Device operations. */
|
||||
|
||||
/* Open the device described by the passed string. Note, that the format
|
||||
* of the string is different on V0 vs. V2->higher proms. The caller must
|
||||
* know what he/she is doing! Returns the device descriptor, an int.
|
||||
*/
|
||||
extern int prom_devopen(const char *device_string);
|
||||
|
||||
/* Close a previously opened device described by the passed integer
|
||||
* descriptor.
|
||||
*/
|
||||
extern int prom_devclose(int device_handle);
|
||||
|
||||
/* Do a seek operation on the device described by the passed integer
|
||||
* descriptor.
|
||||
*/
|
||||
extern void prom_seek(int device_handle, unsigned int seek_hival,
|
||||
unsigned int seek_lowval);
|
||||
|
||||
/* Miscellaneous routines, don't really fit in any category per se. */
|
||||
|
||||
/* Reboot the machine with the command line passed. */
|
||||
|
@ -109,33 +88,14 @@ extern void prom_halt(void) __attribute__ ((noreturn));
|
|||
/* Halt and power-off the machine. */
|
||||
extern void prom_halt_power_off(void) __attribute__ ((noreturn));
|
||||
|
||||
/* Set the PROM 'sync' callback function to the passed function pointer.
|
||||
* When the user gives the 'sync' command at the prom prompt while the
|
||||
* kernel is still active, the prom will call this routine.
|
||||
*
|
||||
*/
|
||||
typedef int (*callback_func_t)(long *cmd);
|
||||
extern void prom_setcallback(callback_func_t func_ptr);
|
||||
|
||||
/* Acquire the IDPROM of the root node in the prom device tree. This
|
||||
* gets passed a buffer where you would like it stuffed. The return value
|
||||
* is the format type of this idprom or 0xff on error.
|
||||
*/
|
||||
extern unsigned char prom_get_idprom(char *idp_buffer, int idpbuf_size);
|
||||
|
||||
/* Character operations to/from the console.... */
|
||||
|
||||
/* Non-blocking get character from console. */
|
||||
extern int prom_nbgetchar(void);
|
||||
|
||||
/* Non-blocking put character to console. */
|
||||
extern int prom_nbputchar(char character);
|
||||
|
||||
/* Blocking get character from console. */
|
||||
extern char prom_getchar(void);
|
||||
|
||||
/* Blocking put character to console. */
|
||||
extern void prom_putchar(char character);
|
||||
/* Write a buffer of characters to the console. */
|
||||
extern void prom_console_write_buf(const char *buf, int len);
|
||||
|
||||
/* Prom's internal routines, don't use in kernel/boot code. */
|
||||
extern void prom_printf(const char *fmt, ...);
|
||||
|
@ -279,9 +239,7 @@ extern phandle prom_finddevice(const char *name);
|
|||
extern int prom_setprop(phandle node, const char *prop_name, char *prop_value,
|
||||
int value_size);
|
||||
|
||||
extern phandle prom_pathtoinode(const char *path);
|
||||
extern phandle prom_inst2pkg(int);
|
||||
extern int prom_service_exists(const char *service_name);
|
||||
extern void prom_sun4v_guest_soft_state(void);
|
||||
|
||||
extern int prom_ihandle2path(int handle, char *buffer, int bufsize);
|
||||
|
|
|
@ -114,7 +114,7 @@ void __init leon_init_timers(irq_handler_t counter_fn)
|
|||
if (leon3_gptimer_regs && leon3_irqctrl_regs) {
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].val, 0);
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].rld,
|
||||
(((1000000 / 100) - 1)));
|
||||
(((1000000 / HZ) - 1)));
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[0].ctrl, 0);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
|
@ -128,7 +128,7 @@ void __init leon_init_timers(irq_handler_t counter_fn)
|
|||
}
|
||||
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].val, 0);
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].rld, (((1000000/100) - 1)));
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].rld, (((1000000/HZ) - 1)));
|
||||
LEON3_BYPASS_STORE_PA(&leon3_gptimer_regs->e[1].ctrl, 0);
|
||||
# endif
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@ ccflags := -Werror
|
|||
|
||||
lib-y := bootstr_$(BITS).o
|
||||
lib-$(CONFIG_SPARC32) += devmap.o
|
||||
lib-y += devops_$(BITS).o
|
||||
lib-y += init_$(BITS).o
|
||||
lib-$(CONFIG_SPARC32) += memory.o
|
||||
lib-y += misc_$(BITS).o
|
||||
|
|
|
@ -16,63 +16,26 @@
|
|||
|
||||
extern void restore_current(void);
|
||||
|
||||
/* Non blocking get character from console input device, returns -1
|
||||
* if no input was taken. This can be used for polling.
|
||||
*/
|
||||
int
|
||||
prom_nbgetchar(void)
|
||||
{
|
||||
static char inc;
|
||||
int i = -1;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
i = (*(romvec->pv_nbgetchar))();
|
||||
break;
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
if( (*(romvec->pv_v2devops).v2_dev_read)(*romvec->pv_v2bootargs.fd_stdin , &inc, 0x1) == 1) {
|
||||
i = inc;
|
||||
} else {
|
||||
i = -1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
i = -1;
|
||||
break;
|
||||
};
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
return i; /* Ugh, we could spin forever on unsupported proms ;( */
|
||||
}
|
||||
|
||||
/* Non blocking put character to console device, returns -1 if
|
||||
* unsuccessful.
|
||||
*/
|
||||
int
|
||||
prom_nbputchar(char c)
|
||||
static int prom_nbputchar(const char *buf)
|
||||
{
|
||||
static char outc;
|
||||
unsigned long flags;
|
||||
int i = -1;
|
||||
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
i = (*(romvec->pv_nbputchar))(c);
|
||||
i = (*(romvec->pv_nbputchar))(*buf);
|
||||
break;
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
outc = c;
|
||||
if( (*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout, &outc, 0x1) == 1)
|
||||
if ((*(romvec->pv_v2devops).v2_dev_write)(*romvec->pv_v2bootargs.fd_stdout,
|
||||
buf, 0x1) == 1)
|
||||
i = 0;
|
||||
else
|
||||
i = -1;
|
||||
break;
|
||||
default:
|
||||
i = -1;
|
||||
break;
|
||||
};
|
||||
restore_current();
|
||||
|
@ -80,18 +43,14 @@ prom_nbputchar(char c)
|
|||
return i; /* Ugh, we could spin forever on unsupported proms ;( */
|
||||
}
|
||||
|
||||
/* Blocking version of get character routine above. */
|
||||
char
|
||||
prom_getchar(void)
|
||||
void prom_console_write_buf(const char *buf, int len)
|
||||
{
|
||||
int character;
|
||||
while((character = prom_nbgetchar()) == -1) ;
|
||||
return (char) character;
|
||||
while (len) {
|
||||
int n = prom_nbputchar(buf);
|
||||
if (n)
|
||||
continue;
|
||||
len--;
|
||||
buf++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Blocking version of put character routine above. */
|
||||
void
|
||||
prom_putchar(char c)
|
||||
{
|
||||
while(prom_nbputchar(c) == -1) ;
|
||||
}
|
||||
|
|
|
@ -15,85 +15,34 @@
|
|||
|
||||
extern int prom_stdin, prom_stdout;
|
||||
|
||||
/* Non blocking get character from console input device, returns -1
|
||||
* if no input was taken. This can be used for polling.
|
||||
*/
|
||||
inline int
|
||||
prom_nbgetchar(void)
|
||||
static int __prom_console_write_buf(const char *buf, int len)
|
||||
{
|
||||
unsigned long args[7];
|
||||
char inc;
|
||||
|
||||
args[0] = (unsigned long) "read";
|
||||
args[1] = 3;
|
||||
args[2] = 1;
|
||||
args[3] = (unsigned int) prom_stdin;
|
||||
args[4] = (unsigned long) &inc;
|
||||
args[5] = 1;
|
||||
args[6] = (unsigned long) -1;
|
||||
|
||||
p1275_cmd_direct(args);
|
||||
|
||||
if (args[6] == 1)
|
||||
return inc;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Non blocking put character to console device, returns -1 if
|
||||
* unsuccessful.
|
||||
*/
|
||||
inline int
|
||||
prom_nbputchar(char c)
|
||||
{
|
||||
unsigned long args[7];
|
||||
char outc;
|
||||
|
||||
outc = c;
|
||||
int ret;
|
||||
|
||||
args[0] = (unsigned long) "write";
|
||||
args[1] = 3;
|
||||
args[2] = 1;
|
||||
args[3] = (unsigned int) prom_stdout;
|
||||
args[4] = (unsigned long) &outc;
|
||||
args[5] = 1;
|
||||
args[4] = (unsigned long) buf;
|
||||
args[5] = (unsigned int) len;
|
||||
args[6] = (unsigned long) -1;
|
||||
|
||||
p1275_cmd_direct(args);
|
||||
|
||||
if (args[6] == 1)
|
||||
return 0;
|
||||
else
|
||||
ret = (int) args[6];
|
||||
if (ret < 0)
|
||||
return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Blocking version of get character routine above. */
|
||||
char
|
||||
prom_getchar(void)
|
||||
void prom_console_write_buf(const char *buf, int len)
|
||||
{
|
||||
int character;
|
||||
while((character = prom_nbgetchar()) == -1) ;
|
||||
return (char) character;
|
||||
}
|
||||
|
||||
/* Blocking version of put character routine above. */
|
||||
void
|
||||
prom_putchar(char c)
|
||||
{
|
||||
prom_nbputchar(c);
|
||||
}
|
||||
|
||||
void
|
||||
prom_puts(const char *s, int len)
|
||||
{
|
||||
unsigned long args[7];
|
||||
|
||||
args[0] = (unsigned long) "write";
|
||||
args[1] = 3;
|
||||
args[2] = 1;
|
||||
args[3] = (unsigned int) prom_stdout;
|
||||
args[4] = (unsigned long) s;
|
||||
args[5] = len;
|
||||
args[6] = (unsigned long) -1;
|
||||
|
||||
p1275_cmd_direct(args);
|
||||
while (len) {
|
||||
int n = __prom_console_write_buf(buf, len);
|
||||
if (n < 0)
|
||||
continue;
|
||||
len -= n;
|
||||
buf += len;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
/*
|
||||
* devops.c: Device operations using the PROM.
|
||||
*
|
||||
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/openprom.h>
|
||||
#include <asm/oplib.h>
|
||||
|
||||
extern void restore_current(void);
|
||||
|
||||
/* Open the device described by the string 'dstr'. Returns the handle
|
||||
* to that device used for subsequent operations on that device.
|
||||
* Returns -1 on failure.
|
||||
*/
|
||||
int
|
||||
prom_devopen(char *dstr)
|
||||
{
|
||||
int handle;
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
handle = (*(romvec->pv_v0devops.v0_devopen))(dstr);
|
||||
if(handle == 0) handle = -1;
|
||||
break;
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
handle = (*(romvec->pv_v2devops.v2_dev_open))(dstr);
|
||||
break;
|
||||
default:
|
||||
handle = -1;
|
||||
break;
|
||||
};
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
/* Close the device described by device handle 'dhandle'. */
|
||||
int
|
||||
prom_devclose(int dhandle)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
(*(romvec->pv_v0devops.v0_devclose))(dhandle);
|
||||
break;
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
(*(romvec->pv_v2devops.v2_dev_close))(dhandle);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Seek to specified location described by 'seekhi' and 'seeklo'
|
||||
* for device 'dhandle'.
|
||||
*/
|
||||
void
|
||||
prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&prom_lock, flags);
|
||||
switch(prom_vers) {
|
||||
case PROM_V0:
|
||||
(*(romvec->pv_v0devops.v0_seekdev))(dhandle, seekhi, seeklo);
|
||||
break;
|
||||
case PROM_V2:
|
||||
case PROM_V3:
|
||||
(*(romvec->pv_v2devops.v2_dev_seek))(dhandle, seekhi, seeklo);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
};
|
||||
restore_current();
|
||||
spin_unlock_irqrestore(&prom_lock, flags);
|
||||
}
|
|
@ -1,67 +0,0 @@
|
|||
/*
|
||||
* devops.c: Device operations using the PROM.
|
||||
*
|
||||
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
||||
* Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/openprom.h>
|
||||
#include <asm/oplib.h>
|
||||
|
||||
/* Open the device described by the string 'dstr'. Returns the handle
|
||||
* to that device used for subsequent operations on that device.
|
||||
* Returns 0 on failure.
|
||||
*/
|
||||
int
|
||||
prom_devopen(const char *dstr)
|
||||
{
|
||||
unsigned long args[5];
|
||||
|
||||
args[0] = (unsigned long) "open";
|
||||
args[1] = 1;
|
||||
args[2] = 1;
|
||||
args[3] = (unsigned long) dstr;
|
||||
args[4] = (unsigned long) -1;
|
||||
|
||||
p1275_cmd_direct(args);
|
||||
|
||||
return (int) args[4];
|
||||
}
|
||||
|
||||
/* Close the device described by device handle 'dhandle'. */
|
||||
int
|
||||
prom_devclose(int dhandle)
|
||||
{
|
||||
unsigned long args[4];
|
||||
|
||||
args[0] = (unsigned long) "close";
|
||||
args[1] = 1;
|
||||
args[2] = 0;
|
||||
args[3] = (unsigned int) dhandle;
|
||||
|
||||
p1275_cmd_direct(args);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Seek to specified location described by 'seekhi' and 'seeklo'
|
||||
* for device 'dhandle'.
|
||||
*/
|
||||
void
|
||||
prom_seek(int dhandle, unsigned int seekhi, unsigned int seeklo)
|
||||
{
|
||||
unsigned long args[7];
|
||||
|
||||
args[0] = (unsigned long) "seek";
|
||||
args[1] = 3;
|
||||
args[2] = 1;
|
||||
args[3] = (unsigned int) dhandle;
|
||||
args[4] = seekhi;
|
||||
args[5] = seeklo;
|
||||
args[6] = (unsigned long) -1;
|
||||
|
||||
p1275_cmd_direct(args);
|
||||
}
|
|
@ -18,7 +18,7 @@
|
|||
#include <asm/system.h>
|
||||
#include <asm/ldc.h>
|
||||
|
||||
int prom_service_exists(const char *service_name)
|
||||
static int prom_service_exists(const char *service_name)
|
||||
{
|
||||
unsigned long args[5];
|
||||
|
||||
|
@ -150,20 +150,6 @@ void prom_halt_power_off(void)
|
|||
prom_halt();
|
||||
}
|
||||
|
||||
/* Set prom sync handler to call function 'funcp'. */
|
||||
void prom_setcallback(callback_func_t funcp)
|
||||
{
|
||||
unsigned long args[5];
|
||||
if (!funcp)
|
||||
return;
|
||||
args[0] = (unsigned long) "set-callback";
|
||||
args[1] = 1;
|
||||
args[2] = 1;
|
||||
args[3] = (unsigned long) funcp;
|
||||
args[4] = (unsigned long) -1;
|
||||
p1275_cmd_direct(args);
|
||||
}
|
||||
|
||||
/* Get the idprom and stuff it into buffer 'idbuf'. Returns the
|
||||
* format type. 'num_bytes' is the number of bytes that your idbuf
|
||||
* has space for. Returns 0xff on error.
|
||||
|
|
|
@ -15,22 +15,45 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/openprom.h>
|
||||
#include <asm/oplib.h>
|
||||
|
||||
#define CONSOLE_WRITE_BUF_SIZE 1024
|
||||
|
||||
static char ppbuf[1024];
|
||||
static char console_write_buf[CONSOLE_WRITE_BUF_SIZE];
|
||||
static DEFINE_RAW_SPINLOCK(console_write_lock);
|
||||
|
||||
void notrace prom_write(const char *buf, unsigned int n)
|
||||
{
|
||||
char ch;
|
||||
unsigned int dest_len;
|
||||
unsigned long flags;
|
||||
char *dest;
|
||||
|
||||
while (n != 0) {
|
||||
--n;
|
||||
if ((ch = *buf++) == '\n')
|
||||
prom_putchar('\r');
|
||||
prom_putchar(ch);
|
||||
dest = console_write_buf;
|
||||
raw_spin_lock_irqsave(&console_write_lock, flags);
|
||||
|
||||
dest_len = 0;
|
||||
while (n-- != 0) {
|
||||
char ch = *buf++;
|
||||
if (ch == '\n') {
|
||||
*dest++ = '\r';
|
||||
dest_len++;
|
||||
}
|
||||
*dest++ = ch;
|
||||
dest_len++;
|
||||
if (dest_len >= CONSOLE_WRITE_BUF_SIZE - 1) {
|
||||
prom_console_write_buf(console_write_buf, dest_len);
|
||||
dest = console_write_buf;
|
||||
dest_len = 0;
|
||||
}
|
||||
}
|
||||
if (dest_len)
|
||||
prom_console_write_buf(console_write_buf, dest_len);
|
||||
|
||||
raw_spin_unlock_irqrestore(&console_write_lock, flags);
|
||||
}
|
||||
|
||||
void notrace prom_printf(const char *fmt, ...)
|
||||
|
|
|
@ -342,19 +342,3 @@ phandle prom_inst2pkg(int inst)
|
|||
if (node == -1) return 0;
|
||||
return node;
|
||||
}
|
||||
|
||||
/* Return 'node' assigned to a particular prom 'path'
|
||||
* FIXME: Should work for v0 as well
|
||||
*/
|
||||
phandle prom_pathtoinode(char *path)
|
||||
{
|
||||
phandle node;
|
||||
int inst;
|
||||
|
||||
inst = prom_devopen (path);
|
||||
if (inst == -1) return 0;
|
||||
node = prom_inst2pkg (inst);
|
||||
prom_devclose (inst);
|
||||
if (node == -1) return 0;
|
||||
return node;
|
||||
}
|
||||
|
|
|
@ -374,24 +374,6 @@ inline phandle prom_inst2pkg(int inst)
|
|||
return node;
|
||||
}
|
||||
|
||||
/* Return 'node' assigned to a particular prom 'path'
|
||||
* FIXME: Should work for v0 as well
|
||||
*/
|
||||
phandle prom_pathtoinode(const char *path)
|
||||
{
|
||||
phandle node;
|
||||
int inst;
|
||||
|
||||
inst = prom_devopen (path);
|
||||
if (inst == 0)
|
||||
return 0;
|
||||
node = prom_inst2pkg(inst);
|
||||
prom_devclose(inst);
|
||||
if (node == -1)
|
||||
return 0;
|
||||
return node;
|
||||
}
|
||||
|
||||
int prom_ihandle2path(int handle, char *buffer, int bufsize)
|
||||
{
|
||||
unsigned long args[7];
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
@ -250,6 +250,14 @@ bsg_map_hdr(struct bsg_device *bd, struct sg_io_v4 *hdr, fmode_t has_write_perm,
|
|||
int ret, rw;
|
||||
unsigned int dxfer_len;
|
||||
void *dxferp = NULL;
|
||||
struct bsg_class_device *bcd = &q->bsg_dev;
|
||||
|
||||
/* if the LLD has been removed then the bsg_unregister_queue will
|
||||
* eventually be called and the class_dev was freed, so we can no
|
||||
* longer use this request_queue. Return no such address.
|
||||
*/
|
||||
if (!bcd->class_dev)
|
||||
return ERR_PTR(-ENXIO);
|
||||
|
||||
dprintk("map hdr %llx/%u %llx/%u\n", (unsigned long long) hdr->dout_xferp,
|
||||
hdr->dout_xfer_len, (unsigned long long) hdr->din_xferp,
|
||||
|
|
|
@ -100,24 +100,7 @@ static const struct file_operations acpi_ac_fops = {
|
|||
.release = single_release,
|
||||
};
|
||||
#endif
|
||||
static int get_ac_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
union power_supply_propval *val)
|
||||
{
|
||||
struct acpi_ac *ac = to_acpi_ac(psy);
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_ONLINE:
|
||||
val->intval = ac->state;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum power_supply_property ac_props[] = {
|
||||
POWER_SUPPLY_PROP_ONLINE,
|
||||
};
|
||||
/* --------------------------------------------------------------------------
|
||||
AC Adapter Management
|
||||
-------------------------------------------------------------------------- */
|
||||
|
@ -140,6 +123,35 @@ static int acpi_ac_get_state(struct acpi_ac *ac)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
sysfs I/F
|
||||
-------------------------------------------------------------------------- */
|
||||
static int get_ac_property(struct power_supply *psy,
|
||||
enum power_supply_property psp,
|
||||
union power_supply_propval *val)
|
||||
{
|
||||
struct acpi_ac *ac = to_acpi_ac(psy);
|
||||
|
||||
if (!ac)
|
||||
return -ENODEV;
|
||||
|
||||
if (acpi_ac_get_state(ac))
|
||||
return -ENODEV;
|
||||
|
||||
switch (psp) {
|
||||
case POWER_SUPPLY_PROP_ONLINE:
|
||||
val->intval = ac->state;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum power_supply_property ac_props[] = {
|
||||
POWER_SUPPLY_PROP_ONLINE,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ACPI_PROCFS_POWER
|
||||
/* --------------------------------------------------------------------------
|
||||
FS Interface (/proc)
|
||||
|
|
|
@ -86,7 +86,7 @@ static struct erst_erange {
|
|||
* It is used to provide exclusive accessing for ERST Error Log
|
||||
* Address Range too.
|
||||
*/
|
||||
static DEFINE_SPINLOCK(erst_lock);
|
||||
static DEFINE_RAW_SPINLOCK(erst_lock);
|
||||
|
||||
static inline int erst_errno(int command_status)
|
||||
{
|
||||
|
@ -421,9 +421,9 @@ ssize_t erst_get_record_count(void)
|
|||
if (erst_disable)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&erst_lock, flags);
|
||||
raw_spin_lock_irqsave(&erst_lock, flags);
|
||||
count = __erst_get_record_count();
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -456,9 +456,9 @@ int erst_get_next_record_id(u64 *record_id)
|
|||
if (erst_disable)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&erst_lock, flags);
|
||||
raw_spin_lock_irqsave(&erst_lock, flags);
|
||||
rc = __erst_get_next_record_id(record_id);
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -624,17 +624,17 @@ int erst_write(const struct cper_record_header *record)
|
|||
return -EINVAL;
|
||||
|
||||
if (erst_erange.attr & ERST_RANGE_NVRAM) {
|
||||
if (!spin_trylock_irqsave(&erst_lock, flags))
|
||||
if (!raw_spin_trylock_irqsave(&erst_lock, flags))
|
||||
return -EBUSY;
|
||||
rc = __erst_write_to_nvram(record);
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (record->record_length > erst_erange.size)
|
||||
return -EINVAL;
|
||||
|
||||
if (!spin_trylock_irqsave(&erst_lock, flags))
|
||||
if (!raw_spin_trylock_irqsave(&erst_lock, flags))
|
||||
return -EBUSY;
|
||||
memcpy(erst_erange.vaddr, record, record->record_length);
|
||||
rcd_erange = erst_erange.vaddr;
|
||||
|
@ -642,7 +642,7 @@ int erst_write(const struct cper_record_header *record)
|
|||
memcpy(&rcd_erange->persistence_information, "ER", 2);
|
||||
|
||||
rc = __erst_write_to_storage(0);
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
@ -696,9 +696,9 @@ ssize_t erst_read(u64 record_id, struct cper_record_header *record,
|
|||
if (erst_disable)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&erst_lock, flags);
|
||||
raw_spin_lock_irqsave(&erst_lock, flags);
|
||||
len = __erst_read(record_id, record, buflen);
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
return len;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(erst_read);
|
||||
|
@ -719,20 +719,20 @@ ssize_t erst_read_next(struct cper_record_header *record, size_t buflen)
|
|||
if (erst_disable)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&erst_lock, flags);
|
||||
raw_spin_lock_irqsave(&erst_lock, flags);
|
||||
rc = __erst_get_next_record_id(&record_id);
|
||||
if (rc) {
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
return rc;
|
||||
}
|
||||
/* no more record */
|
||||
if (record_id == APEI_ERST_INVALID_RECORD_ID) {
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
len = __erst_read(record_id, record, buflen);
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
@ -746,12 +746,12 @@ int erst_clear(u64 record_id)
|
|||
if (erst_disable)
|
||||
return -ENODEV;
|
||||
|
||||
spin_lock_irqsave(&erst_lock, flags);
|
||||
raw_spin_lock_irqsave(&erst_lock, flags);
|
||||
if (erst_erange.attr & ERST_RANGE_NVRAM)
|
||||
rc = __erst_clear_from_nvram(record_id);
|
||||
else
|
||||
rc = __erst_clear_from_storage(record_id);
|
||||
spin_unlock_irqrestore(&erst_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&erst_lock, flags);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
|
@ -46,9 +46,9 @@ EXPORT_SYMBOL_GPL(hest_disable);
|
|||
|
||||
/* HEST table parsing */
|
||||
|
||||
static struct acpi_table_hest *hest_tab;
|
||||
static struct acpi_table_hest *__read_mostly hest_tab;
|
||||
|
||||
static int hest_esrc_len_tab[ACPI_HEST_TYPE_RESERVED] = {
|
||||
static const int hest_esrc_len_tab[ACPI_HEST_TYPE_RESERVED] = {
|
||||
[ACPI_HEST_TYPE_IA32_CHECK] = -1, /* need further calculation */
|
||||
[ACPI_HEST_TYPE_IA32_CORRECTED_CHECK] = -1,
|
||||
[ACPI_HEST_TYPE_IA32_NMI] = sizeof(struct acpi_hest_ia_nmi),
|
||||
|
@ -126,7 +126,7 @@ struct ghes_arr {
|
|||
unsigned int count;
|
||||
};
|
||||
|
||||
static int hest_parse_ghes_count(struct acpi_hest_header *hest_hdr, void *data)
|
||||
static int __init hest_parse_ghes_count(struct acpi_hest_header *hest_hdr, void *data)
|
||||
{
|
||||
int *count = data;
|
||||
|
||||
|
@ -135,7 +135,7 @@ static int hest_parse_ghes_count(struct acpi_hest_header *hest_hdr, void *data)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data)
|
||||
static int __init hest_parse_ghes(struct acpi_hest_header *hest_hdr, void *data)
|
||||
{
|
||||
struct platform_device *ghes_dev;
|
||||
struct ghes_arr *ghes_arr = data;
|
||||
|
@ -165,7 +165,7 @@ err:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int hest_ghes_dev_register(unsigned int ghes_count)
|
||||
static int __init hest_ghes_dev_register(unsigned int ghes_count)
|
||||
{
|
||||
int rc, i;
|
||||
struct ghes_arr ghes_arr;
|
||||
|
|
|
@ -130,6 +130,8 @@ struct acpi_battery {
|
|||
unsigned long flags;
|
||||
};
|
||||
|
||||
static int acpi_battery_update(struct acpi_battery *battery);
|
||||
|
||||
#define to_acpi_battery(x) container_of(x, struct acpi_battery, bat);
|
||||
|
||||
inline int acpi_battery_present(struct acpi_battery *battery)
|
||||
|
@ -184,6 +186,9 @@ static int acpi_battery_get_property(struct power_supply *psy,
|
|||
int ret = 0;
|
||||
struct acpi_battery *battery = to_acpi_battery(psy);
|
||||
|
||||
if (acpi_battery_update(battery))
|
||||
return -ENODEV;
|
||||
|
||||
if (acpi_battery_present(battery)) {
|
||||
/* run battery update only if it is present */
|
||||
acpi_battery_get_state(battery);
|
||||
|
|
|
@ -934,6 +934,9 @@ static struct dmi_system_id __initdata ec_dmi_table[] = {
|
|||
ec_flag_msi, "MSI hardware", {
|
||||
DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-Star")}, NULL},
|
||||
{
|
||||
ec_flag_msi, "MSI hardware", {
|
||||
DMI_MATCH(DMI_CHASSIS_VENDOR, "MICRO-STAR")}, NULL},
|
||||
{
|
||||
ec_validate_ecdt, "ASUS hardware", {
|
||||
DMI_MATCH(DMI_BIOS_VENDOR, "ASUS") }, NULL},
|
||||
{},
|
||||
|
|
|
@ -110,9 +110,6 @@ struct acpi_ioremap {
|
|||
static LIST_HEAD(acpi_ioremaps);
|
||||
static DEFINE_SPINLOCK(acpi_ioremap_lock);
|
||||
|
||||
#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
|
||||
static char osi_setup_string[OSI_STRING_LENGTH_MAX];
|
||||
|
||||
static void __init acpi_osi_setup_late(void);
|
||||
|
||||
/*
|
||||
|
@ -152,8 +149,7 @@ static struct osi_linux {
|
|||
unsigned int enable:1;
|
||||
unsigned int dmi:1;
|
||||
unsigned int cmdline:1;
|
||||
unsigned int known:1;
|
||||
} osi_linux = { 0, 0, 0, 0};
|
||||
} osi_linux = {0, 0, 0};
|
||||
|
||||
static u32 acpi_osi_handler(acpi_string interface, u32 supported)
|
||||
{
|
||||
|
@ -1055,13 +1051,53 @@ static int __init acpi_os_name_setup(char *str)
|
|||
|
||||
__setup("acpi_os_name=", acpi_os_name_setup);
|
||||
|
||||
#define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
|
||||
#define OSI_STRING_ENTRIES_MAX 16 /* arbitrary */
|
||||
|
||||
struct osi_setup_entry {
|
||||
char string[OSI_STRING_LENGTH_MAX];
|
||||
bool enable;
|
||||
};
|
||||
|
||||
static struct osi_setup_entry __initdata osi_setup_entries[OSI_STRING_ENTRIES_MAX];
|
||||
|
||||
void __init acpi_osi_setup(char *str)
|
||||
{
|
||||
struct osi_setup_entry *osi;
|
||||
bool enable = true;
|
||||
int i;
|
||||
|
||||
if (!acpi_gbl_create_osi_method)
|
||||
return;
|
||||
|
||||
if (str == NULL || *str == '\0') {
|
||||
printk(KERN_INFO PREFIX "_OSI method disabled\n");
|
||||
acpi_gbl_create_osi_method = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
if (*str == '!') {
|
||||
str++;
|
||||
enable = false;
|
||||
}
|
||||
|
||||
for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
|
||||
osi = &osi_setup_entries[i];
|
||||
if (!strcmp(osi->string, str)) {
|
||||
osi->enable = enable;
|
||||
break;
|
||||
} else if (osi->string[0] == '\0') {
|
||||
osi->enable = enable;
|
||||
strncpy(osi->string, str, OSI_STRING_LENGTH_MAX);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __init set_osi_linux(unsigned int enable)
|
||||
{
|
||||
if (osi_linux.enable != enable) {
|
||||
if (osi_linux.enable != enable)
|
||||
osi_linux.enable = enable;
|
||||
printk(KERN_NOTICE PREFIX "%sed _OSI(Linux)\n",
|
||||
enable ? "Add": "Delet");
|
||||
}
|
||||
|
||||
if (osi_linux.enable)
|
||||
acpi_osi_setup("Linux");
|
||||
|
@ -1073,7 +1109,8 @@ static void __init set_osi_linux(unsigned int enable)
|
|||
|
||||
static void __init acpi_cmdline_osi_linux(unsigned int enable)
|
||||
{
|
||||
osi_linux.cmdline = 1; /* cmdline set the default */
|
||||
osi_linux.cmdline = 1; /* cmdline set the default and override DMI */
|
||||
osi_linux.dmi = 0;
|
||||
set_osi_linux(enable);
|
||||
|
||||
return;
|
||||
|
@ -1081,15 +1118,12 @@ static void __init acpi_cmdline_osi_linux(unsigned int enable)
|
|||
|
||||
void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
|
||||
{
|
||||
osi_linux.dmi = 1; /* DMI knows that this box asks OSI(Linux) */
|
||||
|
||||
printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
|
||||
|
||||
if (enable == -1)
|
||||
return;
|
||||
|
||||
osi_linux.known = 1; /* DMI knows which OSI(Linux) default needed */
|
||||
|
||||
osi_linux.dmi = 1; /* DMI knows that this box asks OSI(Linux) */
|
||||
set_osi_linux(enable);
|
||||
|
||||
return;
|
||||
|
@ -1104,37 +1138,44 @@ void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
|
|||
*/
|
||||
static void __init acpi_osi_setup_late(void)
|
||||
{
|
||||
char *str = osi_setup_string;
|
||||
struct osi_setup_entry *osi;
|
||||
char *str;
|
||||
int i;
|
||||
acpi_status status;
|
||||
|
||||
if (*str == '\0')
|
||||
return;
|
||||
for (i = 0; i < OSI_STRING_ENTRIES_MAX; i++) {
|
||||
osi = &osi_setup_entries[i];
|
||||
str = osi->string;
|
||||
|
||||
if (!strcmp("!Linux", str)) {
|
||||
acpi_cmdline_osi_linux(0); /* !enable */
|
||||
} else if (*str == '!') {
|
||||
if (acpi_remove_interface(++str) == AE_OK)
|
||||
printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
|
||||
} else if (!strcmp("Linux", str)) {
|
||||
acpi_cmdline_osi_linux(1); /* enable */
|
||||
} else {
|
||||
if (acpi_install_interface(str) == AE_OK)
|
||||
printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
|
||||
if (*str == '\0')
|
||||
break;
|
||||
if (osi->enable) {
|
||||
status = acpi_install_interface(str);
|
||||
|
||||
if (ACPI_SUCCESS(status))
|
||||
printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
|
||||
} else {
|
||||
status = acpi_remove_interface(str);
|
||||
|
||||
if (ACPI_SUCCESS(status))
|
||||
printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int __init acpi_osi_setup(char *str)
|
||||
static int __init osi_setup(char *str)
|
||||
{
|
||||
if (str == NULL || *str == '\0') {
|
||||
printk(KERN_INFO PREFIX "_OSI method disabled\n");
|
||||
acpi_gbl_create_osi_method = FALSE;
|
||||
} else {
|
||||
strncpy(osi_setup_string, str, OSI_STRING_LENGTH_MAX);
|
||||
}
|
||||
if (str && !strcmp("Linux", str))
|
||||
acpi_cmdline_osi_linux(1);
|
||||
else if (str && !strcmp("!Linux", str))
|
||||
acpi_cmdline_osi_linux(0);
|
||||
else
|
||||
acpi_osi_setup(str);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("acpi_osi=", acpi_osi_setup);
|
||||
__setup("acpi_osi=", osi_setup);
|
||||
|
||||
/* enable serialization to combat AE_ALREADY_EXISTS errors */
|
||||
static int __init acpi_serialize_setup(char *str)
|
||||
|
@ -1530,7 +1571,7 @@ acpi_status __init acpi_os_initialize(void)
|
|||
return AE_OK;
|
||||
}
|
||||
|
||||
acpi_status acpi_os_initialize1(void)
|
||||
acpi_status __init acpi_os_initialize1(void)
|
||||
{
|
||||
kacpid_wq = create_workqueue("kacpid");
|
||||
kacpi_notify_wq = create_workqueue("kacpi_notify");
|
||||
|
|
|
@ -213,11 +213,13 @@ static int acpi_power_on(acpi_handle handle)
|
|||
resource->name));
|
||||
} else {
|
||||
result = __acpi_power_on(resource);
|
||||
if (result)
|
||||
resource->ref_count--;
|
||||
}
|
||||
|
||||
mutex_unlock(&resource->resource_lock);
|
||||
|
||||
return 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
static int acpi_power_off_device(acpi_handle handle)
|
||||
|
@ -465,10 +467,12 @@ int acpi_power_transition(struct acpi_device *device, int state)
|
|||
struct acpi_handle_list *tl = NULL; /* Target Resources */
|
||||
int i = 0;
|
||||
|
||||
|
||||
if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3))
|
||||
return -EINVAL;
|
||||
|
||||
if (device->power.state == state)
|
||||
return 0;
|
||||
|
||||
if ((device->power.state < ACPI_STATE_D0)
|
||||
|| (device->power.state > ACPI_STATE_D3))
|
||||
return -ENODEV;
|
||||
|
@ -488,10 +492,6 @@ int acpi_power_transition(struct acpi_device *device, int state)
|
|||
goto end;
|
||||
}
|
||||
|
||||
if (device->power.state == state) {
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Then we dereference all power resources used in the current list.
|
||||
*/
|
||||
|
|
|
@ -156,15 +156,6 @@ static int cpufreq_set_cur_state(unsigned int cpu, int state)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_thermal_cpufreq_increase(unsigned int cpu)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static int acpi_thermal_cpufreq_decrease(unsigned int cpu)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
int acpi_processor_get_limit_info(struct acpi_processor *pr)
|
||||
|
|
|
@ -27,8 +27,6 @@
|
|||
|
||||
static u8 sleep_states[ACPI_S_STATE_COUNT];
|
||||
|
||||
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
||||
|
||||
static void acpi_sleep_tts_switch(u32 acpi_state)
|
||||
{
|
||||
union acpi_object in_arg = { ACPI_TYPE_INTEGER };
|
||||
|
@ -81,6 +79,8 @@ static int acpi_sleep_prepare(u32 acpi_state)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
static u32 acpi_target_sleep_state = ACPI_STATE_S0;
|
||||
|
||||
/*
|
||||
* The ACPI specification wants us to save NVS memory regions during hibernation
|
||||
* and to restore them during the subsequent resume. Windows does that also for
|
||||
|
@ -427,6 +427,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "VPCEB1Z1E"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = init_nvs_nosave,
|
||||
.ident = "Sony Vaio VGN-NW130D",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "VGN-NW130D"),
|
||||
},
|
||||
},
|
||||
{},
|
||||
};
|
||||
#endif /* CONFIG_SUSPEND */
|
||||
|
|
|
@ -154,7 +154,7 @@ static int __init adummy_init(void)
|
|||
err = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
atm_dev = atm_dev_register(DEV_LABEL, &adummy_ops, -1, NULL);
|
||||
atm_dev = atm_dev_register(DEV_LABEL, NULL, &adummy_ops, -1, NULL);
|
||||
if (!atm_dev) {
|
||||
printk(KERN_ERR DEV_LABEL ": atm_dev_register() failed\n");
|
||||
err = -ENODEV;
|
||||
|
|
|
@ -2244,7 +2244,8 @@ static int __devinit amb_probe(struct pci_dev *pci_dev, const struct pci_device_
|
|||
goto out_reset;
|
||||
}
|
||||
|
||||
dev->atm_dev = atm_dev_register (DEV_LABEL, &amb_ops, -1, NULL);
|
||||
dev->atm_dev = atm_dev_register (DEV_LABEL, &pci_dev->dev, &amb_ops, -1,
|
||||
NULL);
|
||||
if (!dev->atm_dev) {
|
||||
PRINTD (DBG_ERR, "failed to register Madge ATM adapter");
|
||||
err = -EINVAL;
|
||||
|
|
|
@ -366,7 +366,7 @@ static int atmtcp_create(int itf,int persist,struct atm_dev **result)
|
|||
if (!dev_data)
|
||||
return -ENOMEM;
|
||||
|
||||
dev = atm_dev_register(DEV_LABEL,&atmtcp_v_dev_ops,itf,NULL);
|
||||
dev = atm_dev_register(DEV_LABEL,NULL,&atmtcp_v_dev_ops,itf,NULL);
|
||||
if (!dev) {
|
||||
kfree(dev_data);
|
||||
return itf == -1 ? -ENOMEM : -EBUSY;
|
||||
|
|
|
@ -2244,7 +2244,7 @@ static int __devinit eni_init_one(struct pci_dev *pci_dev,
|
|||
&zeroes);
|
||||
if (!cpu_zeroes) goto out1;
|
||||
}
|
||||
dev = atm_dev_register(DEV_LABEL,&ops,-1,NULL);
|
||||
dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!dev) goto out2;
|
||||
pci_set_drvdata(pci_dev, dev);
|
||||
eni_dev->pci_dev = pci_dev;
|
||||
|
|
|
@ -1911,7 +1911,7 @@ static int __devinit firestream_init_one (struct pci_dev *pci_dev,
|
|||
fs_dev, sizeof (struct fs_dev));
|
||||
if (!fs_dev)
|
||||
goto err_out;
|
||||
atm_dev = atm_dev_register("fs", &ops, -1, NULL);
|
||||
atm_dev = atm_dev_register("fs", &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!atm_dev)
|
||||
goto err_out_free_fs_dev;
|
||||
|
||||
|
|
|
@ -2567,14 +2567,14 @@ release:
|
|||
|
||||
|
||||
static int __devinit
|
||||
fore200e_register(struct fore200e* fore200e)
|
||||
fore200e_register(struct fore200e* fore200e, struct device *parent)
|
||||
{
|
||||
struct atm_dev* atm_dev;
|
||||
|
||||
DPRINTK(2, "device %s being registered\n", fore200e->name);
|
||||
|
||||
atm_dev = atm_dev_register(fore200e->bus->proc_name, &fore200e_ops, -1,
|
||||
NULL);
|
||||
atm_dev = atm_dev_register(fore200e->bus->proc_name, parent, &fore200e_ops,
|
||||
-1, NULL);
|
||||
if (atm_dev == NULL) {
|
||||
printk(FORE200E "unable to register device %s\n", fore200e->name);
|
||||
return -ENODEV;
|
||||
|
@ -2594,9 +2594,9 @@ fore200e_register(struct fore200e* fore200e)
|
|||
|
||||
|
||||
static int __devinit
|
||||
fore200e_init(struct fore200e* fore200e)
|
||||
fore200e_init(struct fore200e* fore200e, struct device *parent)
|
||||
{
|
||||
if (fore200e_register(fore200e) < 0)
|
||||
if (fore200e_register(fore200e, parent) < 0)
|
||||
return -ENODEV;
|
||||
|
||||
if (fore200e->bus->configure(fore200e) < 0)
|
||||
|
@ -2662,7 +2662,7 @@ static int __devinit fore200e_sba_probe(struct platform_device *op,
|
|||
|
||||
sprintf(fore200e->name, "%s-%d", bus->model_name, index);
|
||||
|
||||
err = fore200e_init(fore200e);
|
||||
err = fore200e_init(fore200e, &op->dev);
|
||||
if (err < 0) {
|
||||
fore200e_shutdown(fore200e);
|
||||
kfree(fore200e);
|
||||
|
@ -2740,7 +2740,7 @@ fore200e_pca_detect(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent
|
|||
|
||||
sprintf(fore200e->name, "%s-%d", bus->model_name, index);
|
||||
|
||||
err = fore200e_init(fore200e);
|
||||
err = fore200e_init(fore200e, &pci_dev->dev);
|
||||
if (err < 0) {
|
||||
fore200e_shutdown(fore200e);
|
||||
goto out_free;
|
||||
|
|
|
@ -366,7 +366,7 @@ he_init_one(struct pci_dev *pci_dev, const struct pci_device_id *pci_ent)
|
|||
goto init_one_failure;
|
||||
}
|
||||
|
||||
atm_dev = atm_dev_register(DEV_LABEL, &he_ops, -1, NULL);
|
||||
atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &he_ops, -1, NULL);
|
||||
if (!atm_dev) {
|
||||
err = -ENODEV;
|
||||
goto init_one_failure;
|
||||
|
|
|
@ -2733,7 +2733,8 @@ static int __devinit hrz_probe(struct pci_dev *pci_dev, const struct pci_device_
|
|||
PRINTD(DBG_INFO, "found Madge ATM adapter (hrz) at: IO %x, IRQ %u, MEM %p",
|
||||
iobase, irq, membase);
|
||||
|
||||
dev->atm_dev = atm_dev_register(DEV_LABEL, &hrz_ops, -1, NULL);
|
||||
dev->atm_dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &hrz_ops, -1,
|
||||
NULL);
|
||||
if (!(dev->atm_dev)) {
|
||||
PRINTD(DBG_ERR, "failed to register Madge ATM adapter");
|
||||
err = -EINVAL;
|
||||
|
|
|
@ -3698,7 +3698,8 @@ idt77252_init_one(struct pci_dev *pcidev, const struct pci_device_id *id)
|
|||
goto err_out_iounmap;
|
||||
}
|
||||
|
||||
dev = atm_dev_register("idt77252", &idt77252_ops, -1, NULL);
|
||||
dev = atm_dev_register("idt77252", &pcidev->dev, &idt77252_ops, -1,
|
||||
NULL);
|
||||
if (!dev) {
|
||||
printk("%s: can't register atm device\n", card->name);
|
||||
err = -EIO;
|
||||
|
|
|
@ -3172,7 +3172,7 @@ static int __devinit ia_init_one(struct pci_dev *pdev,
|
|||
ret = -ENODEV;
|
||||
goto err_out_free_iadev;
|
||||
}
|
||||
dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL);
|
||||
dev = atm_dev_register(DEV_LABEL, &pdev->dev, &ops, -1, NULL);
|
||||
if (!dev) {
|
||||
ret = -ENOMEM;
|
||||
goto err_out_disable_dev;
|
||||
|
|
|
@ -2591,7 +2591,7 @@ static int __devinit lanai_init_one(struct pci_dev *pci,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
atmdev = atm_dev_register(DEV_LABEL, &ops, -1, NULL);
|
||||
atmdev = atm_dev_register(DEV_LABEL, &pci->dev, &ops, -1, NULL);
|
||||
if (atmdev == NULL) {
|
||||
printk(KERN_ERR DEV_LABEL
|
||||
": couldn't register atm device!\n");
|
||||
|
|
|
@ -771,7 +771,8 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
|
|||
}
|
||||
|
||||
/* Register device */
|
||||
card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL);
|
||||
card->atmdev = atm_dev_register("nicstar", &card->pcidev->dev, &atm_ops,
|
||||
-1, NULL);
|
||||
if (card->atmdev == NULL) {
|
||||
printk("nicstar%d: can't register device.\n", i);
|
||||
error = 17;
|
||||
|
|
|
@ -166,7 +166,7 @@ static irqreturn_t solos_irq(int irq, void *dev_id);
|
|||
static struct atm_vcc* find_vcc(struct atm_dev *dev, short vpi, int vci);
|
||||
static int list_vccs(int vci);
|
||||
static void release_vccs(struct atm_dev *dev);
|
||||
static int atm_init(struct solos_card *);
|
||||
static int atm_init(struct solos_card *, struct device *);
|
||||
static void atm_remove(struct solos_card *);
|
||||
static int send_command(struct solos_card *card, int dev, const char *buf, size_t size);
|
||||
static void solos_bh(unsigned long);
|
||||
|
@ -1210,7 +1210,7 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
if (db_firmware_upgrade)
|
||||
flash_upgrade(card, 3);
|
||||
|
||||
err = atm_init(card);
|
||||
err = atm_init(card, &dev->dev);
|
||||
if (err)
|
||||
goto out_free_irq;
|
||||
|
||||
|
@ -1233,7 +1233,7 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int atm_init(struct solos_card *card)
|
||||
static int atm_init(struct solos_card *card, struct device *parent)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -1244,7 +1244,7 @@ static int atm_init(struct solos_card *card)
|
|||
skb_queue_head_init(&card->tx_queue[i]);
|
||||
skb_queue_head_init(&card->cli_queue[i]);
|
||||
|
||||
card->atmdev[i] = atm_dev_register("solos-pci", &fpga_ops, -1, NULL);
|
||||
card->atmdev[i] = atm_dev_register("solos-pci", parent, &fpga_ops, -1, NULL);
|
||||
if (!card->atmdev[i]) {
|
||||
dev_err(&card->dev->dev, "Could not register ATM device %d\n", i);
|
||||
atm_remove(card);
|
||||
|
|
|
@ -1597,7 +1597,7 @@ static int __devinit zatm_init_one(struct pci_dev *pci_dev,
|
|||
goto out;
|
||||
}
|
||||
|
||||
dev = atm_dev_register(DEV_LABEL, &ops, -1, NULL);
|
||||
dev = atm_dev_register(DEV_LABEL, &pci_dev->dev, &ops, -1, NULL);
|
||||
if (!dev)
|
||||
goto out_free;
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ struct blk_shadow {
|
|||
static DEFINE_MUTEX(blkfront_mutex);
|
||||
static const struct block_device_operations xlvbd_block_fops;
|
||||
|
||||
#define BLK_RING_SIZE __RING_SIZE((struct blkif_sring *)0, PAGE_SIZE)
|
||||
#define BLK_RING_SIZE __CONST_RING_SIZE(blkif, PAGE_SIZE)
|
||||
|
||||
/*
|
||||
* We have one of these per vbd, whether ide, scsi or 'other'. They
|
||||
|
|
|
@ -35,6 +35,10 @@
|
|||
static struct usb_device_id ath3k_table[] = {
|
||||
/* Atheros AR3011 */
|
||||
{ USB_DEVICE(0x0CF3, 0x3000) },
|
||||
|
||||
/* Atheros AR3011 with sflash firmware*/
|
||||
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
|
|
|
@ -99,6 +99,9 @@ static struct usb_device_id blacklist_table[] = {
|
|||
/* Broadcom BCM2033 without firmware */
|
||||
{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Atheros 3011 with sflash firmware */
|
||||
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Broadcom BCM2035 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
@ -239,7 +242,8 @@ static void btusb_intr_complete(struct urb *urb)
|
|||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err < 0) {
|
||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||
if (err != -EPERM)
|
||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||
hdev->name, urb, -err);
|
||||
usb_unanchor_urb(urb);
|
||||
}
|
||||
|
@ -323,7 +327,8 @@ static void btusb_bulk_complete(struct urb *urb)
|
|||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err < 0) {
|
||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||
if (err != -EPERM)
|
||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||
hdev->name, urb, -err);
|
||||
usb_unanchor_urb(urb);
|
||||
}
|
||||
|
@ -412,7 +417,8 @@ static void btusb_isoc_complete(struct urb *urb)
|
|||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
if (err < 0) {
|
||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||
if (err != -EPERM)
|
||||
BT_ERR("%s urb %p failed to resubmit (%d)",
|
||||
hdev->name, urb, -err);
|
||||
usb_unanchor_urb(urb);
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Evgeniy Polyakov <zbr@ioremap.net>");
|
||||
MODULE_DESCRIPTION("Generic userspace <-> kernelspace connector.");
|
||||
MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_CONNECTOR);
|
||||
|
||||
static struct cn_dev cdev;
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
ifeq ($(CONFIG_DMADEVICES_DEBUG),y)
|
||||
EXTRA_CFLAGS += -DDEBUG
|
||||
ccflags-y += -DDEBUG
|
||||
endif
|
||||
ifeq ($(CONFIG_DMADEVICES_VDEBUG),y)
|
||||
EXTRA_CFLAGS += -DVERBOSE_DEBUG
|
||||
ccflags-y += -DVERBOSE_DEBUG
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_DMA_ENGINE) += dmaengine.o
|
||||
|
|
|
@ -722,7 +722,7 @@ atc_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl,
|
|||
desc->lli.daddr = mem;
|
||||
desc->lli.ctrla = ctrla
|
||||
| ATC_DST_WIDTH(mem_width)
|
||||
| len >> mem_width;
|
||||
| len >> reg_width;
|
||||
desc->lli.ctrlb = ctrlb;
|
||||
|
||||
if (!first) {
|
||||
|
|
|
@ -50,9 +50,11 @@ static void dma_init(struct fsldma_chan *chan)
|
|||
* EIE - Error interrupt enable
|
||||
* EOSIE - End of segments interrupt enable (basic mode)
|
||||
* EOLNIE - End of links interrupt enable
|
||||
* BWC - Bandwidth sharing among channels
|
||||
*/
|
||||
DMA_OUT(chan, &chan->regs->mr, FSL_DMA_MR_EIE
|
||||
| FSL_DMA_MR_EOLNIE | FSL_DMA_MR_EOSIE, 32);
|
||||
DMA_OUT(chan, &chan->regs->mr, FSL_DMA_MR_BWC
|
||||
| FSL_DMA_MR_EIE | FSL_DMA_MR_EOLNIE
|
||||
| FSL_DMA_MR_EOSIE, 32);
|
||||
break;
|
||||
case FSL_DMA_IP_83XX:
|
||||
/* Set the channel to below modes:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved.
|
||||
* Copyright (C) 2007-2010 Freescale Semiconductor, Inc. All rights reserved.
|
||||
*
|
||||
* Author:
|
||||
* Zhang Wei <wei.zhang@freescale.com>, Jul 2007
|
||||
|
@ -36,6 +36,13 @@
|
|||
#define FSL_DMA_MR_DAHE 0x00002000
|
||||
#define FSL_DMA_MR_SAHE 0x00001000
|
||||
|
||||
/*
|
||||
* Bandwidth/pause control determines how many bytes a given
|
||||
* channel is allowed to transfer before the DMA engine pauses
|
||||
* the current channel and switches to the next channel
|
||||
*/
|
||||
#define FSL_DMA_MR_BWC 0x08000000
|
||||
|
||||
/* Special MR definition for MPC8349 */
|
||||
#define FSL_DMA_MR_EOTIE 0x00000080
|
||||
#define FSL_DMA_MR_PRC_RM 0x00000800
|
||||
|
|
|
@ -379,7 +379,7 @@ static int __init imxdma_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
|
||||
err_init:
|
||||
while (i-- >= 0) {
|
||||
while (--i >= 0) {
|
||||
struct imxdma_channel *imxdmac = &imxdma->channel[i];
|
||||
imx_dma_free(imxdmac->imxdma_channel);
|
||||
}
|
||||
|
|
|
@ -951,7 +951,7 @@ static struct dma_async_tx_descriptor *sdma_prep_slave_sg(
|
|||
struct sdma_buffer_descriptor *bd = &sdmac->bd[i];
|
||||
int param;
|
||||
|
||||
bd->buffer_addr = sgl->dma_address;
|
||||
bd->buffer_addr = sg->dma_address;
|
||||
|
||||
count = sg->length;
|
||||
|
||||
|
@ -1385,7 +1385,7 @@ static int __init sdma_module_init(void)
|
|||
{
|
||||
return platform_driver_probe(&sdma_driver, sdma_probe);
|
||||
}
|
||||
subsys_initcall(sdma_module_init);
|
||||
module_init(sdma_module_init);
|
||||
|
||||
MODULE_AUTHOR("Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>");
|
||||
MODULE_DESCRIPTION("i.MX SDMA driver");
|
||||
|
|
|
@ -1075,7 +1075,6 @@ static int mid_setup_dma(struct pci_dev *pdev)
|
|||
if (NULL == dma->dma_pool) {
|
||||
pr_err("ERR_MDMA:pci_pool_create failed\n");
|
||||
err = -ENOMEM;
|
||||
kfree(dma);
|
||||
goto err_dma_pool;
|
||||
}
|
||||
|
||||
|
@ -1186,7 +1185,6 @@ err_engine:
|
|||
free_irq(pdev->irq, dma);
|
||||
err_irq:
|
||||
pci_pool_destroy(dma->dma_pool);
|
||||
kfree(dma);
|
||||
err_dma_pool:
|
||||
pr_err("ERR_MDMA:setup_dma failed: %d\n", err);
|
||||
return err;
|
||||
|
@ -1413,7 +1411,7 @@ static const struct dev_pm_ops intel_mid_dma_pm = {
|
|||
.runtime_idle = dma_runtime_idle,
|
||||
};
|
||||
|
||||
static struct pci_driver intel_mid_dma_pci = {
|
||||
static struct pci_driver intel_mid_dma_pci_driver = {
|
||||
.name = "Intel MID DMA",
|
||||
.id_table = intel_mid_dma_ids,
|
||||
.probe = intel_mid_dma_probe,
|
||||
|
@ -1431,13 +1429,13 @@ static int __init intel_mid_dma_init(void)
|
|||
{
|
||||
pr_debug("INFO_MDMA: LNW DMA Driver Version %s\n",
|
||||
INTEL_MID_DMA_DRIVER_VERSION);
|
||||
return pci_register_driver(&intel_mid_dma_pci);
|
||||
return pci_register_driver(&intel_mid_dma_pci_driver);
|
||||
}
|
||||
fs_initcall(intel_mid_dma_init);
|
||||
|
||||
static void __exit intel_mid_dma_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&intel_mid_dma_pci);
|
||||
pci_unregister_driver(&intel_mid_dma_pci_driver);
|
||||
}
|
||||
module_exit(intel_mid_dma_exit);
|
||||
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
obj-$(CONFIG_INTEL_IOATDMA) += ioatdma.o
|
||||
ioatdma-objs := pci.o dma.o dma_v2.o dma_v3.o dca.o
|
||||
ioatdma-y := pci.o dma.o dma_v2.o dma_v3.o dca.o
|
||||
|
|
|
@ -259,11 +259,6 @@ static void pdc_dostart(struct pch_dma_chan *pd_chan, struct pch_dma_desc* desc)
|
|||
return;
|
||||
}
|
||||
|
||||
channel_writel(pd_chan, DEV_ADDR, desc->regs.dev_addr);
|
||||
channel_writel(pd_chan, MEM_ADDR, desc->regs.mem_addr);
|
||||
channel_writel(pd_chan, SIZE, desc->regs.size);
|
||||
channel_writel(pd_chan, NEXT, desc->regs.next);
|
||||
|
||||
dev_dbg(chan2dev(&pd_chan->chan), "chan %d -> dev_addr: %x\n",
|
||||
pd_chan->chan.chan_id, desc->regs.dev_addr);
|
||||
dev_dbg(chan2dev(&pd_chan->chan), "chan %d -> mem_addr: %x\n",
|
||||
|
@ -273,10 +268,16 @@ static void pdc_dostart(struct pch_dma_chan *pd_chan, struct pch_dma_desc* desc)
|
|||
dev_dbg(chan2dev(&pd_chan->chan), "chan %d -> next: %x\n",
|
||||
pd_chan->chan.chan_id, desc->regs.next);
|
||||
|
||||
if (list_empty(&desc->tx_list))
|
||||
if (list_empty(&desc->tx_list)) {
|
||||
channel_writel(pd_chan, DEV_ADDR, desc->regs.dev_addr);
|
||||
channel_writel(pd_chan, MEM_ADDR, desc->regs.mem_addr);
|
||||
channel_writel(pd_chan, SIZE, desc->regs.size);
|
||||
channel_writel(pd_chan, NEXT, desc->regs.next);
|
||||
pdc_set_mode(&pd_chan->chan, DMA_CTL0_ONESHOT);
|
||||
else
|
||||
} else {
|
||||
channel_writel(pd_chan, NEXT, desc->txd.phys);
|
||||
pdc_set_mode(&pd_chan->chan, DMA_CTL0_SG);
|
||||
}
|
||||
|
||||
val = dma_readl(pd, CTL2);
|
||||
val |= 1 << (DMA_CTL2_START_SHIFT_BITS + pd_chan->chan.chan_id);
|
||||
|
|
|
@ -4449,9 +4449,8 @@ static int __devinit ppc440spe_adma_probe(struct platform_device *ofdev,
|
|||
|
||||
if (!request_mem_region(res.start, resource_size(&res),
|
||||
dev_driver_string(&ofdev->dev))) {
|
||||
dev_err(&ofdev->dev, "failed to request memory region "
|
||||
"(0x%016llx-0x%016llx)\n",
|
||||
(u64)res.start, (u64)res.end);
|
||||
dev_err(&ofdev->dev, "failed to request memory region %pR\n",
|
||||
&res);
|
||||
initcode = PPC_ADMA_INIT_MEMREG;
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
|
|
|
@ -1572,7 +1572,7 @@ static int f10_match_to_this_node(struct amd64_pvt *pvt, int dram_range,
|
|||
debugf1(" HoleOffset=0x%x HoleValid=0x%x IntlvSel=0x%x\n",
|
||||
hole_off, hole_valid, intlv_sel);
|
||||
|
||||
if (intlv_en ||
|
||||
if (intlv_en &&
|
||||
(intlv_sel != ((sys_addr >> 12) & intlv_en)))
|
||||
return -EINVAL;
|
||||
|
||||
|
|
|
@ -41,10 +41,10 @@
|
|||
#define MC_PROC_NAME_MAX_LEN 7
|
||||
|
||||
#if PAGE_SHIFT < 20
|
||||
#define PAGES_TO_MiB( pages ) ( ( pages ) >> ( 20 - PAGE_SHIFT ) )
|
||||
#define MiB_TO_PAGES(mb) ((mb) >> (20 - PAGE_SHIFT))
|
||||
#define PAGES_TO_MiB(pages) ((pages) >> (20 - PAGE_SHIFT))
|
||||
#define MiB_TO_PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
|
||||
#else /* PAGE_SHIFT > 20 */
|
||||
#define PAGES_TO_MiB( pages ) ( ( pages ) << ( PAGE_SHIFT - 20 ) )
|
||||
#define PAGES_TO_MiB(pages) ((pages) << (PAGE_SHIFT - 20))
|
||||
#define MiB_TO_PAGES(mb) ((mb) >> (PAGE_SHIFT - 20))
|
||||
#endif
|
||||
|
||||
|
|
|
@ -586,14 +586,16 @@ struct mem_ctl_info *edac_mc_del_mc(struct device *dev)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* marking MCI offline */
|
||||
mci->op_state = OP_OFFLINE;
|
||||
|
||||
del_mc_from_global_list(mci);
|
||||
mutex_unlock(&mem_ctls_mutex);
|
||||
|
||||
/* flush workq processes and remove sysfs */
|
||||
/* flush workq processes */
|
||||
edac_mc_workq_teardown(mci);
|
||||
|
||||
/* marking MCI offline */
|
||||
mci->op_state = OP_OFFLINE;
|
||||
|
||||
/* remove from sysfs */
|
||||
edac_remove_sysfs_mci_device(mci);
|
||||
|
||||
edac_printk(KERN_INFO, EDAC_MC,
|
||||
|
|
|
@ -242,6 +242,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
|
|||
|
||||
static char ohci_driver_name[] = KBUILD_MODNAME;
|
||||
|
||||
#define PCI_DEVICE_ID_AGERE_FW643 0x5901
|
||||
#define PCI_DEVICE_ID_JMICRON_JMB38X_FW 0x2380
|
||||
#define PCI_DEVICE_ID_TI_TSB12LV22 0x8009
|
||||
|
||||
|
@ -253,18 +254,34 @@ static char ohci_driver_name[] = KBUILD_MODNAME;
|
|||
|
||||
/* In case of multiple matches in ohci_quirks[], only the first one is used. */
|
||||
static const struct {
|
||||
unsigned short vendor, device, flags;
|
||||
unsigned short vendor, device, revision, flags;
|
||||
} ohci_quirks[] = {
|
||||
{PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, QUIRK_CYCLE_TIMER |
|
||||
QUIRK_RESET_PACKET |
|
||||
QUIRK_NO_1394A},
|
||||
{PCI_VENDOR_ID_TI, PCI_ANY_ID, QUIRK_RESET_PACKET},
|
||||
{PCI_VENDOR_ID_AL, PCI_ANY_ID, QUIRK_CYCLE_TIMER},
|
||||
{PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, QUIRK_NO_MSI},
|
||||
{PCI_VENDOR_ID_NEC, PCI_ANY_ID, QUIRK_CYCLE_TIMER},
|
||||
{PCI_VENDOR_ID_VIA, PCI_ANY_ID, QUIRK_CYCLE_TIMER},
|
||||
{PCI_VENDOR_ID_RICOH, PCI_ANY_ID, QUIRK_CYCLE_TIMER},
|
||||
{PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_FW, QUIRK_BE_HEADERS},
|
||||
{PCI_VENDOR_ID_AL, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER},
|
||||
|
||||
{PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_UNI_N_FW, PCI_ANY_ID,
|
||||
QUIRK_BE_HEADERS},
|
||||
|
||||
{PCI_VENDOR_ID_ATT, PCI_DEVICE_ID_AGERE_FW643, 6,
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB38X_FW, PCI_ANY_ID,
|
||||
QUIRK_NO_MSI},
|
||||
|
||||
{PCI_VENDOR_ID_NEC, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER},
|
||||
|
||||
{PCI_VENDOR_ID_RICOH, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER},
|
||||
|
||||
{PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_TSB12LV22, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER | QUIRK_RESET_PACKET | QUIRK_NO_1394A},
|
||||
|
||||
{PCI_VENDOR_ID_TI, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_RESET_PACKET},
|
||||
|
||||
{PCI_VENDOR_ID_VIA, PCI_ANY_ID, PCI_ANY_ID,
|
||||
QUIRK_CYCLE_TIMER | QUIRK_NO_MSI},
|
||||
};
|
||||
|
||||
/* This overrides anything that was found in ohci_quirks[]. */
|
||||
|
@ -2927,9 +2944,11 @@ static int __devinit pci_probe(struct pci_dev *dev,
|
|||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ohci_quirks); i++)
|
||||
if (ohci_quirks[i].vendor == dev->vendor &&
|
||||
(ohci_quirks[i].device == dev->device ||
|
||||
ohci_quirks[i].device == (unsigned short)PCI_ANY_ID)) {
|
||||
if ((ohci_quirks[i].vendor == dev->vendor) &&
|
||||
(ohci_quirks[i].device == (unsigned short)PCI_ANY_ID ||
|
||||
ohci_quirks[i].device == dev->device) &&
|
||||
(ohci_quirks[i].revision == (unsigned short)PCI_ANY_ID ||
|
||||
ohci_quirks[i].revision >= dev->revision)) {
|
||||
ohci->quirks = ohci_quirks[i].flags;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -156,12 +156,12 @@ static struct drm_conn_prop_enum_list drm_connector_enum_list[] =
|
|||
{ DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 },
|
||||
{ DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 },
|
||||
{ DRM_MODE_CONNECTOR_Component, "Component", 0 },
|
||||
{ DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN", 0 },
|
||||
{ DRM_MODE_CONNECTOR_DisplayPort, "DisplayPort", 0 },
|
||||
{ DRM_MODE_CONNECTOR_HDMIA, "HDMI Type A", 0 },
|
||||
{ DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 },
|
||||
{ DRM_MODE_CONNECTOR_9PinDIN, "DIN", 0 },
|
||||
{ DRM_MODE_CONNECTOR_DisplayPort, "DP", 0 },
|
||||
{ DRM_MODE_CONNECTOR_HDMIA, "HDMI-A", 0 },
|
||||
{ DRM_MODE_CONNECTOR_HDMIB, "HDMI-B", 0 },
|
||||
{ DRM_MODE_CONNECTOR_TV, "TV", 0 },
|
||||
{ DRM_MODE_CONNECTOR_eDP, "Embedded DisplayPort", 0 },
|
||||
{ DRM_MODE_CONNECTOR_eDP, "eDP", 0 },
|
||||
};
|
||||
|
||||
static struct drm_prop_enum_list drm_encoder_enum_list[] =
|
||||
|
|
|
@ -628,7 +628,7 @@ static int drm_queue_vblank_event(struct drm_device *dev, int pipe,
|
|||
if ((seq - vblwait->request.sequence) <= (1 << 23)) {
|
||||
e->event.tv_sec = now.tv_sec;
|
||||
e->event.tv_usec = now.tv_usec;
|
||||
drm_vblank_put(dev, e->pipe);
|
||||
drm_vblank_put(dev, pipe);
|
||||
list_add_tail(&e->base.link, &e->base.file_priv->event_list);
|
||||
wake_up_interruptible(&e->base.file_priv->event_wait);
|
||||
trace_drm_vblank_event_delivered(current->pid, pipe,
|
||||
|
@ -645,7 +645,7 @@ err_unlock:
|
|||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
kfree(e);
|
||||
err_put:
|
||||
drm_vblank_put(dev, e->pipe);
|
||||
drm_vblank_put(dev, pipe);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -878,12 +878,15 @@ void r600_pcie_gart_tlb_flush(struct radeon_device *rdev)
|
|||
u32 tmp;
|
||||
|
||||
/* flush hdp cache so updates hit vram */
|
||||
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) {
|
||||
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
|
||||
!(rdev->flags & RADEON_IS_AGP)) {
|
||||
void __iomem *ptr = (void *)rdev->gart.table.vram.ptr;
|
||||
u32 tmp;
|
||||
|
||||
/* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
|
||||
* rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
|
||||
* This seems to cause problems on some AGP cards. Just use the old
|
||||
* method for them.
|
||||
*/
|
||||
WREG32(HDP_DEBUG1, 0);
|
||||
tmp = readl((void __iomem *)ptr);
|
||||
|
@ -3485,10 +3488,12 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev)
|
|||
void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
|
||||
{
|
||||
/* r7xx hw bug. write to HDP_DEBUG1 followed by fb read
|
||||
* rather than write to HDP_REG_COHERENCY_FLUSH_CNTL
|
||||
* rather than write to HDP_REG_COHERENCY_FLUSH_CNTL.
|
||||
* This seems to cause problems on some AGP cards. Just use the old
|
||||
* method for them.
|
||||
*/
|
||||
if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) &&
|
||||
rdev->vram_scratch.ptr) {
|
||||
rdev->vram_scratch.ptr && !(rdev->flags & RADEON_IS_AGP)) {
|
||||
void __iomem *ptr = (void *)rdev->vram_scratch.ptr;
|
||||
u32 tmp;
|
||||
|
||||
|
|
|
@ -916,27 +916,27 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
|
|||
int nr = sensor_attr->index;
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct adm1026_data *data = i2c_get_clientdata(client);
|
||||
int val, orig_div, new_div, shift;
|
||||
int val, orig_div, new_div;
|
||||
|
||||
val = simple_strtol(buf, NULL, 10);
|
||||
new_div = DIV_TO_REG(val);
|
||||
if (new_div == 0) {
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
orig_div = data->fan_div[nr];
|
||||
data->fan_div[nr] = DIV_FROM_REG(new_div);
|
||||
|
||||
if (nr < 4) { /* 0 <= nr < 4 */
|
||||
shift = 2 * nr;
|
||||
adm1026_write_value(client, ADM1026_REG_FAN_DIV_0_3,
|
||||
((DIV_TO_REG(orig_div) & (~(0x03 << shift))) |
|
||||
(new_div << shift)));
|
||||
(DIV_TO_REG(data->fan_div[0]) << 0) |
|
||||
(DIV_TO_REG(data->fan_div[1]) << 2) |
|
||||
(DIV_TO_REG(data->fan_div[2]) << 4) |
|
||||
(DIV_TO_REG(data->fan_div[3]) << 6));
|
||||
} else { /* 3 < nr < 8 */
|
||||
shift = 2 * (nr - 4);
|
||||
adm1026_write_value(client, ADM1026_REG_FAN_DIV_4_7,
|
||||
((DIV_TO_REG(orig_div) & (~(0x03 << (2 * shift)))) |
|
||||
(new_div << shift)));
|
||||
(DIV_TO_REG(data->fan_div[4]) << 0) |
|
||||
(DIV_TO_REG(data->fan_div[5]) << 2) |
|
||||
(DIV_TO_REG(data->fan_div[6]) << 4) |
|
||||
(DIV_TO_REG(data->fan_div[7]) << 6));
|
||||
}
|
||||
|
||||
if (data->fan_div[nr] != orig_div) {
|
||||
|
|
|
@ -187,6 +187,7 @@ static const u8 IT87_REG_FANX_MIN[] = { 0x1b, 0x1c, 0x1d, 0x85, 0x87 };
|
|||
#define IT87_REG_FAN_MAIN_CTRL 0x13
|
||||
#define IT87_REG_FAN_CTL 0x14
|
||||
#define IT87_REG_PWM(nr) (0x15 + (nr))
|
||||
#define IT87_REG_PWM_DUTY(nr) (0x63 + (nr) * 8)
|
||||
|
||||
#define IT87_REG_VIN(nr) (0x20 + (nr))
|
||||
#define IT87_REG_TEMP(nr) (0x29 + (nr))
|
||||
|
@ -251,12 +252,16 @@ struct it87_data {
|
|||
u8 fan_main_ctrl; /* Register value */
|
||||
u8 fan_ctl; /* Register value */
|
||||
|
||||
/* The following 3 arrays correspond to the same registers. The
|
||||
* meaning of bits 6-0 depends on the value of bit 7, and we want
|
||||
* to preserve settings on mode changes, so we have to track all
|
||||
* values separately. */
|
||||
/* The following 3 arrays correspond to the same registers up to
|
||||
* the IT8720F. The meaning of bits 6-0 depends on the value of bit
|
||||
* 7, and we want to preserve settings on mode changes, so we have
|
||||
* to track all values separately.
|
||||
* Starting with the IT8721F, the manual PWM duty cycles are stored
|
||||
* in separate registers (8-bit values), so the separate tracking
|
||||
* is no longer needed, but it is still done to keep the driver
|
||||
* simple. */
|
||||
u8 pwm_ctrl[3]; /* Register value */
|
||||
u8 pwm_duty[3]; /* Manual PWM value set by user (bit 6-0) */
|
||||
u8 pwm_duty[3]; /* Manual PWM value set by user */
|
||||
u8 pwm_temp_map[3]; /* PWM to temp. chan. mapping (bits 1-0) */
|
||||
|
||||
/* Automatic fan speed control registers */
|
||||
|
@ -832,7 +837,9 @@ static ssize_t set_pwm_enable(struct device *dev,
|
|||
data->fan_main_ctrl);
|
||||
} else {
|
||||
if (val == 1) /* Manual mode */
|
||||
data->pwm_ctrl[nr] = data->pwm_duty[nr];
|
||||
data->pwm_ctrl[nr] = data->type == it8721 ?
|
||||
data->pwm_temp_map[nr] :
|
||||
data->pwm_duty[nr];
|
||||
else /* Automatic mode */
|
||||
data->pwm_ctrl[nr] = 0x80 | data->pwm_temp_map[nr];
|
||||
it87_write_value(data, IT87_REG_PWM(nr), data->pwm_ctrl[nr]);
|
||||
|
@ -858,12 +865,25 @@ static ssize_t set_pwm(struct device *dev, struct device_attribute *attr,
|
|||
return -EINVAL;
|
||||
|
||||
mutex_lock(&data->update_lock);
|
||||
data->pwm_duty[nr] = pwm_to_reg(data, val);
|
||||
/* If we are in manual mode, write the duty cycle immediately;
|
||||
* otherwise, just store it for later use. */
|
||||
if (!(data->pwm_ctrl[nr] & 0x80)) {
|
||||
data->pwm_ctrl[nr] = data->pwm_duty[nr];
|
||||
it87_write_value(data, IT87_REG_PWM(nr), data->pwm_ctrl[nr]);
|
||||
if (data->type == it8721) {
|
||||
/* If we are in automatic mode, the PWM duty cycle register
|
||||
* is read-only so we can't write the value */
|
||||
if (data->pwm_ctrl[nr] & 0x80) {
|
||||
mutex_unlock(&data->update_lock);
|
||||
return -EBUSY;
|
||||
}
|
||||
data->pwm_duty[nr] = pwm_to_reg(data, val);
|
||||
it87_write_value(data, IT87_REG_PWM_DUTY(nr),
|
||||
data->pwm_duty[nr]);
|
||||
} else {
|
||||
data->pwm_duty[nr] = pwm_to_reg(data, val);
|
||||
/* If we are in manual mode, write the duty cycle immediately;
|
||||
* otherwise, just store it for later use. */
|
||||
if (!(data->pwm_ctrl[nr] & 0x80)) {
|
||||
data->pwm_ctrl[nr] = data->pwm_duty[nr];
|
||||
it87_write_value(data, IT87_REG_PWM(nr),
|
||||
data->pwm_ctrl[nr]);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&data->update_lock);
|
||||
return count;
|
||||
|
@ -1958,7 +1978,10 @@ static void __devinit it87_init_device(struct platform_device *pdev)
|
|||
* channels to use when later setting to automatic mode later.
|
||||
* Use a 1:1 mapping by default (we are clueless.)
|
||||
* In both cases, the value can (and should) be changed by the user
|
||||
* prior to switching to a different mode. */
|
||||
* prior to switching to a different mode.
|
||||
* Note that this is no longer needed for the IT8721F and later, as
|
||||
* these have separate registers for the temperature mapping and the
|
||||
* manual duty cycle. */
|
||||
for (i = 0; i < 3; i++) {
|
||||
data->pwm_temp_map[i] = i;
|
||||
data->pwm_duty[i] = 0x7f; /* Full speed */
|
||||
|
@ -2034,10 +2057,16 @@ static void __devinit it87_init_device(struct platform_device *pdev)
|
|||
static void it87_update_pwm_ctrl(struct it87_data *data, int nr)
|
||||
{
|
||||
data->pwm_ctrl[nr] = it87_read_value(data, IT87_REG_PWM(nr));
|
||||
if (data->pwm_ctrl[nr] & 0x80) /* Automatic mode */
|
||||
if (data->type == it8721) {
|
||||
data->pwm_temp_map[nr] = data->pwm_ctrl[nr] & 0x03;
|
||||
else /* Manual mode */
|
||||
data->pwm_duty[nr] = data->pwm_ctrl[nr] & 0x7f;
|
||||
data->pwm_duty[nr] = it87_read_value(data,
|
||||
IT87_REG_PWM_DUTY(nr));
|
||||
} else {
|
||||
if (data->pwm_ctrl[nr] & 0x80) /* Automatic mode */
|
||||
data->pwm_temp_map[nr] = data->pwm_ctrl[nr] & 0x03;
|
||||
else /* Manual mode */
|
||||
data->pwm_duty[nr] = data->pwm_ctrl[nr] & 0x7f;
|
||||
}
|
||||
|
||||
if (has_old_autopwm(data)) {
|
||||
int i;
|
||||
|
|
|
@ -205,7 +205,6 @@ LTC4215_ALARM(curr1_max_alarm, (1 << 2), LTC4215_STATUS);
|
|||
|
||||
/* Power (virtual) */
|
||||
LTC4215_POWER(power1_input);
|
||||
LTC4215_ALARM(power1_alarm, (1 << 3), LTC4215_STATUS);
|
||||
|
||||
/* Input Voltage */
|
||||
LTC4215_VOLTAGE(in1_input, LTC4215_ADIN);
|
||||
|
@ -214,6 +213,7 @@ LTC4215_ALARM(in1_min_alarm, (1 << 1), LTC4215_STATUS);
|
|||
|
||||
/* Output Voltage */
|
||||
LTC4215_VOLTAGE(in2_input, LTC4215_SOURCE);
|
||||
LTC4215_ALARM(in2_min_alarm, (1 << 3), LTC4215_STATUS);
|
||||
|
||||
/* Finally, construct an array of pointers to members of the above objects,
|
||||
* as required for sysfs_create_group()
|
||||
|
@ -223,13 +223,13 @@ static struct attribute *ltc4215_attributes[] = {
|
|||
&sensor_dev_attr_curr1_max_alarm.dev_attr.attr,
|
||||
|
||||
&sensor_dev_attr_power1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_power1_alarm.dev_attr.attr,
|
||||
|
||||
&sensor_dev_attr_in1_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_max_alarm.dev_attr.attr,
|
||||
&sensor_dev_attr_in1_min_alarm.dev_attr.attr,
|
||||
|
||||
&sensor_dev_attr_in2_input.dev_attr.attr,
|
||||
&sensor_dev_attr_in2_min_alarm.dev_attr.attr,
|
||||
|
||||
NULL,
|
||||
};
|
||||
|
|
|
@ -999,7 +999,7 @@ static int __devinit intel_mid_i2c_probe(struct pci_dev *dev,
|
|||
|
||||
/* Initialize struct members */
|
||||
snprintf(mrst->adap.name, sizeof(mrst->adap.name),
|
||||
"MRST/Medfield I2C at %lx", start);
|
||||
"Intel MID I2C at %lx", start);
|
||||
mrst->adap.owner = THIS_MODULE;
|
||||
mrst->adap.algo = &intel_mid_i2c_algorithm;
|
||||
mrst->adap.dev.parent = &dev->dev;
|
||||
|
|
|
@ -273,8 +273,6 @@ static int intel_idle_probe(void)
|
|||
|
||||
pr_debug(PREFIX "MWAIT substates: 0x%x\n", mwait_substates);
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
|
||||
lapic_timer_reliable_states = 0xFFFFFFFF;
|
||||
|
||||
if (boot_cpu_data.x86 != 6) /* family 6 */
|
||||
return -ENODEV;
|
||||
|
@ -286,8 +284,6 @@ static int intel_idle_probe(void)
|
|||
case 0x1F: /* Core i7 and i5 Processor - Nehalem */
|
||||
case 0x2E: /* Nehalem-EX Xeon */
|
||||
case 0x2F: /* Westmere-EX Xeon */
|
||||
lapic_timer_reliable_states = (1 << 1); /* C1 */
|
||||
|
||||
case 0x25: /* Westmere */
|
||||
case 0x2C: /* Westmere */
|
||||
cpuidle_state_table = nehalem_cstates;
|
||||
|
@ -295,7 +291,6 @@ static int intel_idle_probe(void)
|
|||
|
||||
case 0x1C: /* 28 - Atom Processor */
|
||||
case 0x26: /* 38 - Lincroft Atom Processor */
|
||||
lapic_timer_reliable_states = (1 << 1); /* C1 */
|
||||
cpuidle_state_table = atom_cstates;
|
||||
break;
|
||||
|
||||
|
@ -303,10 +298,6 @@ static int intel_idle_probe(void)
|
|||
case 0x2D: /* SNB Xeon */
|
||||
cpuidle_state_table = snb_cstates;
|
||||
break;
|
||||
#ifdef FUTURE_USE
|
||||
case 0x17: /* 23 - Core 2 Duo */
|
||||
lapic_timer_reliable_states = (1 << 2) | (1 << 1); /* C2, C1 */
|
||||
#endif
|
||||
|
||||
default:
|
||||
pr_debug(PREFIX "does not run on family %d model %d\n",
|
||||
|
@ -314,6 +305,9 @@ static int intel_idle_probe(void)
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_ARAT)) /* Always Reliable APIC Timer */
|
||||
lapic_timer_reliable_states = 0xFFFFFFFF;
|
||||
|
||||
pr_debug(PREFIX "v" INTEL_IDLE_VERSION
|
||||
" model 0x%X\n", boot_cpu_data.x86_model);
|
||||
|
||||
|
|
|
@ -893,68 +893,81 @@ out:
|
|||
return ret ? ret : in_len;
|
||||
}
|
||||
|
||||
static int copy_wc_to_user(void __user *dest, struct ib_wc *wc)
|
||||
{
|
||||
struct ib_uverbs_wc tmp;
|
||||
|
||||
tmp.wr_id = wc->wr_id;
|
||||
tmp.status = wc->status;
|
||||
tmp.opcode = wc->opcode;
|
||||
tmp.vendor_err = wc->vendor_err;
|
||||
tmp.byte_len = wc->byte_len;
|
||||
tmp.ex.imm_data = (__u32 __force) wc->ex.imm_data;
|
||||
tmp.qp_num = wc->qp->qp_num;
|
||||
tmp.src_qp = wc->src_qp;
|
||||
tmp.wc_flags = wc->wc_flags;
|
||||
tmp.pkey_index = wc->pkey_index;
|
||||
tmp.slid = wc->slid;
|
||||
tmp.sl = wc->sl;
|
||||
tmp.dlid_path_bits = wc->dlid_path_bits;
|
||||
tmp.port_num = wc->port_num;
|
||||
tmp.reserved = 0;
|
||||
|
||||
if (copy_to_user(dest, &tmp, sizeof tmp))
|
||||
return -EFAULT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
ssize_t ib_uverbs_poll_cq(struct ib_uverbs_file *file,
|
||||
const char __user *buf, int in_len,
|
||||
int out_len)
|
||||
{
|
||||
struct ib_uverbs_poll_cq cmd;
|
||||
struct ib_uverbs_poll_cq_resp *resp;
|
||||
struct ib_uverbs_poll_cq_resp resp;
|
||||
u8 __user *header_ptr;
|
||||
u8 __user *data_ptr;
|
||||
struct ib_cq *cq;
|
||||
struct ib_wc *wc;
|
||||
int ret = 0;
|
||||
int i;
|
||||
int rsize;
|
||||
struct ib_wc wc;
|
||||
int ret;
|
||||
|
||||
if (copy_from_user(&cmd, buf, sizeof cmd))
|
||||
return -EFAULT;
|
||||
|
||||
wc = kmalloc(cmd.ne * sizeof *wc, GFP_KERNEL);
|
||||
if (!wc)
|
||||
return -ENOMEM;
|
||||
|
||||
rsize = sizeof *resp + cmd.ne * sizeof(struct ib_uverbs_wc);
|
||||
resp = kmalloc(rsize, GFP_KERNEL);
|
||||
if (!resp) {
|
||||
ret = -ENOMEM;
|
||||
goto out_wc;
|
||||
}
|
||||
|
||||
cq = idr_read_cq(cmd.cq_handle, file->ucontext, 0);
|
||||
if (!cq) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
if (!cq)
|
||||
return -EINVAL;
|
||||
|
||||
/* we copy a struct ib_uverbs_poll_cq_resp to user space */
|
||||
header_ptr = (void __user *)(unsigned long) cmd.response;
|
||||
data_ptr = header_ptr + sizeof resp;
|
||||
|
||||
memset(&resp, 0, sizeof resp);
|
||||
while (resp.count < cmd.ne) {
|
||||
ret = ib_poll_cq(cq, 1, &wc);
|
||||
if (ret < 0)
|
||||
goto out_put;
|
||||
if (!ret)
|
||||
break;
|
||||
|
||||
ret = copy_wc_to_user(data_ptr, &wc);
|
||||
if (ret)
|
||||
goto out_put;
|
||||
|
||||
data_ptr += sizeof(struct ib_uverbs_wc);
|
||||
++resp.count;
|
||||
}
|
||||
|
||||
resp->count = ib_poll_cq(cq, cmd.ne, wc);
|
||||
|
||||
put_cq_read(cq);
|
||||
|
||||
for (i = 0; i < resp->count; i++) {
|
||||
resp->wc[i].wr_id = wc[i].wr_id;
|
||||
resp->wc[i].status = wc[i].status;
|
||||
resp->wc[i].opcode = wc[i].opcode;
|
||||
resp->wc[i].vendor_err = wc[i].vendor_err;
|
||||
resp->wc[i].byte_len = wc[i].byte_len;
|
||||
resp->wc[i].ex.imm_data = (__u32 __force) wc[i].ex.imm_data;
|
||||
resp->wc[i].qp_num = wc[i].qp->qp_num;
|
||||
resp->wc[i].src_qp = wc[i].src_qp;
|
||||
resp->wc[i].wc_flags = wc[i].wc_flags;
|
||||
resp->wc[i].pkey_index = wc[i].pkey_index;
|
||||
resp->wc[i].slid = wc[i].slid;
|
||||
resp->wc[i].sl = wc[i].sl;
|
||||
resp->wc[i].dlid_path_bits = wc[i].dlid_path_bits;
|
||||
resp->wc[i].port_num = wc[i].port_num;
|
||||
}
|
||||
|
||||
if (copy_to_user((void __user *) (unsigned long) cmd.response, resp, rsize))
|
||||
if (copy_to_user(header_ptr, &resp, sizeof resp)) {
|
||||
ret = -EFAULT;
|
||||
goto out_put;
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(resp);
|
||||
ret = in_len;
|
||||
|
||||
out_wc:
|
||||
kfree(wc);
|
||||
return ret ? ret : in_len;
|
||||
out_put:
|
||||
put_cq_read(cq);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ssize_t ib_uverbs_req_notify_cq(struct ib_uverbs_file *file,
|
||||
|
|
|
@ -371,10 +371,15 @@ static void md_end_flush(struct bio *bio, int err)
|
|||
bio_put(bio);
|
||||
}
|
||||
|
||||
static void submit_flushes(mddev_t *mddev)
|
||||
static void md_submit_flush_data(struct work_struct *ws);
|
||||
|
||||
static void submit_flushes(struct work_struct *ws)
|
||||
{
|
||||
mddev_t *mddev = container_of(ws, mddev_t, flush_work);
|
||||
mdk_rdev_t *rdev;
|
||||
|
||||
INIT_WORK(&mddev->flush_work, md_submit_flush_data);
|
||||
atomic_set(&mddev->flush_pending, 1);
|
||||
rcu_read_lock();
|
||||
list_for_each_entry_rcu(rdev, &mddev->disks, same_set)
|
||||
if (rdev->raid_disk >= 0 &&
|
||||
|
@ -397,6 +402,8 @@ static void submit_flushes(mddev_t *mddev)
|
|||
rdev_dec_pending(rdev, mddev);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
if (atomic_dec_and_test(&mddev->flush_pending))
|
||||
queue_work(md_wq, &mddev->flush_work);
|
||||
}
|
||||
|
||||
static void md_submit_flush_data(struct work_struct *ws)
|
||||
|
@ -404,8 +411,6 @@ static void md_submit_flush_data(struct work_struct *ws)
|
|||
mddev_t *mddev = container_of(ws, mddev_t, flush_work);
|
||||
struct bio *bio = mddev->flush_bio;
|
||||
|
||||
atomic_set(&mddev->flush_pending, 1);
|
||||
|
||||
if (bio->bi_size == 0)
|
||||
/* an empty barrier - all done */
|
||||
bio_endio(bio, 0);
|
||||
|
@ -414,10 +419,9 @@ static void md_submit_flush_data(struct work_struct *ws)
|
|||
if (mddev->pers->make_request(mddev, bio))
|
||||
generic_make_request(bio);
|
||||
}
|
||||
if (atomic_dec_and_test(&mddev->flush_pending)) {
|
||||
mddev->flush_bio = NULL;
|
||||
wake_up(&mddev->sb_wait);
|
||||
}
|
||||
|
||||
mddev->flush_bio = NULL;
|
||||
wake_up(&mddev->sb_wait);
|
||||
}
|
||||
|
||||
void md_flush_request(mddev_t *mddev, struct bio *bio)
|
||||
|
@ -429,13 +433,8 @@ void md_flush_request(mddev_t *mddev, struct bio *bio)
|
|||
mddev->flush_bio = bio;
|
||||
spin_unlock_irq(&mddev->write_lock);
|
||||
|
||||
atomic_set(&mddev->flush_pending, 1);
|
||||
INIT_WORK(&mddev->flush_work, md_submit_flush_data);
|
||||
|
||||
submit_flushes(mddev);
|
||||
|
||||
if (atomic_dec_and_test(&mddev->flush_pending))
|
||||
queue_work(md_wq, &mddev->flush_work);
|
||||
INIT_WORK(&mddev->flush_work, submit_flushes);
|
||||
queue_work(md_wq, &mddev->flush_work);
|
||||
}
|
||||
EXPORT_SYMBOL(md_flush_request);
|
||||
|
||||
|
@ -5160,7 +5159,7 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
|
|||
PTR_ERR(rdev));
|
||||
return PTR_ERR(rdev);
|
||||
}
|
||||
/* set save_raid_disk if appropriate */
|
||||
/* set saved_raid_disk if appropriate */
|
||||
if (!mddev->persistent) {
|
||||
if (info->state & (1<<MD_DISK_SYNC) &&
|
||||
info->raid_disk < mddev->raid_disks)
|
||||
|
@ -5170,7 +5169,10 @@ static int add_new_disk(mddev_t * mddev, mdu_disk_info_t *info)
|
|||
} else
|
||||
super_types[mddev->major_version].
|
||||
validate_super(mddev, rdev);
|
||||
rdev->saved_raid_disk = rdev->raid_disk;
|
||||
if (test_bit(In_sync, &rdev->flags))
|
||||
rdev->saved_raid_disk = rdev->raid_disk;
|
||||
else
|
||||
rdev->saved_raid_disk = -1;
|
||||
|
||||
clear_bit(In_sync, &rdev->flags); /* just to be sure */
|
||||
if (info->state & (1<<MD_DISK_WRITEMOSTLY))
|
||||
|
@ -6042,9 +6044,8 @@ static int md_thread(void * arg)
|
|||
|| kthread_should_stop(),
|
||||
thread->timeout);
|
||||
|
||||
clear_bit(THREAD_WAKEUP, &thread->flags);
|
||||
|
||||
thread->run(thread->mddev);
|
||||
if (test_and_clear_bit(THREAD_WAKEUP, &thread->flags))
|
||||
thread->run(thread->mddev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2397,13 +2397,13 @@ static int run(mddev_t *mddev)
|
|||
return 0;
|
||||
|
||||
out_free_conf:
|
||||
md_unregister_thread(mddev->thread);
|
||||
if (conf->r10bio_pool)
|
||||
mempool_destroy(conf->r10bio_pool);
|
||||
safe_put_page(conf->tmppage);
|
||||
kfree(conf->mirrors);
|
||||
kfree(conf);
|
||||
mddev->private = NULL;
|
||||
md_unregister_thread(mddev->thread);
|
||||
out:
|
||||
return -EIO;
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ struct pxa2xx_flash_info {
|
|||
static const char *probes[] = { "RedBoot", "cmdlinepart", NULL };
|
||||
|
||||
|
||||
static int __init pxa2xx_flash_probe(struct platform_device *pdev)
|
||||
static int __devinit pxa2xx_flash_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct flash_platform_data *flash = pdev->dev.platform_data;
|
||||
struct pxa2xx_flash_info *info;
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#define CONFIG_MTD_NAND_OMAP_HWECC
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
|
|
@ -381,11 +381,11 @@ static void b44_set_flow_ctrl(struct b44 *bp, u32 local, u32 remote)
|
|||
__b44_set_flow_ctrl(bp, pause_enab);
|
||||
}
|
||||
|
||||
#ifdef SSB_DRIVER_MIPS
|
||||
extern char *nvram_get(char *name);
|
||||
#ifdef CONFIG_BCM47XX
|
||||
#include <asm/mach-bcm47xx/nvram.h>
|
||||
static void b44_wap54g10_workaround(struct b44 *bp)
|
||||
{
|
||||
const char *str;
|
||||
char buf[20];
|
||||
u32 val;
|
||||
int err;
|
||||
|
||||
|
@ -394,10 +394,9 @@ static void b44_wap54g10_workaround(struct b44 *bp)
|
|||
* see https://dev.openwrt.org/ticket/146
|
||||
* check and reset bit "isolate"
|
||||
*/
|
||||
str = nvram_get("boardnum");
|
||||
if (!str)
|
||||
if (nvram_getenv("boardnum", buf, sizeof(buf)) < 0)
|
||||
return;
|
||||
if (simple_strtoul(str, NULL, 0) == 2) {
|
||||
if (simple_strtoul(buf, NULL, 0) == 2) {
|
||||
err = __b44_readphy(bp, 0, MII_BMCR, &val);
|
||||
if (err)
|
||||
goto error;
|
||||
|
|
|
@ -1235,7 +1235,7 @@ int be_cmd_multicast_set(struct be_adapter *adapter, u32 if_id,
|
|||
|
||||
i = 0;
|
||||
netdev_for_each_mc_addr(ha, netdev)
|
||||
memcpy(req->mac[i].byte, ha->addr, ETH_ALEN);
|
||||
memcpy(req->mac[i++].byte, ha->addr, ETH_ALEN);
|
||||
} else {
|
||||
req->promiscuous = 1;
|
||||
}
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
* (you will need to reboot afterwards) */
|
||||
/* #define BNX2X_STOP_ON_ERROR */
|
||||
|
||||
#define DRV_MODULE_VERSION "1.60.00-4"
|
||||
#define DRV_MODULE_RELDATE "2010/11/01"
|
||||
#define DRV_MODULE_VERSION "1.60.01-0"
|
||||
#define DRV_MODULE_RELDATE "2010/11/12"
|
||||
#define BNX2X_BC_VER 0x040200
|
||||
|
||||
#define BNX2X_MULTI_QUEUE
|
||||
|
|
|
@ -1782,15 +1782,15 @@ exit_lbl:
|
|||
}
|
||||
#endif
|
||||
|
||||
static inline void bnx2x_set_pbd_gso_e2(struct sk_buff *skb,
|
||||
struct eth_tx_parse_bd_e2 *pbd,
|
||||
u32 xmit_type)
|
||||
static inline void bnx2x_set_pbd_gso_e2(struct sk_buff *skb, u32 *parsing_data,
|
||||
u32 xmit_type)
|
||||
{
|
||||
pbd->parsing_data |= cpu_to_le16(skb_shinfo(skb)->gso_size) <<
|
||||
ETH_TX_PARSE_BD_E2_LSO_MSS_SHIFT;
|
||||
*parsing_data |= (skb_shinfo(skb)->gso_size <<
|
||||
ETH_TX_PARSE_BD_E2_LSO_MSS_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_LSO_MSS;
|
||||
if ((xmit_type & XMIT_GSO_V6) &&
|
||||
(ipv6_hdr(skb)->nexthdr == NEXTHDR_IPV6))
|
||||
pbd->parsing_data |= ETH_TX_PARSE_BD_E2_IPV6_WITH_EXT_HDR;
|
||||
*parsing_data |= ETH_TX_PARSE_BD_E2_IPV6_WITH_EXT_HDR;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1835,15 +1835,15 @@ static inline void bnx2x_set_pbd_gso(struct sk_buff *skb,
|
|||
* @return header len
|
||||
*/
|
||||
static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
|
||||
struct eth_tx_parse_bd_e2 *pbd,
|
||||
u32 xmit_type)
|
||||
u32 *parsing_data, u32 xmit_type)
|
||||
{
|
||||
pbd->parsing_data |= cpu_to_le16(tcp_hdrlen(skb)/4) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT;
|
||||
*parsing_data |= ((tcp_hdrlen(skb)/4) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
|
||||
|
||||
pbd->parsing_data |= cpu_to_le16(((unsigned char *)tcp_hdr(skb) -
|
||||
skb->data) / 2) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT;
|
||||
*parsing_data |= ((((u8 *)tcp_hdr(skb) - skb->data) / 2) <<
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT) &
|
||||
ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W;
|
||||
|
||||
return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
|
||||
}
|
||||
|
@ -1912,6 +1912,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL;
|
||||
struct eth_tx_parse_bd_e1x *pbd_e1x = NULL;
|
||||
struct eth_tx_parse_bd_e2 *pbd_e2 = NULL;
|
||||
u32 pbd_e2_parsing_data = 0;
|
||||
u16 pkt_prod, bd_prod;
|
||||
int nbd, fp_index;
|
||||
dma_addr_t mapping;
|
||||
|
@ -2033,8 +2034,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
memset(pbd_e2, 0, sizeof(struct eth_tx_parse_bd_e2));
|
||||
/* Set PBD in checksum offload case */
|
||||
if (xmit_type & XMIT_CSUM)
|
||||
hlen = bnx2x_set_pbd_csum_e2(bp,
|
||||
skb, pbd_e2, xmit_type);
|
||||
hlen = bnx2x_set_pbd_csum_e2(bp, skb,
|
||||
&pbd_e2_parsing_data,
|
||||
xmit_type);
|
||||
} else {
|
||||
pbd_e1x = &fp->tx_desc_ring[bd_prod].parse_bd_e1x;
|
||||
memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x));
|
||||
|
@ -2076,10 +2078,18 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|||
bd_prod = bnx2x_tx_split(bp, fp, tx_buf, &tx_start_bd,
|
||||
hlen, bd_prod, ++nbd);
|
||||
if (CHIP_IS_E2(bp))
|
||||
bnx2x_set_pbd_gso_e2(skb, pbd_e2, xmit_type);
|
||||
bnx2x_set_pbd_gso_e2(skb, &pbd_e2_parsing_data,
|
||||
xmit_type);
|
||||
else
|
||||
bnx2x_set_pbd_gso(skb, pbd_e1x, xmit_type);
|
||||
}
|
||||
|
||||
/* Set the PBD's parsing_data field if not zero
|
||||
* (for the chips newer than 57711).
|
||||
*/
|
||||
if (pbd_e2_parsing_data)
|
||||
pbd_e2->parsing_data = cpu_to_le32(pbd_e2_parsing_data);
|
||||
|
||||
tx_data_bd = (struct eth_tx_bd *)tx_start_bd;
|
||||
|
||||
/* Handle fragmented skb */
|
||||
|
|
|
@ -838,7 +838,7 @@ static void bnx2x_qm_init_ptr_table(struct bnx2x *bp, int qm_cid_count,
|
|||
/****************************************************************************
|
||||
* SRC initializations
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef BCM_CNIC
|
||||
/* called during init func stage */
|
||||
static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,
|
||||
dma_addr_t t2_mapping, int src_cid_count)
|
||||
|
@ -862,5 +862,5 @@ static void bnx2x_src_init_t2(struct bnx2x *bp, struct src_ent *t2,
|
|||
U64_HI((u64)t2_mapping +
|
||||
(src_cid_count-1) * sizeof(struct src_ent)));
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif /* BNX2X_INIT_OPS_H */
|
||||
|
|
|
@ -171,7 +171,7 @@ MODULE_PARM_DESC(resend_igmp, "Number of IGMP membership reports to send on link
|
|||
/*----------------------------- Global variables ----------------------------*/
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
cpumask_var_t netpoll_block_tx;
|
||||
atomic_t netpoll_block_tx = ATOMIC_INIT(0);
|
||||
#endif
|
||||
|
||||
static const char * const version =
|
||||
|
@ -1576,7 +1576,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
|||
|
||||
/* If this is the first slave, then we need to set the master's hardware
|
||||
* address to be the same as the slave's. */
|
||||
if (bond->slave_cnt == 0)
|
||||
if (is_zero_ether_addr(bond->dev->dev_addr))
|
||||
memcpy(bond->dev->dev_addr, slave_dev->dev_addr,
|
||||
slave_dev->addr_len);
|
||||
|
||||
|
@ -5299,13 +5299,6 @@ static int __init bonding_init(void)
|
|||
if (res)
|
||||
goto out;
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
if (!alloc_cpumask_var(&netpoll_block_tx, GFP_KERNEL)) {
|
||||
res = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
#endif
|
||||
|
||||
res = register_pernet_subsys(&bond_net_ops);
|
||||
if (res)
|
||||
goto out;
|
||||
|
@ -5334,9 +5327,6 @@ err:
|
|||
rtnl_link_unregister(&bond_link_ops);
|
||||
err_link:
|
||||
unregister_pernet_subsys(&bond_net_ops);
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
free_cpumask_var(netpoll_block_tx);
|
||||
#endif
|
||||
goto out;
|
||||
|
||||
}
|
||||
|
@ -5353,7 +5343,10 @@ static void __exit bonding_exit(void)
|
|||
unregister_pernet_subsys(&bond_net_ops);
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
free_cpumask_var(netpoll_block_tx);
|
||||
/*
|
||||
* Make sure we don't have an imbalance on our netpoll blocking
|
||||
*/
|
||||
WARN_ON(atomic_read(&netpoll_block_tx));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -119,26 +119,22 @@
|
|||
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
extern cpumask_var_t netpoll_block_tx;
|
||||
extern atomic_t netpoll_block_tx;
|
||||
|
||||
static inline void block_netpoll_tx(void)
|
||||
{
|
||||
preempt_disable();
|
||||
BUG_ON(cpumask_test_and_set_cpu(smp_processor_id(),
|
||||
netpoll_block_tx));
|
||||
atomic_inc(&netpoll_block_tx);
|
||||
}
|
||||
|
||||
static inline void unblock_netpoll_tx(void)
|
||||
{
|
||||
BUG_ON(!cpumask_test_and_clear_cpu(smp_processor_id(),
|
||||
netpoll_block_tx));
|
||||
preempt_enable();
|
||||
atomic_dec(&netpoll_block_tx);
|
||||
}
|
||||
|
||||
static inline int is_netpoll_tx_blocked(struct net_device *dev)
|
||||
{
|
||||
if (unlikely(dev->priv_flags & IFF_IN_NETPOLL))
|
||||
return cpumask_test_cpu(smp_processor_id(), netpoll_block_tx);
|
||||
return atomic_read(&netpoll_block_tx);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ":" __func__ "():" fmt
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ":" fmt
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/init.h>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* License terms: GNU General Public License (GPL) version 2
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ":" __func__ "():" fmt
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ":" fmt
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/sched.h>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue