Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
242898be
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
242898be
编写于
18年前
作者:
J
Jeff Garzik
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'master' into upstream
上级
6bbad18a
9f737633
变更
94
隐藏空白更改
内联
并排
Showing
94 changed file
with
1133 addition
and
723 deletion
+1133
-723
Documentation/cpu-freq/user-guide.txt
Documentation/cpu-freq/user-guide.txt
+4
-1
Documentation/sysctl/kernel.txt
Documentation/sysctl/kernel.txt
+2
-3
MAINTAINERS
MAINTAINERS
+15
-0
Makefile
Makefile
+1
-1
arch/i386/kernel/cpu/cpufreq/Kconfig
arch/i386/kernel/cpu/cpufreq/Kconfig
+2
-1
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
+1
-2
arch/i386/kernel/cpu/cpufreq/longhaul.c
arch/i386/kernel/cpu/cpufreq/longhaul.c
+129
-92
arch/ia64/kernel/uncached.c
arch/ia64/kernel/uncached.c
+57
-29
arch/sh/kernel/cpu/sh4/sq.c
arch/sh/kernel/cpu/sh4/sq.c
+7
-3
arch/x86_64/kernel/smp.c
arch/x86_64/kernel/smp.c
+1
-1
drivers/acpi/acpi_memhotplug.c
drivers/acpi/acpi_memhotplug.c
+5
-8
drivers/char/hvsi.c
drivers/char/hvsi.c
+3
-5
drivers/char/hw_random/omap-rng.c
drivers/char/hw_random/omap-rng.c
+24
-27
drivers/char/keyboard.c
drivers/char/keyboard.c
+78
-61
drivers/cpufreq/cpufreq.c
drivers/cpufreq/cpufreq.c
+54
-21
drivers/edac/edac_mc.h
drivers/edac/edac_mc.h
+1
-0
drivers/i2c/busses/scx200_acb.c
drivers/i2c/busses/scx200_acb.c
+5
-2
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.c
+3
-0
drivers/input/evdev.c
drivers/input/evdev.c
+3
-7
drivers/input/gameport/fm801-gp.c
drivers/input/gameport/fm801-gp.c
+2
-2
drivers/input/gameport/gameport.c
drivers/input/gameport/gameport.c
+49
-17
drivers/input/input.c
drivers/input/input.c
+44
-13
drivers/input/joystick/iforce/iforce-main.c
drivers/input/joystick/iforce/iforce-main.c
+10
-9
drivers/input/joystick/spaceball.c
drivers/input/joystick/spaceball.c
+1
-1
drivers/input/keyboard/atkbd.c
drivers/input/keyboard/atkbd.c
+60
-43
drivers/input/misc/wistron_btns.c
drivers/input/misc/wistron_btns.c
+10
-10
drivers/input/mouse/logips2pp.c
drivers/input/mouse/logips2pp.c
+1
-2
drivers/input/mouse/trackpoint.c
drivers/input/mouse/trackpoint.c
+34
-18
drivers/input/serio/libps2.c
drivers/input/serio/libps2.c
+5
-0
drivers/input/serio/serio.c
drivers/input/serio/serio.c
+51
-14
drivers/isdn/hardware/eicon/divasync.h
drivers/isdn/hardware/eicon/divasync.h
+0
-1
drivers/md/linear.c
drivers/md/linear.c
+3
-3
drivers/pnp/pnpacpi/rsparser.c
drivers/pnp/pnpacpi/rsparser.c
+8
-0
drivers/usb/input/ati_remote.c
drivers/usb/input/ati_remote.c
+99
-74
drivers/usb/input/hid-input.c
drivers/usb/input/hid-input.c
+2
-1
drivers/usb/input/hiddev.c
drivers/usb/input/hiddev.c
+38
-34
drivers/video/aty/aty128fb.c
drivers/video/aty/aty128fb.c
+3
-7
drivers/video/au1100fb.c
drivers/video/au1100fb.c
+8
-10
fs/befs/linuxvfs.c
fs/befs/linuxvfs.c
+9
-2
fs/lockd/svclock.c
fs/lockd/svclock.c
+3
-9
fs/nfs/namespace.c
fs/nfs/namespace.c
+3
-1
fs/nfs/read.c
fs/nfs/read.c
+1
-1
fs/nfs/write.c
fs/nfs/write.c
+1
-1
fs/reiserfs/file.c
fs/reiserfs/file.c
+1
-1
fs/reiserfs/inode.c
fs/reiserfs/inode.c
+14
-12
fs/reiserfs/ioctl.c
fs/reiserfs/ioctl.c
+1
-1
fs/udf/ialloc.c
fs/udf/ialloc.c
+6
-5
fs/ufs/balloc.c
fs/ufs/balloc.c
+1
-1
fs/ufs/util.c
fs/ufs/util.c
+9
-8
include/linux/debug_locks.h
include/linux/debug_locks.h
+2
-0
include/linux/input.h
include/linux/input.h
+22
-2
include/linux/lockd/lockd.h
include/linux/lockd/lockd.h
+0
-1
include/linux/nfs_fs.h
include/linux/nfs_fs.h
+2
-4
include/linux/sched.h
include/linux/sched.h
+8
-0
include/linux/sunrpc/xprt.h
include/linux/sunrpc/xprt.h
+1
-1
include/linux/vmstat.h
include/linux/vmstat.h
+4
-4
include/net/red.h
include/net/red.h
+1
-1
kernel/fork.c
kernel/fork.c
+3
-1
kernel/futex.c
kernel/futex.c
+1
-0
kernel/futex_compat.c
kernel/futex_compat.c
+3
-3
kernel/power/process.c
kernel/power/process.c
+18
-8
kernel/printk.c
kernel/printk.c
+3
-1
kernel/resource.c
kernel/resource.c
+6
-3
lib/spinlock_debug.c
lib/spinlock_debug.c
+6
-4
mm/fadvise.c
mm/fadvise.c
+2
-1
mm/memory_hotplug.c
mm/memory_hotplug.c
+34
-10
net/bridge/br_netlink.c
net/bridge/br_netlink.c
+1
-1
net/ipv4/tcp_input.c
net/ipv4/tcp_input.c
+2
-1
net/lapb/lapb_iface.c
net/lapb/lapb_iface.c
+7
-5
net/llc/af_llc.c
net/llc/af_llc.c
+8
-12
net/llc/llc_sap.c
net/llc/llc_sap.c
+2
-2
net/sched/sch_api.c
net/sched/sch_api.c
+1
-1
net/sunrpc/cache.c
net/sunrpc/cache.c
+5
-1
net/sunrpc/clnt.c
net/sunrpc/clnt.c
+29
-23
net/sunrpc/rpc_pipe.c
net/sunrpc/rpc_pipe.c
+4
-2
net/sunrpc/xprt.c
net/sunrpc/xprt.c
+3
-18
net/sunrpc/xprtsock.c
net/sunrpc/xprtsock.c
+28
-1
sound/aoa/codecs/snd-aoa-codec-toonie.c
sound/aoa/codecs/snd-aoa-codec-toonie.c
+13
-4
sound/aoa/core/snd-aoa-gpio-feature.c
sound/aoa/core/snd-aoa-gpio-feature.c
+5
-2
sound/aoa/core/snd-aoa-gpio-pmf.c
sound/aoa/core/snd-aoa-gpio-pmf.c
+1
-1
sound/core/oss/mixer_oss.c
sound/core/oss/mixer_oss.c
+1
-2
sound/core/oss/pcm_oss.c
sound/core/oss/pcm_oss.c
+2
-0
sound/core/seq/seq_device.c
sound/core/seq/seq_device.c
+1
-2
sound/core/sgbuf.c
sound/core/sgbuf.c
+3
-6
sound/drivers/vx/vx_pcm.c
sound/drivers/vx/vx_pcm.c
+2
-5
sound/pci/echoaudio/echoaudio.c
sound/pci/echoaudio/echoaudio.c
+2
-2
sound/pci/emu10k1/emu10k1_main.c
sound/pci/emu10k1/emu10k1_main.c
+11
-0
sound/pci/emu10k1/irq.c
sound/pci/emu10k1/irq.c
+5
-1
sound/ppc/awacs.c
sound/ppc/awacs.c
+1
-2
sound/ppc/daca.c
sound/ppc/daca.c
+1
-2
sound/ppc/keywest.c
sound/ppc/keywest.c
+1
-2
sound/ppc/powermac.c
sound/ppc/powermac.c
+3
-10
sound/ppc/tumbler.c
sound/ppc/tumbler.c
+1
-2
sound/usb/usbaudio.c
sound/usb/usbaudio.c
+2
-4
未找到文件。
Documentation/cpu-freq/user-guide.txt
浏览文件 @
242898be
...
...
@@ -153,10 +153,13 @@ scaling_governor, and by "echoing" the name of another
that some governors won't load - they only
work on some specific architectures or
processors.
scaling_min_freq and
scaling_min_freq and
scaling_max_freq show the current "policy limits" (in
kHz). By echoing new values into these
files, you can change these limits.
NOTE: when setting a policy you need to
first set scaling_max_freq, then
scaling_min_freq.
If you have selected the "userspace" governor which allows you to
...
...
This diff is collapsed.
Click to expand it.
Documentation/sysctl/kernel.txt
浏览文件 @
242898be
...
...
@@ -211,9 +211,8 @@ Controls the kernel's behaviour when an oops or BUG is encountered.
0: try to continue operation
1: delay a few seconds (to give klogd time to record the oops output) and
then panic. If the `panic' sysctl is also non-zero then the machine will
be rebooted.
1: panic immediatly. If the `panic' sysctl is also non-zero then the
machine will be rebooted.
==============================================================
...
...
This diff is collapsed.
Click to expand it.
MAINTAINERS
浏览文件 @
242898be
...
...
@@ -298,6 +298,13 @@ L: info-linux@geode.amd.com
W: http://www.amd.com/us-en/ConnectivitySolutions/TechnicalResources/0,,50_2334_2452_11363,00.html
S: Supported
AOA (Apple Onboard Audio) ALSA DRIVER
P: Johannes Berg
M: johannes@sipsolutions.net
L: linuxppc-dev@ozlabs.org
L: alsa-devel@alsa-project.org
S: Maintained
APM DRIVER
P: Stephen Rothwell
M: sfr@canb.auug.org.au
...
...
@@ -2659,6 +2666,14 @@ M: dbrownell@users.sourceforge.net
L: spi-devel-general@lists.sourceforge.net
S: Maintained
STABLE BRANCH:
P: Greg Kroah-Hartman
M: greg@kroah.com
P: Chris Wright
M: chrisw@sous-sol.org
L: stable@kernel.org
S: Maintained
TPM DEVICE DRIVER
P: Kylene Hall
M: kjhall@us.ibm.com
...
...
This diff is collapsed.
Click to expand it.
Makefile
浏览文件 @
242898be
VERSION
=
2
PATCHLEVEL
=
6
SUBLEVEL
=
18
EXTRAVERSION
=
-rc
3
EXTRAVERSION
=
-rc
4
NAME
=
Crazed Snow-Weasel
# *DOCUMENTATION*
...
...
This diff is collapsed.
Click to expand it.
arch/i386/kernel/cpu/cpufreq/Kconfig
浏览文件 @
242898be
...
...
@@ -96,6 +96,7 @@ config X86_POWERNOW_K8_ACPI
config X86_GX_SUSPMOD
tristate "Cyrix MediaGX/NatSemi Geode Suspend Modulation"
depends on PCI
help
This add the CPUFreq driver for NatSemi Geode processors which
support suspend modulation.
...
...
@@ -202,7 +203,7 @@ config X86_LONGRUN
config X86_LONGHAUL
tristate "VIA Cyrix III Longhaul"
select CPU_FREQ_TABLE
depends on
BROKEN
depends on
ACPI_PROCESSOR
help
This adds the CPUFreq driver for VIA Samuel/CyrixIII,
VIA Cyrix Samuel/C3, VIA Cyrix Ezra and VIA Cyrix Ezra-T
...
...
This diff is collapsed.
Click to expand it.
arch/i386/kernel/cpu/cpufreq/acpi-cpufreq.c
浏览文件 @
242898be
...
...
@@ -384,8 +384,7 @@ static int acpi_cpufreq_early_init_acpi(void)
}
/* Do initialization in ACPI core */
acpi_processor_preregister_performance
(
acpi_perf_data
);
return
0
;
return
acpi_processor_preregister_performance
(
acpi_perf_data
);
}
static
int
...
...
This diff is collapsed.
Click to expand it.
arch/i386/kernel/cpu/cpufreq/longhaul.c
浏览文件 @
242898be
...
...
@@ -29,11 +29,13 @@
#include <linux/cpufreq.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/pci.h>
#include <asm/msr.h>
#include <asm/timex.h>
#include <asm/io.h>
#include <asm/acpi.h>
#include <linux/acpi.h>
#include <acpi/processor.h>
#include "longhaul.h"
...
...
@@ -56,6 +58,8 @@ static int minvid, maxvid;
static
unsigned
int
minmult
,
maxmult
;
static
int
can_scale_voltage
;
static
int
vrmrev
;
static
struct
acpi_processor
*
pr
=
NULL
;
static
struct
acpi_processor_cx
*
cx
=
NULL
;
/* Module parameters */
static
int
dont_scale_voltage
;
...
...
@@ -118,84 +122,65 @@ static int longhaul_get_cpu_mult(void)
return
eblcr_table
[
invalue
];
}
/* For processor with BCR2 MSR */
static
void
do_powersaver
(
union
msr_longhaul
*
longhaul
,
unsigned
int
clock_ratio_index
)
static
void
do_longhaul1
(
int
cx_address
,
unsigned
int
clock_ratio_index
)
{
struct
pci_dev
*
dev
;
unsigned
long
flags
;
unsigned
int
tmp_mask
;
int
version
;
int
i
;
u16
pci_cmd
;
u16
cmd_state
[
64
];
union
msr_bcr2
bcr2
;
u32
t
;
switch
(
cpu_model
)
{
case
CPU_EZRA_T
:
version
=
3
;
break
;
case
CPU_NEHEMIAH
:
version
=
0xf
;
break
;
default:
return
;
}
rdmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
/* Enable software clock multiplier */
bcr2
.
bits
.
ESOFTBF
=
1
;
bcr2
.
bits
.
CLOCKMUL
=
clock_ratio_index
;
rdmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
->
val
);
longhaul
->
bits
.
SoftBusRatio
=
clock_ratio_index
&
0xf
;
longhaul
->
bits
.
SoftBusRatio4
=
(
clock_ratio_index
&
0x10
)
>>
4
;
longhaul
->
bits
.
EnableSoftBusRatio
=
1
;
longhaul
->
bits
.
RevisionKey
=
0
;
/* Sync to timer tick */
safe_halt
();
ACPI_FLUSH_CPU_CACHE
();
/* Change frequency on next halt or sleep */
wrmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
/* Invoke C3 */
inb
(
cx_address
);
/* Dummy op - must do something useless after P_LVL3 read */
t
=
inl
(
acpi_fadt
.
xpm_tmr_blk
.
address
);
/* Disable software clock multiplier */
local_irq_disable
();
rdmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
bcr2
.
bits
.
ESOFTBF
=
0
;
wrmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
}
preempt_disable
();
local_irq_save
(
flags
);
/* For processor with Longhaul MSR */
/*
* get current pci bus master state for all devices
* and clear bus master bit
*/
dev
=
NULL
;
i
=
0
;
do
{
dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
);
if
(
dev
!=
NULL
)
{
pci_read_config_word
(
dev
,
PCI_COMMAND
,
&
pci_cmd
);
cmd_state
[
i
++
]
=
pci_cmd
;
pci_cmd
&=
~
PCI_COMMAND_MASTER
;
pci_write_config_word
(
dev
,
PCI_COMMAND
,
pci_cmd
);
}
}
while
(
dev
!=
NULL
);
static
void
do_powersaver
(
int
cx_address
,
unsigned
int
clock_ratio_index
)
{
union
msr_longhaul
longhaul
;
u32
t
;
tmp_mask
=
inb
(
0x21
);
/* works on C3. save mask. */
outb
(
0xFE
,
0x21
);
/* TMR0 only */
outb
(
0xFF
,
0x80
);
/* delay */
rdmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
.
val
);
longhaul
.
bits
.
RevisionKey
=
longhaul
.
bits
.
RevisionID
;
longhaul
.
bits
.
SoftBusRatio
=
clock_ratio_index
&
0xf
;
longhaul
.
bits
.
SoftBusRatio4
=
(
clock_ratio_index
&
0x10
)
>>
4
;
longhaul
.
bits
.
EnableSoftBusRatio
=
1
;
/* Sync to timer tick */
safe_halt
();
wrmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
->
val
);
halt
();
ACPI_FLUSH_CPU_CACHE
();
/* Change frequency on next halt or sleep */
wrmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
.
val
);
/* Invoke C3 */
inb
(
cx_address
);
/* Dummy op - must do something useless after P_LVL3 read */
t
=
inl
(
acpi_fadt
.
xpm_tmr_blk
.
address
);
/* Disable bus ratio bit */
local_irq_disable
();
outb
(
tmp_mask
,
0x21
);
/* restore mask */
/* restore pci bus master state for all devices */
dev
=
NULL
;
i
=
0
;
do
{
dev
=
pci_get_device
(
PCI_ANY_ID
,
PCI_ANY_ID
,
dev
);
if
(
dev
!=
NULL
)
{
pci_cmd
=
cmd_state
[
i
++
];
pci_write_config_byte
(
dev
,
PCI_COMMAND
,
pci_cmd
);
}
}
while
(
dev
!=
NULL
);
local_irq_restore
(
flags
);
preempt_enable
();
/* disable bus ratio bit */
rdmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
->
val
);
longhaul
->
bits
.
EnableSoftBusRatio
=
0
;
longhaul
->
bits
.
RevisionKey
=
version
;
wrmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
->
val
);
longhaul
.
bits
.
RevisionKey
=
longhaul
.
bits
.
RevisionID
;
longhaul
.
bits
.
EnableSoftBusRatio
=
0
;
longhaul
.
bits
.
EnableSoftBSEL
=
0
;
longhaul
.
bits
.
EnableSoftVID
=
0
;
wrmsrl
(
MSR_VIA_LONGHAUL
,
longhaul
.
val
);
}
/**
...
...
@@ -209,9 +194,9 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
{
int
speed
,
mult
;
struct
cpufreq_freqs
freqs
;
union
msr_longhaul
longhaul
;
union
msr_bcr2
bcr2
;
static
unsigned
int
old_ratio
=-
1
;
unsigned
long
flags
;
unsigned
int
pic1_mask
,
pic2_mask
;
if
(
old_ratio
==
clock_ratio_index
)
return
;
...
...
@@ -234,6 +219,20 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
dprintk
(
"Setting to FSB:%dMHz Mult:%d.%dx (%s)
\n
"
,
fsb
,
mult
/
10
,
mult
%
10
,
print_speed
(
speed
/
1000
));
preempt_disable
();
local_irq_save
(
flags
);
pic2_mask
=
inb
(
0xA1
);
pic1_mask
=
inb
(
0x21
);
/* works on C3. save mask. */
outb
(
0xFF
,
0xA1
);
/* Overkill */
outb
(
0xFE
,
0x21
);
/* TMR0 only */
/* Disable bus master arbitration */
if
(
pr
->
flags
.
bm_check
)
{
acpi_set_register
(
ACPI_BITREG_ARB_DISABLE
,
1
,
ACPI_MTX_DO_NOT_LOCK
);
}
switch
(
longhaul_version
)
{
/*
...
...
@@ -245,20 +244,7 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
*/
case
TYPE_LONGHAUL_V1
:
case
TYPE_LONGHAUL_V2
:
rdmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
/* Enable software clock multiplier */
bcr2
.
bits
.
ESOFTBF
=
1
;
bcr2
.
bits
.
CLOCKMUL
=
clock_ratio_index
;
local_irq_disable
();
wrmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
safe_halt
();
/* Disable software clock multiplier */
rdmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
bcr2
.
bits
.
ESOFTBF
=
0
;
local_irq_disable
();
wrmsrl
(
MSR_VIA_BCR2
,
bcr2
.
val
);
local_irq_enable
();
do_longhaul1
(
cx
->
address
,
clock_ratio_index
);
break
;
/*
...
...
@@ -273,10 +259,22 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
* to work in practice.
*/
case
TYPE_POWERSAVER
:
do_powersaver
(
&
longhaul
,
clock_ratio_index
);
do_powersaver
(
cx
->
address
,
clock_ratio_index
);
break
;
}
/* Enable bus master arbitration */
if
(
pr
->
flags
.
bm_check
)
{
acpi_set_register
(
ACPI_BITREG_ARB_DISABLE
,
0
,
ACPI_MTX_DO_NOT_LOCK
);
}
outb
(
pic2_mask
,
0xA1
);
/* restore mask */
outb
(
pic1_mask
,
0x21
);
local_irq_restore
(
flags
);
preempt_enable
();
cpufreq_notify_transition
(
&
freqs
,
CPUFREQ_POSTCHANGE
);
}
...
...
@@ -324,9 +322,11 @@ static int guess_fsb(void)
static
int
__init
longhaul_get_ranges
(
void
)
{
unsigned
long
invalue
;
unsigned
int
multipliers
[
32
]
=
{
50
,
30
,
40
,
100
,
55
,
35
,
45
,
95
,
90
,
70
,
80
,
60
,
120
,
75
,
85
,
65
,
-
1
,
110
,
120
,
-
1
,
135
,
115
,
125
,
105
,
130
,
150
,
160
,
140
,
-
1
,
155
,
-
1
,
145
};
unsigned
int
ezra_t_multipliers
[
32
]
=
{
90
,
30
,
40
,
100
,
55
,
35
,
45
,
95
,
50
,
70
,
80
,
60
,
120
,
75
,
85
,
65
,
-
1
,
110
,
120
,
-
1
,
135
,
115
,
125
,
105
,
130
,
150
,
160
,
140
,
-
1
,
155
,
-
1
,
145
};
unsigned
int
j
,
k
=
0
;
union
msr_longhaul
longhaul
;
unsigned
long
lo
,
hi
;
...
...
@@ -355,13 +355,13 @@ static int __init longhaul_get_ranges(void)
invalue
=
longhaul
.
bits
.
MaxMHzBR
;
if
(
longhaul
.
bits
.
MaxMHzBR4
)
invalue
+=
16
;
maxmult
=
multipliers
[
invalue
];
maxmult
=
ezra_t_
multipliers
[
invalue
];
invalue
=
longhaul
.
bits
.
MinMHzBR
;
if
(
longhaul
.
bits
.
MinMHzBR4
==
1
)
minmult
=
30
;
else
minmult
=
multipliers
[
invalue
];
minmult
=
ezra_t_
multipliers
[
invalue
];
fsb
=
eblcr_fsb_table_v2
[
longhaul
.
bits
.
MaxMHzFSB
];
break
;
}
...
...
@@ -527,6 +527,18 @@ static unsigned int longhaul_get(unsigned int cpu)
return
calc_speed
(
longhaul_get_cpu_mult
());
}
static
acpi_status
longhaul_walk_callback
(
acpi_handle
obj_handle
,
u32
nesting_level
,
void
*
context
,
void
**
return_value
)
{
struct
acpi_device
*
d
;
if
(
acpi_bus_get_device
(
obj_handle
,
&
d
)
)
{
return
0
;
}
*
return_value
=
(
void
*
)
acpi_driver_data
(
d
);
return
1
;
}
static
int
__init
longhaul_cpu_init
(
struct
cpufreq_policy
*
policy
)
{
...
...
@@ -534,6 +546,15 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
char
*
cpuname
=
NULL
;
int
ret
;
/* Check ACPI support for C3 state */
acpi_walk_namespace
(
ACPI_TYPE_PROCESSOR
,
ACPI_ROOT_OBJECT
,
ACPI_UINT32_MAX
,
&
longhaul_walk_callback
,
NULL
,
(
void
*
)
&
pr
);
if
(
pr
==
NULL
)
goto
err_acpi
;
cx
=
&
pr
->
power
.
states
[
ACPI_STATE_C3
];
if
(
cx
->
address
==
0
||
cx
->
latency
>
1000
)
goto
err_acpi
;
/* Now check what we have on this motherboard */
switch
(
c
->
x86_model
)
{
case
6
:
cpu_model
=
CPU_SAMUEL
;
...
...
@@ -634,6 +655,10 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
cpufreq_frequency_table_get_attr
(
longhaul_table
,
policy
->
cpu
);
return
0
;
err_acpi:
printk
(
KERN_ERR
PFX
"No ACPI support for CPU frequency changes.
\n
"
);
return
-
ENODEV
;
}
static
int
__devexit
longhaul_cpu_exit
(
struct
cpufreq_policy
*
policy
)
...
...
@@ -666,6 +691,18 @@ static int __init longhaul_init(void)
if
(
c
->
x86_vendor
!=
X86_VENDOR_CENTAUR
||
c
->
x86
!=
6
)
return
-
ENODEV
;
#ifdef CONFIG_SMP
if
(
num_online_cpus
()
>
1
)
{
return
-
ENODEV
;
printk
(
KERN_ERR
PFX
"More than 1 CPU detected, longhaul disabled.
\n
"
);
}
#endif
#ifdef CONFIG_X86_IO_APIC
if
(
cpu_has_apic
)
{
printk
(
KERN_ERR
PFX
"APIC detected. Longhaul is currently broken in this configuration.
\n
"
);
return
-
ENODEV
;
}
#endif
switch
(
c
->
x86_model
)
{
case
6
...
9
:
return
cpufreq_register_driver
(
&
longhaul_driver
);
...
...
@@ -699,6 +736,6 @@ MODULE_AUTHOR ("Dave Jones <davej@codemonkey.org.uk>");
MODULE_DESCRIPTION
(
"Longhaul driver for VIA Cyrix processors."
);
MODULE_LICENSE
(
"GPL"
);
module_init
(
longhaul_init
);
late_initcall
(
longhaul_init
);
module_exit
(
longhaul_exit
);
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/uncached.c
浏览文件 @
242898be
...
...
@@ -32,32 +32,38 @@
extern
void
__init
efi_memmap_walk_uc
(
efi_freemem_callback_t
,
void
*
);
#define MAX_UNCACHED_GRANULES 5
static
int
allocated_granules
;
struct
uncached_pool
{
struct
gen_pool
*
pool
;
struct
mutex
add_chunk_mutex
;
/* serialize adding a converted chunk */
int
nchunks_added
;
/* #of converted chunks added to pool */
atomic_t
status
;
/* smp called function's return status*/
};
#define MAX_CONVERTED_CHUNKS_PER_NODE 2
struct
gen_pool
*
uncached_pool
[
MAX_NUMNODES
];
struct
uncached_pool
uncached_pools
[
MAX_NUMNODES
];
static
void
uncached_ipi_visibility
(
void
*
data
)
{
int
status
;
struct
uncached_pool
*
uc_pool
=
(
struct
uncached_pool
*
)
data
;
status
=
ia64_pal_prefetch_visibility
(
PAL_VISIBILITY_PHYSICAL
);
if
((
status
!=
PAL_VISIBILITY_OK
)
&&
(
status
!=
PAL_VISIBILITY_OK_REMOTE_NEEDED
))
printk
(
KERN_DEBUG
"pal_prefetch_visibility() returns %i on "
"CPU %i
\n
"
,
status
,
raw_smp_processor_id
());
atomic_inc
(
&
uc_pool
->
status
);
}
static
void
uncached_ipi_mc_drain
(
void
*
data
)
{
int
status
;
struct
uncached_pool
*
uc_pool
=
(
struct
uncached_pool
*
)
data
;
status
=
ia64_pal_mc_drain
();
if
(
status
)
printk
(
KERN_WARNING
"ia64_pal_mc_drain() failed with %i on "
"CPU %i
\n
"
,
status
,
raw_smp_processor_id
());
if
(
status
!=
PAL_STATUS_SUCCESS
)
atomic_inc
(
&
uc_pool
->
status
);
}
...
...
@@ -70,21 +76,34 @@ static void uncached_ipi_mc_drain(void *data)
* This is accomplished by first allocating a granule of cached memory pages
* and then converting them to uncached memory pages.
*/
static
int
uncached_add_chunk
(
struct
gen_pool
*
pool
,
int
nid
)
static
int
uncached_add_chunk
(
struct
uncached_pool
*
uc_
pool
,
int
nid
)
{
struct
page
*
page
;
int
status
,
i
;
int
status
,
i
,
nchunks_added
=
uc_pool
->
nchunks_added
;
unsigned
long
c_addr
,
uc_addr
;
if
(
allocated_granules
>=
MAX_UNCACHED_GRANULES
)
if
(
mutex_lock_interruptible
(
&
uc_pool
->
add_chunk_mutex
)
!=
0
)
return
-
1
;
/* interrupted by a signal */
if
(
uc_pool
->
nchunks_added
>
nchunks_added
)
{
/* someone added a new chunk while we were waiting */
mutex_unlock
(
&
uc_pool
->
add_chunk_mutex
);
return
0
;
}
if
(
uc_pool
->
nchunks_added
>=
MAX_CONVERTED_CHUNKS_PER_NODE
)
{
mutex_unlock
(
&
uc_pool
->
add_chunk_mutex
);
return
-
1
;
}
/* attempt to allocate a granule's worth of cached memory pages */
page
=
alloc_pages_node
(
nid
,
GFP_KERNEL
|
__GFP_ZERO
,
IA64_GRANULE_SHIFT
-
PAGE_SHIFT
);
if
(
!
page
)
if
(
!
page
)
{
mutex_unlock
(
&
uc_pool
->
add_chunk_mutex
);
return
-
1
;
}
/* convert the memory pages from cached to uncached */
...
...
@@ -102,11 +121,14 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid)
flush_tlb_kernel_range
(
uc_addr
,
uc_adddr
+
IA64_GRANULE_SIZE
);
status
=
ia64_pal_prefetch_visibility
(
PAL_VISIBILITY_PHYSICAL
);
if
(
!
status
)
{
status
=
smp_call_function
(
uncached_ipi_visibility
,
NULL
,
0
,
1
);
if
(
status
)
if
(
status
==
PAL_VISIBILITY_OK_REMOTE_NEEDED
)
{
atomic_set
(
&
uc_pool
->
status
,
0
);
status
=
smp_call_function
(
uncached_ipi_visibility
,
uc_pool
,
0
,
1
);
if
(
status
||
atomic_read
(
&
uc_pool
->
status
))
goto
failed
;
}
}
else
if
(
status
!=
PAL_VISIBILITY_OK
)
goto
failed
;
preempt_disable
();
...
...
@@ -120,20 +142,24 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid)
preempt_enable
();
ia64_pal_mc_drain
();
status
=
smp_call_function
(
uncached_ipi_mc_drain
,
NULL
,
0
,
1
);
if
(
status
)
status
=
ia64_pal_mc_drain
();
if
(
status
!=
PAL_STATUS_SUCCESS
)
goto
failed
;
atomic_set
(
&
uc_pool
->
status
,
0
);
status
=
smp_call_function
(
uncached_ipi_mc_drain
,
uc_pool
,
0
,
1
);
if
(
status
||
atomic_read
(
&
uc_pool
->
status
))
goto
failed
;
/*
* The chunk of memory pages has been converted to uncached so now we
* can add it to the pool.
*/
status
=
gen_pool_add
(
pool
,
uc_addr
,
IA64_GRANULE_SIZE
,
nid
);
status
=
gen_pool_add
(
uc_pool
->
pool
,
uc_addr
,
IA64_GRANULE_SIZE
,
nid
);
if
(
status
)
goto
failed
;
allocated_granules
++
;
uc_pool
->
nchunks_added
++
;
mutex_unlock
(
&
uc_pool
->
add_chunk_mutex
);
return
0
;
/* failed to convert or add the chunk so give it back to the kernel */
...
...
@@ -142,6 +168,7 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid)
ClearPageUncached
(
&
page
[
i
]);
free_pages
(
c_addr
,
IA64_GRANULE_SHIFT
-
PAGE_SHIFT
);
mutex_unlock
(
&
uc_pool
->
add_chunk_mutex
);
return
-
1
;
}
...
...
@@ -158,7 +185,7 @@ static int uncached_add_chunk(struct gen_pool *pool, int nid)
unsigned
long
uncached_alloc_page
(
int
starting_nid
)
{
unsigned
long
uc_addr
;
struct
gen_pool
*
pool
;
struct
uncached_pool
*
uc_
pool
;
int
nid
;
if
(
unlikely
(
starting_nid
>=
MAX_NUMNODES
))
...
...
@@ -171,14 +198,14 @@ unsigned long uncached_alloc_page(int starting_nid)
do
{
if
(
!
node_online
(
nid
))
continue
;
pool
=
uncached_pool
[
nid
];
if
(
pool
==
NULL
)
uc_pool
=
&
uncached_pools
[
nid
];
if
(
uc_pool
->
pool
==
NULL
)
continue
;
do
{
uc_addr
=
gen_pool_alloc
(
pool
,
PAGE_SIZE
);
uc_addr
=
gen_pool_alloc
(
uc_pool
->
pool
,
PAGE_SIZE
);
if
(
uc_addr
!=
0
)
return
uc_addr
;
}
while
(
uncached_add_chunk
(
pool
,
nid
)
==
0
);
}
while
(
uncached_add_chunk
(
uc_
pool
,
nid
)
==
0
);
}
while
((
nid
=
(
nid
+
1
)
%
MAX_NUMNODES
)
!=
starting_nid
);
...
...
@@ -197,7 +224,7 @@ EXPORT_SYMBOL(uncached_alloc_page);
void
uncached_free_page
(
unsigned
long
uc_addr
)
{
int
nid
=
paddr_to_nid
(
uc_addr
-
__IA64_UNCACHED_OFFSET
);
struct
gen_pool
*
pool
=
uncached_pool
[
nid
]
;
struct
gen_pool
*
pool
=
uncached_pool
s
[
nid
].
pool
;
if
(
unlikely
(
pool
==
NULL
))
return
;
...
...
@@ -224,7 +251,7 @@ static int __init uncached_build_memmap(unsigned long uc_start,
unsigned
long
uc_end
,
void
*
arg
)
{
int
nid
=
paddr_to_nid
(
uc_start
-
__IA64_UNCACHED_OFFSET
);
struct
gen_pool
*
pool
=
uncached_pool
[
nid
]
;
struct
gen_pool
*
pool
=
uncached_pool
s
[
nid
].
pool
;
size_t
size
=
uc_end
-
uc_start
;
touch_softlockup_watchdog
();
...
...
@@ -242,7 +269,8 @@ static int __init uncached_init(void)
int
nid
;
for_each_online_node
(
nid
)
{
uncached_pool
[
nid
]
=
gen_pool_create
(
PAGE_SHIFT
,
nid
);
uncached_pools
[
nid
].
pool
=
gen_pool_create
(
PAGE_SHIFT
,
nid
);
mutex_init
(
&
uncached_pools
[
nid
].
add_chunk_mutex
);
}
efi_memmap_walk_uc
(
uncached_build_memmap
,
NULL
);
...
...
This diff is collapsed.
Click to expand it.
arch/sh/kernel/cpu/sh4/sq.c
浏览文件 @
242898be
...
...
@@ -421,18 +421,22 @@ static struct miscdevice sq_dev = {
static
int
__init
sq_api_init
(
void
)
{
int
ret
;
printk
(
KERN_NOTICE
"sq: Registering store queue API.
\n
"
);
#ifdef CONFIG_PROC_FS
create_proc_read_entry
(
"sq_mapping"
,
0
,
0
,
sq_mapping_read_proc
,
0
);
#endif
return
misc_register
(
&
sq_dev
);
ret
=
misc_register
(
&
sq_dev
);
if
(
ret
)
remove_proc_entry
(
"sq_mapping"
,
NULL
);
return
ret
;
}
static
void
__exit
sq_api_exit
(
void
)
{
misc_deregister
(
&
sq_dev
);
remove_proc_entry
(
"sq_mapping"
,
NULL
);
}
module_init
(
sq_api_init
);
...
...
This diff is collapsed.
Click to expand it.
arch/x86_64/kernel/smp.c
浏览文件 @
242898be
...
...
@@ -203,7 +203,7 @@ int __cpuinit init_smp_flush(void)
{
int
i
;
for_each_cpu_mask
(
i
,
cpu_possible_map
)
{
spin_lock_init
(
&
per_cpu
(
flush_state
.
tlbstate_lock
,
i
)
);
spin_lock_init
(
&
per_cpu
(
flush_state
,
i
).
tlbstate_lock
);
}
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/acpi/acpi_memhotplug.c
浏览文件 @
242898be
...
...
@@ -129,11 +129,15 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
struct
acpi_memory_info
*
info
,
*
n
;
if
(
!
list_empty
(
&
mem_device
->
res_list
))
return
0
;
status
=
acpi_walk_resources
(
mem_device
->
device
->
handle
,
METHOD_NAME__CRS
,
acpi_memory_get_resource
,
mem_device
);
if
(
ACPI_FAILURE
(
status
))
{
list_for_each_entry_safe
(
info
,
n
,
&
mem_device
->
res_list
,
list
)
kfree
(
info
);
INIT_LIST_HEAD
(
&
mem_device
->
res_list
);
return
-
EINVAL
;
}
...
...
@@ -230,17 +234,10 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
* (i.e. memory-hot-remove function)
*/
list_for_each_entry
(
info
,
&
mem_device
->
res_list
,
list
)
{
u64
start_pfn
,
end_pfn
;
start_pfn
=
info
->
start_addr
>>
PAGE_SHIFT
;
end_pfn
=
(
info
->
start_addr
+
info
->
length
-
1
)
>>
PAGE_SHIFT
;
if
(
pfn_valid
(
start_pfn
)
||
pfn_valid
(
end_pfn
))
{
/* already enabled. try next area */
if
(
info
->
enabled
)
{
/* just sanity check...*/
num_enabled
++
;
continue
;
}
result
=
add_memory
(
node
,
info
->
start_addr
,
info
->
length
);
if
(
result
)
continue
;
...
...
This diff is collapsed.
Click to expand it.
drivers/char/hvsi.c
浏览文件 @
242898be
...
...
@@ -311,7 +311,8 @@ static void hvsi_recv_control(struct hvsi_struct *hp, uint8_t *packet,
/* CD went away; no more connection */
pr_debug
(
"hvsi%i: CD dropped
\n
"
,
hp
->
index
);
hp
->
mctrl
&=
TIOCM_CD
;
if
(
!
(
hp
->
tty
->
flags
&
CLOCAL
))
/* If userland hasn't done an open(2) yet, hp->tty is NULL. */
if
(
hp
->
tty
&&
!
(
hp
->
tty
->
flags
&
CLOCAL
))
*
to_hangup
=
hp
->
tty
;
}
break
;
...
...
@@ -986,10 +987,7 @@ static void hvsi_write_worker(void *arg)
start_j
=
0
;
#endif
/* DEBUG */
wake_up_all
(
&
hp
->
emptyq
);
if
(
test_bit
(
TTY_DO_WRITE_WAKEUP
,
&
hp
->
tty
->
flags
)
&&
hp
->
tty
->
ldisc
.
write_wakeup
)
hp
->
tty
->
ldisc
.
write_wakeup
(
hp
->
tty
);
wake_up_interruptible
(
&
hp
->
tty
->
write_wait
);
tty_wakeup
(
hp
->
tty
);
}
out:
...
...
This diff is collapsed.
Click to expand it.
drivers/char/hw_random/omap-rng.c
浏览文件 @
242898be
...
...
@@ -25,12 +25,12 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/random.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/device.h>
#include <linux/
platform_
device.h>
#include <linux/hw_random.h>
#include <asm/io.h>
#include <asm/hardware/clock.h>
#define RNG_OUT_REG 0x00
/* Output register */
#define RNG_STAT_REG 0x04
/* Status register
...
...
@@ -52,7 +52,7 @@
static
void
__iomem
*
rng_base
;
static
struct
clk
*
rng_ick
;
static
struct
device
*
rng_dev
;
static
struct
platform_
device
*
rng_dev
;
static
u32
omap_rng_read_reg
(
int
reg
)
{
...
...
@@ -83,9 +83,8 @@ static struct hwrng omap_rng_ops = {
.
data_read
=
omap_rng_data_read
,
};
static
int
__init
omap_rng_probe
(
struct
device
*
dev
)
static
int
__init
omap_rng_probe
(
struct
platform_device
*
p
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
resource
*
res
,
*
mem
;
int
ret
;
...
...
@@ -95,16 +94,14 @@ static int __init omap_rng_probe(struct device *dev)
*/
BUG_ON
(
rng_dev
);
if
(
cpu_is_omap24xx
())
{
if
(
cpu_is_omap24xx
())
{
rng_ick
=
clk_get
(
NULL
,
"rng_ick"
);
if
(
IS_ERR
(
rng_ick
))
{
dev_err
(
dev
,
"Could not get rng_ick
\n
"
);
dev_err
(
&
pdev
->
dev
,
"Could not get rng_ick
\n
"
);
ret
=
PTR_ERR
(
rng_ick
);
return
ret
;
}
else
{
clk_use
(
rng_ick
);
}
}
else
clk_enable
(
rng_ick
);
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
...
...
@@ -117,7 +114,7 @@ static int __init omap_rng_probe(struct device *dev)
if
(
mem
==
NULL
)
return
-
EBUSY
;
dev_set_drvdata
(
dev
,
mem
);
dev_set_drvdata
(
&
pdev
->
dev
,
mem
);
rng_base
=
(
u32
__iomem
*
)
io_p2v
(
res
->
start
);
ret
=
hwrng_register
(
&
omap_rng_ops
);
...
...
@@ -127,25 +124,25 @@ static int __init omap_rng_probe(struct device *dev)
return
ret
;
}
dev_info
(
dev
,
"OMAP Random Number Generator ver. %02x
\n
"
,
dev_info
(
&
pdev
->
dev
,
"OMAP Random Number Generator ver. %02x
\n
"
,
omap_rng_read_reg
(
RNG_REV_REG
));
omap_rng_write_reg
(
RNG_MASK_REG
,
0x1
);
rng_dev
=
dev
;
rng_dev
=
p
dev
;
return
0
;
}
static
int
__exit
omap_rng_remove
(
struct
device
*
dev
)
static
int
__exit
omap_rng_remove
(
struct
platform_device
*
p
dev
)
{
struct
resource
*
mem
=
dev_get_drvdata
(
dev
);
struct
resource
*
mem
=
dev_get_drvdata
(
&
pdev
->
dev
);
hwrng_unregister
(
&
omap_rng_ops
);
omap_rng_write_reg
(
RNG_MASK_REG
,
0x0
);
if
(
cpu_is_omap24xx
())
{
clk_
unus
e
(
rng_ick
);
clk_
disabl
e
(
rng_ick
);
clk_put
(
rng_ick
);
}
...
...
@@ -157,18 +154,16 @@ static int __exit omap_rng_remove(struct device *dev)
#ifdef CONFIG_PM
static
int
omap_rng_suspend
(
struct
device
*
dev
,
pm_message_t
message
,
u32
level
)
static
int
omap_rng_suspend
(
struct
platform_device
*
pdev
,
pm_message_t
message
)
{
omap_rng_write_reg
(
RNG_MASK_REG
,
0x0
);
return
0
;
}
static
int
omap_rng_resume
(
struct
device
*
dev
,
pm_message_t
message
,
u32
level
)
static
int
omap_rng_resume
(
struct
platform_device
*
pdev
)
{
omap_rng_write_reg
(
RNG_MASK_REG
,
0x1
);
return
1
;
return
0
;
}
#else
...
...
@@ -179,9 +174,11 @@ static int omap_rng_resume(struct device *dev, pm_message_t message, u32 level)
#endif
static
struct
device_driver
omap_rng_driver
=
{
.
name
=
"omap_rng"
,
.
bus
=
&
platform_bus_type
,
static
struct
platform_driver
omap_rng_driver
=
{
.
driver
=
{
.
name
=
"omap_rng"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
omap_rng_probe
,
.
remove
=
__exit_p
(
omap_rng_remove
),
.
suspend
=
omap_rng_suspend
,
...
...
@@ -193,12 +190,12 @@ static int __init omap_rng_init(void)
if
(
!
cpu_is_omap16xx
()
&&
!
cpu_is_omap24xx
())
return
-
ENODEV
;
return
driver_register
(
&
omap_rng_driver
);
return
platform_
driver_register
(
&
omap_rng_driver
);
}
static
void
__exit
omap_rng_exit
(
void
)
{
driver_unregister
(
&
omap_rng_driver
);
platform_
driver_unregister
(
&
omap_rng_driver
);
}
module_init
(
omap_rng_init
);
...
...
This diff is collapsed.
Click to expand it.
drivers/char/keyboard.c
浏览文件 @
242898be
...
...
@@ -107,7 +107,6 @@ const int NR_TYPES = ARRAY_SIZE(max_vals);
struct
kbd_struct
kbd_table
[
MAX_NR_CONSOLES
];
static
struct
kbd_struct
*
kbd
=
kbd_table
;
static
struct
kbd_struct
kbd0
;
int
spawnpid
,
spawnsig
;
...
...
@@ -223,13 +222,13 @@ static void kd_nosound(unsigned long ignored)
{
struct
list_head
*
node
;
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
test_bit
(
EV_SND
,
handle
->
dev
->
evbit
))
{
if
(
test_bit
(
SND_TONE
,
handle
->
dev
->
sndbit
))
input_
event
(
handle
->
dev
,
EV_SND
,
SND_TONE
,
0
);
input_
inject_event
(
handle
,
EV_SND
,
SND_TONE
,
0
);
if
(
test_bit
(
SND_BELL
,
handle
->
dev
->
sndbit
))
input_
event
(
handle
->
dev
,
EV_SND
,
SND_BELL
,
0
);
input_
inject_event
(
handle
,
EV_SND
,
SND_BELL
,
0
);
}
}
}
...
...
@@ -247,11 +246,11 @@ void kd_mksound(unsigned int hz, unsigned int ticks)
struct
input_handle
*
handle
=
to_handle_h
(
node
);
if
(
test_bit
(
EV_SND
,
handle
->
dev
->
evbit
))
{
if
(
test_bit
(
SND_TONE
,
handle
->
dev
->
sndbit
))
{
input_
event
(
handle
->
dev
,
EV_SND
,
SND_TONE
,
hz
);
input_
inject_event
(
handle
,
EV_SND
,
SND_TONE
,
hz
);
break
;
}
if
(
test_bit
(
SND_BELL
,
handle
->
dev
->
sndbit
))
{
input_
event
(
handle
->
dev
,
EV_SND
,
SND_BELL
,
1
);
input_
inject_event
(
handle
,
EV_SND
,
SND_BELL
,
1
);
break
;
}
}
...
...
@@ -272,15 +271,15 @@ int kbd_rate(struct kbd_repeat *rep)
unsigned
int
d
=
0
;
unsigned
int
p
=
0
;
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
struct
input_dev
*
dev
=
handle
->
dev
;
if
(
test_bit
(
EV_REP
,
dev
->
evbit
))
{
if
(
rep
->
delay
>
0
)
input_
event
(
dev
,
EV_REP
,
REP_DELAY
,
rep
->
delay
);
input_
inject_event
(
handle
,
EV_REP
,
REP_DELAY
,
rep
->
delay
);
if
(
rep
->
period
>
0
)
input_
event
(
dev
,
EV_REP
,
REP_PERIOD
,
rep
->
period
);
input_
inject_event
(
handle
,
EV_REP
,
REP_PERIOD
,
rep
->
period
);
d
=
dev
->
rep
[
REP_DELAY
];
p
=
dev
->
rep
[
REP_PERIOD
];
}
...
...
@@ -988,7 +987,7 @@ static inline unsigned char getleds(void)
* interrupt routines for this thing allows us to easily mask
* this when we don't want any of the above to happen.
* This allows for easy and efficient race-condition prevention
* for kbd_
refresh_leds => inpu
t_event(dev, EV_LED, ...) => ...
* for kbd_
start => input_injec
t_event(dev, EV_LED, ...) => ...
*/
static
void
kbd_bh
(
unsigned
long
dummy
)
...
...
@@ -998,11 +997,11 @@ static void kbd_bh(unsigned long dummy)
if
(
leds
!=
ledstate
)
{
list_for_each
(
node
,
&
kbd_handler
.
h_list
)
{
struct
input_handle
*
handle
=
to_handle_h
(
node
);
input_
event
(
handle
->
dev
,
EV_LED
,
LED_SCROLLL
,
!!
(
leds
&
0x01
));
input_
event
(
handle
->
dev
,
EV_LED
,
LED_NUML
,
!!
(
leds
&
0x02
));
input_
event
(
handle
->
dev
,
EV_LED
,
LED_CAPSL
,
!!
(
leds
&
0x04
));
input_
sync
(
handle
->
dev
);
struct
input_handle
*
handle
=
to_handle_h
(
node
);
input_
inject_event
(
handle
,
EV_LED
,
LED_SCROLLL
,
!!
(
leds
&
0x01
));
input_
inject_event
(
handle
,
EV_LED
,
LED_NUML
,
!!
(
leds
&
0x02
));
input_
inject_event
(
handle
,
EV_LED
,
LED_CAPSL
,
!!
(
leds
&
0x04
));
input_
inject_event
(
handle
,
EV_SYN
,
SYN_REPORT
,
0
);
}
}
...
...
@@ -1011,23 +1010,6 @@ static void kbd_bh(unsigned long dummy)
DECLARE_TASKLET_DISABLED
(
keyboard_tasklet
,
kbd_bh
,
0
);
/*
* This allows a newly plugged keyboard to pick the LED state.
*/
static
void
kbd_refresh_leds
(
struct
input_handle
*
handle
)
{
unsigned
char
leds
=
ledstate
;
tasklet_disable
(
&
keyboard_tasklet
);
if
(
leds
!=
0xff
)
{
input_event
(
handle
->
dev
,
EV_LED
,
LED_SCROLLL
,
!!
(
leds
&
0x01
));
input_event
(
handle
->
dev
,
EV_LED
,
LED_NUML
,
!!
(
leds
&
0x02
));
input_event
(
handle
->
dev
,
EV_LED
,
LED_CAPSL
,
!!
(
leds
&
0x04
));
input_sync
(
handle
->
dev
);
}
tasklet_enable
(
&
keyboard_tasklet
);
}
#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) ||\
defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC) ||\
defined(CONFIG_PARISC) || defined(CONFIG_SUPERH) ||\
...
...
@@ -1043,7 +1025,7 @@ static const unsigned short x86_keycodes[256] =
48
,
49
,
50
,
51
,
52
,
53
,
54
,
55
,
56
,
57
,
58
,
59
,
60
,
61
,
62
,
63
,
64
,
65
,
66
,
67
,
68
,
69
,
70
,
71
,
72
,
73
,
74
,
75
,
76
,
77
,
78
,
79
,
80
,
81
,
82
,
83
,
84
,
118
,
86
,
87
,
88
,
115
,
120
,
119
,
121
,
112
,
123
,
92
,
284
,
285
,
309
,
298
,
312
,
91
,
327
,
328
,
329
,
331
,
333
,
335
,
336
,
337
,
338
,
339
,
284
,
285
,
309
,
0
,
312
,
91
,
327
,
328
,
329
,
331
,
333
,
335
,
336
,
337
,
338
,
339
,
367
,
288
,
302
,
304
,
350
,
89
,
334
,
326
,
267
,
126
,
268
,
269
,
125
,
347
,
348
,
349
,
360
,
261
,
262
,
263
,
268
,
376
,
100
,
101
,
321
,
316
,
373
,
286
,
289
,
102
,
351
,
355
,
103
,
104
,
105
,
275
,
287
,
279
,
306
,
106
,
274
,
107
,
294
,
364
,
358
,
363
,
362
,
361
,
...
...
@@ -1065,38 +1047,55 @@ extern void sun_do_break(void);
static
int
emulate_raw
(
struct
vc_data
*
vc
,
unsigned
int
keycode
,
unsigned
char
up_flag
)
{
if
(
keycode
>
255
||
!
x86_keycodes
[
keycode
])
return
-
1
;
int
code
;
switch
(
keycode
)
{
case
KEY_PAUSE
:
put_queue
(
vc
,
0xe1
);
put_queue
(
vc
,
0x1d
|
up_flag
);
put_queue
(
vc
,
0x45
|
up_flag
);
return
0
;
break
;
case
KEY_HANGEUL
:
if
(
!
up_flag
)
put_queue
(
vc
,
0xf2
);
return
0
;
break
;
case
KEY_HANJA
:
if
(
!
up_flag
)
put_queue
(
vc
,
0xf1
);
return
0
;
}
break
;
if
(
keycode
==
KEY_SYSRQ
&&
sysrq_alt
)
{
put_queue
(
vc
,
0x54
|
up_flag
);
return
0
;
}
case
KEY_SYSRQ
:
/*
* Real AT keyboards (that's what we're trying
* to emulate here emit 0xe0 0x2a 0xe0 0x37 when
* pressing PrtSc/SysRq alone, but simply 0x54
* when pressing Alt+PrtSc/SysRq.
*/
if
(
sysrq_alt
)
{
put_queue
(
vc
,
0x54
|
up_flag
);
}
else
{
put_queue
(
vc
,
0xe0
);
put_queue
(
vc
,
0x2a
|
up_flag
);
put_queue
(
vc
,
0xe0
);
put_queue
(
vc
,
0x37
|
up_flag
);
}
break
;
default:
if
(
keycode
>
255
)
return
-
1
;
if
(
x86_keycodes
[
keycode
]
&
0x100
)
put_queue
(
vc
,
0xe0
);
code
=
x86_keycodes
[
keycode
];
if
(
!
code
)
return
-
1
;
put_queue
(
vc
,
(
x86_keycodes
[
keycode
]
&
0x7f
)
|
up_flag
);
if
(
code
&
0x100
)
put_queue
(
vc
,
0xe0
);
put_queue
(
vc
,
(
code
&
0x7f
)
|
up_flag
);
if
(
keycode
==
KEY_SYSRQ
)
{
put_queue
(
vc
,
0xe0
);
put_queue
(
vc
,
0x37
|
up_flag
);
break
;
}
return
0
;
...
...
@@ -1298,16 +1297,15 @@ static struct input_handle *kbd_connect(struct input_handler *handler,
if
(
i
==
BTN_MISC
&&
!
test_bit
(
EV_SND
,
dev
->
evbit
))
return
NULL
;
if
(
!
(
handle
=
kmalloc
(
sizeof
(
struct
input_handle
),
GFP_KERNEL
)))
handle
=
kzalloc
(
sizeof
(
struct
input_handle
),
GFP_KERNEL
);
if
(
!
handle
)
return
NULL
;
memset
(
handle
,
0
,
sizeof
(
struct
input_handle
));
handle
->
dev
=
dev
;
handle
->
handler
=
handler
;
handle
->
name
=
"kbd"
;
input_open_device
(
handle
);
kbd_refresh_leds
(
handle
);
return
handle
;
}
...
...
@@ -1318,6 +1316,24 @@ static void kbd_disconnect(struct input_handle *handle)
kfree
(
handle
);
}
/*
* Start keyboard handler on the new keyboard by refreshing LED state to
* match the rest of the system.
*/
static
void
kbd_start
(
struct
input_handle
*
handle
)
{
unsigned
char
leds
=
ledstate
;
tasklet_disable
(
&
keyboard_tasklet
);
if
(
leds
!=
0xff
)
{
input_inject_event
(
handle
,
EV_LED
,
LED_SCROLLL
,
!!
(
leds
&
0x01
));
input_inject_event
(
handle
,
EV_LED
,
LED_NUML
,
!!
(
leds
&
0x02
));
input_inject_event
(
handle
,
EV_LED
,
LED_CAPSL
,
!!
(
leds
&
0x04
));
input_inject_event
(
handle
,
EV_SYN
,
SYN_REPORT
,
0
);
}
tasklet_enable
(
&
keyboard_tasklet
);
}
static
struct
input_device_id
kbd_ids
[]
=
{
{
.
flags
=
INPUT_DEVICE_ID_MATCH_EVBIT
,
...
...
@@ -1338,6 +1354,7 @@ static struct input_handler kbd_handler = {
.
event
=
kbd_event
,
.
connect
=
kbd_connect
,
.
disconnect
=
kbd_disconnect
,
.
start
=
kbd_start
,
.
name
=
"kbd"
,
.
id_table
=
kbd_ids
,
};
...
...
@@ -1346,15 +1363,15 @@ int __init kbd_init(void)
{
int
i
;
kbd0
.
ledflagstate
=
kbd0
.
default_ledflagstate
=
KBD_DEFLEDS
;
kbd0
.
ledmode
=
LED_SHOW_FLAG
S
;
kbd0
.
lockstate
=
KBD_DEFLOCK
;
kbd0
.
slockstate
=
0
;
kbd0
.
modeflags
=
KBD_DEFMODE
;
kbd0
.
kbdmode
=
VC_XLATE
;
for
(
i
=
0
;
i
<
MAX_NR_CONSOLES
;
i
++
)
kbd_table
[
i
]
=
kbd0
;
for
(
i
=
0
;
i
<
MAX_NR_CONSOLES
;
i
++
)
{
kbd_table
[
i
].
ledflagstate
=
KBD_DEFLED
S
;
kbd_table
[
i
].
default_ledflagstate
=
KBD_DEFLEDS
;
kbd_table
[
i
].
ledmode
=
LED_SHOW_FLAGS
;
kbd_table
[
i
].
lockstate
=
KBD_DEFLOCK
;
kbd_table
[
i
].
slockstate
=
0
;
kbd_table
[
i
].
modeflags
=
KBD_DEFMODE
;
kbd_table
[
i
].
kbdmode
=
VC_XLATE
;
}
input_register_handler
(
&
kbd_handler
);
...
...
This diff is collapsed.
Click to expand it.
drivers/cpufreq/cpufreq.c
浏览文件 @
242898be
...
...
@@ -284,39 +284,69 @@ EXPORT_SYMBOL_GPL(cpufreq_notify_transition);
* SYSFS INTERFACE *
*********************************************************************/
static
struct
cpufreq_governor
*
__find_governor
(
const
char
*
str_governor
)
{
struct
cpufreq_governor
*
t
;
list_for_each_entry
(
t
,
&
cpufreq_governor_list
,
governor_list
)
if
(
!
strnicmp
(
str_governor
,
t
->
name
,
CPUFREQ_NAME_LEN
))
return
t
;
return
NULL
;
}
/**
* cpufreq_parse_governor - parse a governor string
*/
static
int
cpufreq_parse_governor
(
char
*
str_governor
,
unsigned
int
*
policy
,
struct
cpufreq_governor
**
governor
)
{
int
err
=
-
EINVAL
;
if
(
!
cpufreq_driver
)
return
-
EINVAL
;
goto
out
;
if
(
cpufreq_driver
->
setpolicy
)
{
if
(
!
strnicmp
(
str_governor
,
"performance"
,
CPUFREQ_NAME_LEN
))
{
*
policy
=
CPUFREQ_POLICY_PERFORMANCE
;
return
0
;
err
=
0
;
}
else
if
(
!
strnicmp
(
str_governor
,
"powersave"
,
CPUFREQ_NAME_LEN
))
{
*
policy
=
CPUFREQ_POLICY_POWERSAVE
;
return
0
;
err
=
0
;
}
return
-
EINVAL
;
}
else
{
}
else
if
(
cpufreq_driver
->
target
)
{
struct
cpufreq_governor
*
t
;
mutex_lock
(
&
cpufreq_governor_mutex
);
if
(
!
cpufreq_driver
||
!
cpufreq_driver
->
target
)
goto
out
;
list_for_each_entry
(
t
,
&
cpufreq_governor_list
,
governor_list
)
{
if
(
!
strnicmp
(
str_governor
,
t
->
name
,
CPUFREQ_NAME_LEN
))
{
*
governor
=
t
;
t
=
__find_governor
(
str_governor
);
if
(
t
==
NULL
)
{
char
*
name
=
kasprintf
(
GFP_KERNEL
,
"cpufreq_%s"
,
str_governor
);
if
(
name
)
{
int
ret
;
mutex_unlock
(
&
cpufreq_governor_mutex
);
return
0
;
ret
=
request_module
(
name
);
mutex_lock
(
&
cpufreq_governor_mutex
);
if
(
ret
==
0
)
t
=
__find_governor
(
str_governor
);
}
kfree
(
name
);
}
out:
if
(
t
!=
NULL
)
{
*
governor
=
t
;
err
=
0
;
}
mutex_unlock
(
&
cpufreq_governor_mutex
);
}
return
-
EINVAL
;
out:
return
err
;
}
...
...
@@ -1265,23 +1295,21 @@ static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
int
cpufreq_register_governor
(
struct
cpufreq_governor
*
governor
)
{
struct
cpufreq_governor
*
t
;
int
err
;
if
(
!
governor
)
return
-
EINVAL
;
mutex_lock
(
&
cpufreq_governor_mutex
);
list_for_each_entry
(
t
,
&
cpufreq_governor_list
,
governor_list
)
{
if
(
!
strnicmp
(
governor
->
name
,
t
->
name
,
CPUFREQ_NAME_LEN
))
{
mutex_unlock
(
&
cpufreq_governor_mutex
);
return
-
EBUSY
;
}
err
=
-
EBUSY
;
if
(
__find_governor
(
governor
->
name
)
==
NULL
)
{
err
=
0
;
list_add
(
&
governor
->
governor_list
,
&
cpufreq_governor_list
);
}
list_add
(
&
governor
->
governor_list
,
&
cpufreq_governor_list
);
mutex_unlock
(
&
cpufreq_governor_mutex
);
return
0
;
return
err
;
}
EXPORT_SYMBOL_GPL
(
cpufreq_register_governor
);
...
...
@@ -1343,6 +1371,11 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
memcpy
(
&
policy
->
cpuinfo
,
&
data
->
cpuinfo
,
sizeof
(
struct
cpufreq_cpuinfo
));
if
(
policy
->
min
>
data
->
min
&&
policy
->
min
>
policy
->
max
)
{
ret
=
-
EINVAL
;
goto
error_out
;
}
/* verify the cpu speed can be set within this limit */
ret
=
cpufreq_driver
->
verify
(
policy
);
if
(
ret
)
...
...
This diff is collapsed.
Click to expand it.
drivers/edac/edac_mc.h
浏览文件 @
242898be
...
...
@@ -29,6 +29,7 @@
#include <linux/rcupdate.h>
#include <linux/completion.h>
#include <linux/kobject.h>
#include <linux/platform_device.h>
#define EDAC_MC_LABEL_LEN 31
#define MC_PROC_NAME_MAX_LEN 7
...
...
This diff is collapsed.
Click to expand it.
drivers/i2c/busses/scx200_acb.c
浏览文件 @
242898be
...
...
@@ -232,7 +232,7 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface)
unsigned
long
timeout
;
timeout
=
jiffies
+
POLL_TIMEOUT
;
while
(
time_before
(
jiffies
,
timeout
)
)
{
while
(
1
)
{
status
=
inb
(
ACBST
);
/* Reset the status register to avoid the hang */
...
...
@@ -242,7 +242,10 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface)
scx200_acb_machine
(
iface
,
status
);
return
;
}
yield
();
if
(
time_after
(
jiffies
,
timeout
))
break
;
cpu_relax
();
cond_resched
();
}
dev_err
(
&
iface
->
adapter
.
dev
,
"timeout in state %s
\n
"
,
...
...
This diff is collapsed.
Click to expand it.
drivers/ieee1394/sbp2.c
浏览文件 @
242898be
...
...
@@ -2515,6 +2515,9 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
sdev
->
skip_ms_page_8
=
1
;
if
(
scsi_id
->
workarounds
&
SBP2_WORKAROUND_FIX_CAPACITY
)
sdev
->
fix_capacity
=
1
;
if
(
scsi_id
->
ne
->
guid_vendor_id
==
0x0010b9
&&
/* Maxtor's OUI */
(
sdev
->
type
==
TYPE_DISK
||
sdev
->
type
==
TYPE_RBC
))
sdev
->
allow_restart
=
1
;
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/input/evdev.c
浏览文件 @
242898be
...
...
@@ -127,14 +127,10 @@ static int evdev_open(struct inode * inode, struct file * file)
{
struct
evdev_list
*
list
;
int
i
=
iminor
(
inode
)
-
EVDEV_MINOR_BASE
;
int
accept_err
;
if
(
i
>=
EVDEV_MINORS
||
!
evdev_table
[
i
]
||
!
evdev_table
[
i
]
->
exist
)
return
-
ENODEV
;
if
((
accept_err
=
input_accept_process
(
&
(
evdev_table
[
i
]
->
handle
),
file
)))
return
accept_err
;
if
(
!
(
list
=
kzalloc
(
sizeof
(
struct
evdev_list
),
GFP_KERNEL
)))
return
-
ENOMEM
;
...
...
@@ -260,7 +256,7 @@ static ssize_t evdev_write(struct file * file, const char __user * buffer, size_
if
(
evdev_event_from_user
(
buffer
+
retval
,
&
event
))
return
-
EFAULT
;
input_
event
(
list
->
evdev
->
handle
.
dev
,
event
.
type
,
event
.
code
,
event
.
value
);
input_
inject_event
(
&
list
->
evdev
->
handle
,
event
.
type
,
event
.
code
,
event
.
value
);
retval
+=
evdev_event_size
();
}
...
...
@@ -428,8 +424,8 @@ static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
if
(
get_user
(
v
,
ip
+
1
))
return
-
EFAULT
;
input_
event
(
dev
,
EV_REP
,
REP_DELAY
,
u
);
input_
event
(
dev
,
EV_REP
,
REP_PERIOD
,
v
);
input_
inject_event
(
&
evdev
->
handle
,
EV_REP
,
REP_DELAY
,
u
);
input_
inject_event
(
&
evdev
->
handle
,
EV_REP
,
REP_PERIOD
,
v
);
return
0
;
...
...
This diff is collapsed.
Click to expand it.
drivers/input/gameport/fm801-gp.c
浏览文件 @
242898be
...
...
@@ -106,10 +106,10 @@ static int __devinit fm801_gp_probe(struct pci_dev *pci, const struct pci_device
gp
->
gameport
=
port
;
gp
->
res_port
=
request_region
(
port
->
io
,
0x10
,
"FM801 GP"
);
if
(
!
gp
->
res_port
)
{
kfree
(
gp
);
gameport_free_port
(
port
);
printk
(
KERN_DEBUG
"fm801-gp: unable to grab region 0x%x-0x%x
\n
"
,
port
->
io
,
port
->
io
+
0x0f
);
gameport_free_port
(
port
);
kfree
(
gp
);
return
-
EBUSY
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/input/gameport/gameport.c
浏览文件 @
242898be
...
...
@@ -53,6 +53,7 @@ static LIST_HEAD(gameport_list);
static
struct
bus_type
gameport_bus
;
static
void
gameport_add_driver
(
struct
gameport_driver
*
drv
);
static
void
gameport_add_port
(
struct
gameport
*
gameport
);
static
void
gameport_destroy_port
(
struct
gameport
*
gameport
);
static
void
gameport_reconnect_port
(
struct
gameport
*
gameport
);
...
...
@@ -211,8 +212,14 @@ static void gameport_release_driver(struct gameport *gameport)
static
void
gameport_find_driver
(
struct
gameport
*
gameport
)
{
int
error
;
down_write
(
&
gameport_bus
.
subsys
.
rwsem
);
device_attach
(
&
gameport
->
dev
);
error
=
device_attach
(
&
gameport
->
dev
);
if
(
error
<
0
)
printk
(
KERN_WARNING
"gameport: device_attach() failed for %s (%s), error: %d
\n
"
,
gameport
->
phys
,
gameport
->
name
,
error
);
up_write
(
&
gameport_bus
.
subsys
.
rwsem
);
}
...
...
@@ -316,7 +323,6 @@ static void gameport_remove_duplicate_events(struct gameport_event *event)
spin_unlock_irqrestore
(
&
gameport_event_lock
,
flags
);
}
static
struct
gameport_event
*
gameport_get_event
(
void
)
{
struct
gameport_event
*
event
;
...
...
@@ -342,7 +348,6 @@ static struct gameport_event *gameport_get_event(void)
static
void
gameport_handle_event
(
void
)
{
struct
gameport_event
*
event
;
struct
gameport_driver
*
gameport_drv
;
mutex_lock
(
&
gameport_mutex
);
...
...
@@ -369,8 +374,7 @@ static void gameport_handle_event(void)
break
;
case
GAMEPORT_REGISTER_DRIVER
:
gameport_drv
=
event
->
object
;
driver_register
(
&
gameport_drv
->
driver
);
gameport_add_driver
(
event
->
object
);
break
;
default:
...
...
@@ -532,6 +536,7 @@ static void gameport_init_port(struct gameport *gameport)
if
(
gameport
->
parent
)
gameport
->
dev
.
parent
=
&
gameport
->
parent
->
dev
;
INIT_LIST_HEAD
(
&
gameport
->
node
);
spin_lock_init
(
&
gameport
->
timer_lock
);
init_timer
(
&
gameport
->
poll_timer
);
gameport
->
poll_timer
.
function
=
gameport_run_poll_handler
;
...
...
@@ -544,6 +549,8 @@ static void gameport_init_port(struct gameport *gameport)
*/
static
void
gameport_add_port
(
struct
gameport
*
gameport
)
{
int
error
;
if
(
gameport
->
parent
)
gameport
->
parent
->
child
=
gameport
;
...
...
@@ -558,8 +565,13 @@ static void gameport_add_port(struct gameport *gameport)
printk
(
KERN_INFO
"gameport: %s is %s, speed %dkHz
\n
"
,
gameport
->
name
,
gameport
->
phys
,
gameport
->
speed
);
device_add
(
&
gameport
->
dev
);
gameport
->
registered
=
1
;
error
=
device_add
(
&
gameport
->
dev
);
if
(
error
)
printk
(
KERN_ERR
"gameport: device_add() failed for %s (%s), error: %d
\n
"
,
gameport
->
phys
,
gameport
->
name
,
error
);
else
gameport
->
registered
=
1
;
}
/*
...
...
@@ -583,10 +595,11 @@ static void gameport_destroy_port(struct gameport *gameport)
if
(
gameport
->
registered
)
{
device_del
(
&
gameport
->
dev
);
list_del_init
(
&
gameport
->
node
);
gameport
->
registered
=
0
;
}
list_del_init
(
&
gameport
->
node
);
gameport_remove_pending_events
(
gameport
);
put_device
(
&
gameport
->
dev
);
}
...
...
@@ -704,11 +717,22 @@ static int gameport_driver_remove(struct device *dev)
}
static
struct
bus_type
gameport_bus
=
{
.
name
=
"gameport"
,
.
probe
=
gameport_driver_probe
,
.
remove
=
gameport_driver_remove
,
.
name
=
"gameport"
,
.
probe
=
gameport_driver_probe
,
.
remove
=
gameport_driver_remove
,
};
static
void
gameport_add_driver
(
struct
gameport_driver
*
drv
)
{
int
error
;
error
=
driver_register
(
&
drv
->
driver
);
if
(
error
)
printk
(
KERN_ERR
"gameport: driver_register() failed for %s, error: %d
\n
"
,
drv
->
driver
.
name
,
error
);
}
void
__gameport_register_driver
(
struct
gameport_driver
*
drv
,
struct
module
*
owner
)
{
drv
->
driver
.
bus
=
&
gameport_bus
;
...
...
@@ -778,16 +802,24 @@ void gameport_close(struct gameport *gameport)
static
int
__init
gameport_init
(
void
)
{
gameport_task
=
kthread_run
(
gameport_thread
,
NULL
,
"kgameportd"
);
if
(
IS_ERR
(
gameport_task
))
{
printk
(
KERN_ERR
"gameport: Failed to start kgameportd
\n
"
);
return
PTR_ERR
(
gameport_task
);
}
int
error
;
gameport_bus
.
dev_attrs
=
gameport_device_attrs
;
gameport_bus
.
drv_attrs
=
gameport_driver_attrs
;
gameport_bus
.
match
=
gameport_bus_match
;
bus_register
(
&
gameport_bus
);
error
=
bus_register
(
&
gameport_bus
);
if
(
error
)
{
printk
(
KERN_ERR
"gameport: failed to register gameport bus, error: %d
\n
"
,
error
);
return
error
;
}
gameport_task
=
kthread_run
(
gameport_thread
,
NULL
,
"kgameportd"
);
if
(
IS_ERR
(
gameport_task
))
{
bus_unregister
(
&
gameport_bus
);
error
=
PTR_ERR
(
gameport_task
);
printk
(
KERN_ERR
"gameport: Failed to start kgameportd, error: %d
\n
"
,
error
);
return
error
;
}
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/input/input.c
浏览文件 @
242898be
...
...
@@ -35,6 +35,16 @@ static LIST_HEAD(input_handler_list);
static
struct
input_handler
*
input_table
[
8
];
/**
* input_event() - report new input event
* @handle: device that generated the event
* @type: type of the event
* @code: event code
* @value: value of the event
*
* This function should be used by drivers implementing various input devices
* See also input_inject_event()
*/
void
input_event
(
struct
input_dev
*
dev
,
unsigned
int
type
,
unsigned
int
code
,
int
value
)
{
struct
input_handle
*
handle
;
...
...
@@ -183,6 +193,23 @@ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, in
}
EXPORT_SYMBOL
(
input_event
);
/**
* input_inject_event() - send input event from input handler
* @handle: input handle to send event through
* @type: type of the event
* @code: event code
* @value: value of the event
*
* Similar to input_event() but will ignore event if device is "grabbed" and handle
* injecting event is not the one that owns the device.
*/
void
input_inject_event
(
struct
input_handle
*
handle
,
unsigned
int
type
,
unsigned
int
code
,
int
value
)
{
if
(
!
handle
->
dev
->
grab
||
handle
->
dev
->
grab
==
handle
)
input_event
(
handle
->
dev
,
type
,
code
,
value
);
}
EXPORT_SYMBOL
(
input_inject_event
);
static
void
input_repeat_key
(
unsigned
long
data
)
{
struct
input_dev
*
dev
=
(
void
*
)
data
;
...
...
@@ -197,15 +224,6 @@ static void input_repeat_key(unsigned long data)
mod_timer
(
&
dev
->
timer
,
jiffies
+
msecs_to_jiffies
(
dev
->
rep
[
REP_PERIOD
]));
}
int
input_accept_process
(
struct
input_handle
*
handle
,
struct
file
*
file
)
{
if
(
handle
->
dev
->
accept
)
return
handle
->
dev
->
accept
(
handle
->
dev
,
file
);
return
0
;
}
EXPORT_SYMBOL
(
input_accept_process
);
int
input_grab_device
(
struct
input_handle
*
handle
)
{
if
(
handle
->
dev
->
grab
)
...
...
@@ -218,8 +236,15 @@ EXPORT_SYMBOL(input_grab_device);
void
input_release_device
(
struct
input_handle
*
handle
)
{
if
(
handle
->
dev
->
grab
==
handle
)
handle
->
dev
->
grab
=
NULL
;
struct
input_dev
*
dev
=
handle
->
dev
;
if
(
dev
->
grab
==
handle
)
{
dev
->
grab
=
NULL
;
list_for_each_entry
(
handle
,
&
dev
->
h_list
,
d_node
)
if
(
handle
->
handler
->
start
)
handle
->
handler
->
start
(
handle
);
}
}
EXPORT_SYMBOL
(
input_release_device
);
...
...
@@ -963,8 +988,11 @@ int input_register_device(struct input_dev *dev)
list_for_each_entry
(
handler
,
&
input_handler_list
,
node
)
if
(
!
handler
->
blacklist
||
!
input_match_device
(
handler
->
blacklist
,
dev
))
if
((
id
=
input_match_device
(
handler
->
id_table
,
dev
)))
if
((
handle
=
handler
->
connect
(
handler
,
dev
,
id
)))
if
((
handle
=
handler
->
connect
(
handler
,
dev
,
id
)))
{
input_link_handle
(
handle
);
if
(
handler
->
start
)
handler
->
start
(
handle
);
}
input_wakeup_procfs_readers
();
...
...
@@ -1028,8 +1056,11 @@ void input_register_handler(struct input_handler *handler)
list_for_each_entry
(
dev
,
&
input_dev_list
,
node
)
if
(
!
handler
->
blacklist
||
!
input_match_device
(
handler
->
blacklist
,
dev
))
if
((
id
=
input_match_device
(
handler
->
id_table
,
dev
)))
if
((
handle
=
handler
->
connect
(
handler
,
dev
,
id
)))
if
((
handle
=
handler
->
connect
(
handler
,
dev
,
id
)))
{
input_link_handle
(
handle
);
if
(
handler
->
start
)
handler
->
start
(
handle
);
}
input_wakeup_procfs_readers
();
}
...
...
This diff is collapsed.
Click to expand it.
drivers/input/joystick/iforce/iforce-main.c
浏览文件 @
242898be
...
...
@@ -79,6 +79,7 @@ static struct iforce_device iforce_device[] = {
{
0x06f8
,
0x0001
,
"Guillemot Race Leader Force Feedback"
,
btn_wheel
,
abs_wheel
,
ff_iforce
},
//?
{
0x06f8
,
0x0004
,
"Guillemot Force Feedback Racing Wheel"
,
btn_wheel
,
abs_wheel
,
ff_iforce
},
//?
{
0x06f8
,
0x0004
,
"Gullemot Jet Leader 3D"
,
btn_joystick
,
abs_joystick
,
ff_iforce
},
//?
{
0x06d6
,
0x29bc
,
"Trust Force Feedback Race Master"
,
btn_wheel
,
abs_wheel
,
ff_iforce
},
{
0x0000
,
0x0000
,
"Unknown I-Force Device [%04x:%04x]"
,
btn_joystick
,
abs_joystick
,
ff_iforce
}
};
...
...
@@ -222,22 +223,22 @@ static int iforce_erase_effect(struct input_dev *dev, int effect_id)
int
err
=
0
;
struct
iforce_core_effect
*
core_effect
;
/* Check who is trying to erase this effect */
if
(
iforce
->
core_effects
[
effect_id
].
owner
!=
current
->
pid
)
{
printk
(
KERN_WARNING
"iforce-main.c: %d tried to erase an effect belonging to %d
\n
"
,
current
->
pid
,
iforce
->
core_effects
[
effect_id
].
owner
);
return
-
EACCES
;
}
if
(
effect_id
<
0
||
effect_id
>=
FF_EFFECTS_MAX
)
return
-
EINVAL
;
core_effect
=
iforce
->
core_effects
+
effect_id
;
core_effect
=
&
iforce
->
core_effects
[
effect_id
];
/* Check who is trying to erase this effect */
if
(
core_effect
->
owner
!=
current
->
pid
)
{
printk
(
KERN_WARNING
"iforce-main.c: %d tried to erase an effect belonging to %d
\n
"
,
current
->
pid
,
core_effect
->
owner
);
return
-
EACCES
;
}
if
(
test_bit
(
FF_MOD1_IS_USED
,
core_effect
->
flags
))
err
=
release_resource
(
&
(
iforce
->
core_effects
[
effect_id
].
mod1_chunk
)
);
err
=
release_resource
(
&
core_effect
->
mod1_chunk
);
if
(
!
err
&&
test_bit
(
FF_MOD2_IS_USED
,
core_effect
->
flags
))
err
=
release_resource
(
&
(
iforce
->
core_effects
[
effect_id
].
mod2_chunk
)
);
err
=
release_resource
(
&
core_effect
->
mod2_chunk
);
/*TODO: remember to change that if more FF_MOD* bits are added */
core_effect
->
flags
[
0
]
=
0
;
...
...
This diff is collapsed.
Click to expand it.
drivers/input/joystick/spaceball.c
浏览文件 @
242898be
...
...
@@ -50,7 +50,7 @@ MODULE_LICENSE("GPL");
*/
#define SPACEBALL_MAX_LENGTH 128
#define SPACEBALL_MAX_ID
8
#define SPACEBALL_MAX_ID
9
#define SPACEBALL_1003 1
#define SPACEBALL_2003B 3
...
...
This diff is collapsed.
Click to expand it.
drivers/input/keyboard/atkbd.c
浏览文件 @
242898be
...
...
@@ -482,13 +482,7 @@ static irqreturn_t atkbd_interrupt(struct serio *serio, unsigned char data,
return
IRQ_HANDLED
;
}
/*
* atkbd_event_work() is used to complete processing of events that
* can not be processed by input_event() which is often called from
* interrupt context.
*/
static
void
atkbd_event_work
(
void
*
data
)
static
int
atkbd_set_repeat_rate
(
struct
atkbd
*
atkbd
)
{
const
short
period
[
32
]
=
{
33
,
37
,
42
,
46
,
50
,
54
,
58
,
63
,
67
,
75
,
83
,
92
,
100
,
109
,
116
,
125
,
...
...
@@ -496,41 +490,64 @@ static void atkbd_event_work(void *data)
const
short
delay
[
4
]
=
{
250
,
500
,
750
,
1000
};
struct
atkbd
*
atkbd
=
data
;
struct
input_dev
*
dev
=
atkbd
->
dev
;
unsigned
char
param
;
int
i
=
0
,
j
=
0
;
while
(
i
<
ARRAY_SIZE
(
period
)
-
1
&&
period
[
i
]
<
dev
->
rep
[
REP_PERIOD
])
i
++
;
dev
->
rep
[
REP_PERIOD
]
=
period
[
i
];
while
(
j
<
ARRAY_SIZE
(
period
)
-
1
&&
delay
[
j
]
<
dev
->
rep
[
REP_DELAY
])
j
++
;
dev
->
rep
[
REP_DELAY
]
=
delay
[
j
];
param
=
i
|
(
j
<<
5
);
return
ps2_command
(
&
atkbd
->
ps2dev
,
&
param
,
ATKBD_CMD_SETREP
);
}
static
int
atkbd_set_leds
(
struct
atkbd
*
atkbd
)
{
struct
input_dev
*
dev
=
atkbd
->
dev
;
unsigned
char
param
[
2
];
int
i
,
j
;
mutex_lock
(
&
atkbd
->
event_mutex
);
param
[
0
]
=
(
test_bit
(
LED_SCROLLL
,
dev
->
led
)
?
1
:
0
)
|
(
test_bit
(
LED_NUML
,
dev
->
led
)
?
2
:
0
)
|
(
test_bit
(
LED_CAPSL
,
dev
->
led
)
?
4
:
0
);
if
(
ps2_command
(
&
atkbd
->
ps2dev
,
param
,
ATKBD_CMD_SETLEDS
))
return
-
1
;
if
(
test_and_clear_bit
(
ATKBD_LED_EVENT_BIT
,
&
atkbd
->
event_mask
))
{
param
[
0
]
=
(
test_bit
(
LED_SCROLLL
,
dev
->
led
)
?
1
:
0
)
|
(
test_bit
(
LED_NUML
,
dev
->
led
)
?
2
:
0
)
|
(
test_bit
(
LED_CAPSL
,
dev
->
led
)
?
4
:
0
);
ps2_command
(
&
atkbd
->
ps2dev
,
param
,
ATKBD_CMD_SETLEDS
);
if
(
atkbd
->
extra
)
{
param
[
0
]
=
0
;
param
[
1
]
=
(
test_bit
(
LED_COMPOSE
,
dev
->
led
)
?
0x01
:
0
)
|
(
test_bit
(
LED_SLEEP
,
dev
->
led
)
?
0x02
:
0
)
|
(
test_bit
(
LED_SUSPEND
,
dev
->
led
)
?
0x04
:
0
)
|
(
test_bit
(
LED_MISC
,
dev
->
led
)
?
0x10
:
0
)
|
(
test_bit
(
LED_MUTE
,
dev
->
led
)
?
0x20
:
0
);
ps2_command
(
&
atkbd
->
ps2dev
,
param
,
ATKBD_CMD_EX_SETLEDS
);
}
if
(
atkbd
->
extra
)
{
param
[
0
]
=
0
;
param
[
1
]
=
(
test_bit
(
LED_COMPOSE
,
dev
->
led
)
?
0x01
:
0
)
|
(
test_bit
(
LED_SLEEP
,
dev
->
led
)
?
0x02
:
0
)
|
(
test_bit
(
LED_SUSPEND
,
dev
->
led
)
?
0x04
:
0
)
|
(
test_bit
(
LED_MISC
,
dev
->
led
)
?
0x10
:
0
)
|
(
test_bit
(
LED_MUTE
,
dev
->
led
)
?
0x20
:
0
);
if
(
ps2_command
(
&
atkbd
->
ps2dev
,
param
,
ATKBD_CMD_EX_SETLEDS
))
return
-
1
;
}
if
(
test_and_clear_bit
(
ATKBD_REP_EVENT_BIT
,
&
atkbd
->
event_mask
))
{
i
=
j
=
0
;
while
(
i
<
31
&&
period
[
i
]
<
dev
->
rep
[
REP_PERIOD
])
i
++
;
while
(
j
<
3
&&
delay
[
j
]
<
dev
->
rep
[
REP_DELAY
])
j
++
;
dev
->
rep
[
REP_PERIOD
]
=
period
[
i
];
dev
->
rep
[
REP_DELAY
]
=
delay
[
j
];
param
[
0
]
=
i
|
(
j
<<
5
);
ps2_command
(
&
atkbd
->
ps2dev
,
param
,
ATKBD_CMD_SETREP
);
}
return
0
;
}
/*
* atkbd_event_work() is used to complete processing of events that
* can not be processed by input_event() which is often called from
* interrupt context.
*/
static
void
atkbd_event_work
(
void
*
data
)
{
struct
atkbd
*
atkbd
=
data
;
mutex_lock
(
&
atkbd
->
event_mutex
);
if
(
test_and_clear_bit
(
ATKBD_LED_EVENT_BIT
,
&
atkbd
->
event_mask
))
atkbd_set_leds
(
atkbd
);
if
(
test_and_clear_bit
(
ATKBD_REP_EVENT_BIT
,
&
atkbd
->
event_mask
))
atkbd_set_repeat_rate
(
atkbd
);
mutex_unlock
(
&
atkbd
->
event_mutex
);
}
...
...
@@ -975,7 +992,6 @@ static int atkbd_reconnect(struct serio *serio)
{
struct
atkbd
*
atkbd
=
serio_get_drvdata
(
serio
);
struct
serio_driver
*
drv
=
serio
->
drv
;
unsigned
char
param
[
1
];
if
(
!
atkbd
||
!
drv
)
{
printk
(
KERN_DEBUG
"atkbd: reconnect request, but serio is disconnected, ignoring...
\n
"
);
...
...
@@ -985,10 +1001,6 @@ static int atkbd_reconnect(struct serio *serio)
atkbd_disable
(
atkbd
);
if
(
atkbd
->
write
)
{
param
[
0
]
=
(
test_bit
(
LED_SCROLLL
,
atkbd
->
dev
->
led
)
?
1
:
0
)
|
(
test_bit
(
LED_NUML
,
atkbd
->
dev
->
led
)
?
2
:
0
)
|
(
test_bit
(
LED_CAPSL
,
atkbd
->
dev
->
led
)
?
4
:
0
);
if
(
atkbd_probe
(
atkbd
))
return
-
1
;
if
(
atkbd
->
set
!=
atkbd_select_set
(
atkbd
,
atkbd
->
set
,
atkbd
->
extra
))
...
...
@@ -996,8 +1008,13 @@ static int atkbd_reconnect(struct serio *serio)
atkbd_activate
(
atkbd
);
if
(
ps2_command
(
&
atkbd
->
ps2dev
,
param
,
ATKBD_CMD_SETLEDS
))
return
-
1
;
/*
* Restore repeat rate and LEDs (that were reset by atkbd_activate)
* to pre-resume state
*/
if
(
!
atkbd
->
softrepeat
)
atkbd_set_repeat_rate
(
atkbd
);
atkbd_set_leds
(
atkbd
);
}
atkbd_enable
(
atkbd
);
...
...
This diff is collapsed.
Click to expand it.
drivers/input/misc/wistron_btns.c
浏览文件 @
242898be
...
...
@@ -94,7 +94,7 @@ static void call_bios(struct regs *regs)
static
ssize_t
__init
locate_wistron_bios
(
void
__iomem
*
base
)
{
static
const
unsigned
char
__initdata
signature
[]
=
static
unsigned
char
__initdata
signature
[]
=
{
0x42
,
0x21
,
0x55
,
0x30
};
ssize_t
offset
;
...
...
@@ -259,11 +259,11 @@ static int __init dmi_matched(struct dmi_system_id *dmi)
return
1
;
}
static
struct
key_entry
keymap_empty
[]
=
{
static
struct
key_entry
keymap_empty
[]
__initdata
=
{
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_fs_amilo_pro_v2000
[]
=
{
static
struct
key_entry
keymap_fs_amilo_pro_v2000
[]
__initdata
=
{
{
KE_KEY
,
0x01
,
KEY_HELP
},
{
KE_KEY
,
0x11
,
KEY_PROG1
},
{
KE_KEY
,
0x12
,
KEY_PROG2
},
...
...
@@ -273,7 +273,7 @@ static struct key_entry keymap_fs_amilo_pro_v2000[] = {
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_fujitsu_n3510
[]
=
{
static
struct
key_entry
keymap_fujitsu_n3510
[]
__initdata
=
{
{
KE_KEY
,
0x11
,
KEY_PROG1
},
{
KE_KEY
,
0x12
,
KEY_PROG2
},
{
KE_KEY
,
0x36
,
KEY_WWW
},
...
...
@@ -285,7 +285,7 @@ static struct key_entry keymap_fujitsu_n3510[] = {
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_wistron_ms2111
[]
=
{
static
struct
key_entry
keymap_wistron_ms2111
[]
__initdata
=
{
{
KE_KEY
,
0x11
,
KEY_PROG1
},
{
KE_KEY
,
0x12
,
KEY_PROG2
},
{
KE_KEY
,
0x13
,
KEY_PROG3
},
...
...
@@ -294,7 +294,7 @@ static struct key_entry keymap_wistron_ms2111[] = {
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_wistron_ms2141
[]
=
{
static
struct
key_entry
keymap_wistron_ms2141
[]
__initdata
=
{
{
KE_KEY
,
0x11
,
KEY_PROG1
},
{
KE_KEY
,
0x12
,
KEY_PROG2
},
{
KE_WIFI
,
0x30
,
0
},
...
...
@@ -307,7 +307,7 @@ static struct key_entry keymap_wistron_ms2141[] = {
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_acer_aspire_1500
[]
=
{
static
struct
key_entry
keymap_acer_aspire_1500
[]
__initdata
=
{
{
KE_KEY
,
0x11
,
KEY_PROG1
},
{
KE_KEY
,
0x12
,
KEY_PROG2
},
{
KE_WIFI
,
0x30
,
0
},
...
...
@@ -317,7 +317,7 @@ static struct key_entry keymap_acer_aspire_1500[] = {
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_acer_travelmate_240
[]
=
{
static
struct
key_entry
keymap_acer_travelmate_240
[]
__initdata
=
{
{
KE_KEY
,
0x31
,
KEY_MAIL
},
{
KE_KEY
,
0x36
,
KEY_WWW
},
{
KE_KEY
,
0x11
,
KEY_PROG1
},
...
...
@@ -327,7 +327,7 @@ static struct key_entry keymap_acer_travelmate_240[] = {
{
KE_END
,
0
}
};
static
struct
key_entry
keymap_aopen_1559as
[]
=
{
static
struct
key_entry
keymap_aopen_1559as
[]
__initdata
=
{
{
KE_KEY
,
0x01
,
KEY_HELP
},
{
KE_KEY
,
0x06
,
KEY_PROG3
},
{
KE_KEY
,
0x11
,
KEY_PROG1
},
...
...
@@ -343,7 +343,7 @@ static struct key_entry keymap_aopen_1559as[] = {
* a list of buttons and their key codes (reported when loading this module
* with force=1) and the output of dmidecode to $MODULE_AUTHOR.
*/
static
struct
dmi_system_id
dmi_ids
[]
=
{
static
struct
dmi_system_id
dmi_ids
[]
__initdata
=
{
{
.
callback
=
dmi_matched
,
.
ident
=
"Fujitsu-Siemens Amilo Pro V2000"
,
...
...
This diff is collapsed.
Click to expand it.
drivers/input/mouse/logips2pp.c
浏览文件 @
242898be
...
...
@@ -238,8 +238,7 @@ static struct ps2pp_info *get_model_info(unsigned char model)
{
100
,
PS2PP_KIND_MX
,
/* MX510 */
PS2PP_WHEEL
|
PS2PP_SIDE_BTN
|
PS2PP_TASK_BTN
|
PS2PP_EXTRA_BTN
|
PS2PP_NAV_BTN
},
{
111
,
PS2PP_KIND_MX
,
/* MX300 */
PS2PP_WHEEL
|
PS2PP_EXTRA_BTN
|
PS2PP_TASK_BTN
},
{
111
,
PS2PP_KIND_MX
,
PS2PP_WHEEL
|
PS2PP_SIDE_BTN
},
/* MX300 reports task button as side */
{
112
,
PS2PP_KIND_MX
,
/* MX500 */
PS2PP_WHEEL
|
PS2PP_SIDE_BTN
|
PS2PP_TASK_BTN
|
PS2PP_EXTRA_BTN
|
PS2PP_NAV_BTN
},
...
...
This diff is collapsed.
Click to expand it.
drivers/input/mouse/trackpoint.c
浏览文件 @
242898be
...
...
@@ -183,21 +183,26 @@ static struct attribute_group trackpoint_attr_group = {
.
attrs
=
trackpoint_attrs
,
};
static
void
trackpoint_disconnect
(
struct
psmouse
*
psmouse
)
static
int
trackpoint_start_protocol
(
struct
psmouse
*
psmouse
,
unsigned
char
*
firmware_id
)
{
sysfs_remove_group
(
&
psmouse
->
ps2dev
.
serio
->
dev
.
kobj
,
&
trackpoint_attr_group
)
;
unsigned
char
param
[
2
]
=
{
0
}
;
kfree
(
psmouse
->
private
);
psmouse
->
private
=
NULL
;
if
(
ps2_command
(
&
psmouse
->
ps2dev
,
param
,
MAKE_PS2_CMD
(
0
,
2
,
TP_READ_ID
)))
return
-
1
;
if
(
param
[
0
]
!=
TP_MAGIC_IDENT
)
return
-
1
;
if
(
firmware_id
)
*
firmware_id
=
param
[
1
];
return
0
;
}
static
int
trackpoint_sync
(
struct
psmouse
*
psmouse
)
{
unsigned
char
toggle
;
struct
trackpoint_data
*
tp
=
psmouse
->
private
;
if
(
!
tp
)
return
-
1
;
unsigned
char
toggle
;
/* Disable features that may make device unusable with this driver */
trackpoint_read
(
&
psmouse
->
ps2dev
,
TP_TOGGLE_TWOHAND
,
&
toggle
);
...
...
@@ -263,27 +268,38 @@ static void trackpoint_defaults(struct trackpoint_data *tp)
tp
->
ext_dev
=
TP_DEF_EXT_DEV
;
}
static
void
trackpoint_disconnect
(
struct
psmouse
*
psmouse
)
{
sysfs_remove_group
(
&
psmouse
->
ps2dev
.
serio
->
dev
.
kobj
,
&
trackpoint_attr_group
);
kfree
(
psmouse
->
private
);
psmouse
->
private
=
NULL
;
}
static
int
trackpoint_reconnect
(
struct
psmouse
*
psmouse
)
{
if
(
trackpoint_start_protocol
(
psmouse
,
NULL
))
return
-
1
;
if
(
trackpoint_sync
(
psmouse
))
return
-
1
;
return
0
;
}
int
trackpoint_detect
(
struct
psmouse
*
psmouse
,
int
set_properties
)
{
struct
trackpoint_data
*
priv
;
struct
ps2dev
*
ps2dev
=
&
psmouse
->
ps2dev
;
unsigned
char
firmware_id
;
unsigned
char
button_info
;
unsigned
char
param
[
2
];
param
[
0
]
=
param
[
1
]
=
0
;
if
(
ps2_command
(
ps2dev
,
param
,
MAKE_PS2_CMD
(
0
,
2
,
TP_READ_ID
)))
return
-
1
;
if
(
param
[
0
]
!=
TP_MAGIC_IDENT
)
if
(
trackpoint_start_protocol
(
psmouse
,
&
firmware_id
))
return
-
1
;
if
(
!
set_properties
)
return
0
;
firmware_id
=
param
[
1
];
if
(
trackpoint_read
(
&
psmouse
->
ps2dev
,
TP_EXT_BTN
,
&
button_info
))
{
printk
(
KERN_WARNING
"trackpoint.c: failed to get extended button data
\n
"
);
button_info
=
0
;
...
...
@@ -296,7 +312,7 @@ int trackpoint_detect(struct psmouse *psmouse, int set_properties)
psmouse
->
vendor
=
"IBM"
;
psmouse
->
name
=
"TrackPoint"
;
psmouse
->
reconnect
=
trackpoint_
sync
;
psmouse
->
reconnect
=
trackpoint_
reconnect
;
psmouse
->
disconnect
=
trackpoint_disconnect
;
trackpoint_defaults
(
priv
);
...
...
This diff is collapsed.
Click to expand it.
drivers/input/serio/libps2.c
浏览文件 @
242898be
...
...
@@ -177,6 +177,11 @@ int ps2_command(struct ps2dev *ps2dev, unsigned char *param, int command)
return
-
1
;
}
if
(
send
&&
!
param
)
{
WARN_ON
(
1
);
return
-
1
;
}
mutex_lock_nested
(
&
ps2dev
->
cmd_mutex
,
SINGLE_DEPTH_NESTING
);
serio_pause_rx
(
ps2dev
->
serio
);
...
...
This diff is collapsed.
Click to expand it.
drivers/input/serio/serio.c
浏览文件 @
242898be
...
...
@@ -62,6 +62,7 @@ static LIST_HEAD(serio_list);
static
struct
bus_type
serio_bus
;
static
void
serio_add_driver
(
struct
serio_driver
*
drv
);
static
void
serio_add_port
(
struct
serio
*
serio
);
static
void
serio_destroy_port
(
struct
serio
*
serio
);
static
void
serio_reconnect_port
(
struct
serio
*
serio
);
...
...
@@ -140,8 +141,14 @@ static void serio_release_driver(struct serio *serio)
static
void
serio_find_driver
(
struct
serio
*
serio
)
{
int
error
;
down_write
(
&
serio_bus
.
subsys
.
rwsem
);
device_attach
(
&
serio
->
dev
);
error
=
device_attach
(
&
serio
->
dev
);
if
(
error
<
0
)
printk
(
KERN_WARNING
"serio: device_attach() failed for %s (%s), error: %d
\n
"
,
serio
->
phys
,
serio
->
name
,
error
);
up_write
(
&
serio_bus
.
subsys
.
rwsem
);
}
...
...
@@ -272,7 +279,6 @@ static struct serio_event *serio_get_event(void)
static
void
serio_handle_event
(
void
)
{
struct
serio_event
*
event
;
struct
serio_driver
*
serio_drv
;
mutex_lock
(
&
serio_mutex
);
...
...
@@ -304,8 +310,7 @@ static void serio_handle_event(void)
break
;
case
SERIO_REGISTER_DRIVER
:
serio_drv
=
event
->
object
;
driver_register
(
&
serio_drv
->
driver
);
serio_add_driver
(
event
->
object
);
break
;
default:
...
...
@@ -525,6 +530,7 @@ static void serio_init_port(struct serio *serio)
__module_get
(
THIS_MODULE
);
INIT_LIST_HEAD
(
&
serio
->
node
);
spin_lock_init
(
&
serio
->
lock
);
mutex_init
(
&
serio
->
drv_mutex
);
device_initialize
(
&
serio
->
dev
);
...
...
@@ -542,6 +548,8 @@ static void serio_init_port(struct serio *serio)
*/
static
void
serio_add_port
(
struct
serio
*
serio
)
{
int
error
;
if
(
serio
->
parent
)
{
serio_pause_rx
(
serio
->
parent
);
serio
->
parent
->
child
=
serio
;
...
...
@@ -551,9 +559,19 @@ static void serio_add_port(struct serio *serio)
list_add_tail
(
&
serio
->
node
,
&
serio_list
);
if
(
serio
->
start
)
serio
->
start
(
serio
);
device_add
(
&
serio
->
dev
);
sysfs_create_group
(
&
serio
->
dev
.
kobj
,
&
serio_id_attr_group
);
serio
->
registered
=
1
;
error
=
device_add
(
&
serio
->
dev
);
if
(
error
)
printk
(
KERN_ERR
"serio: device_add() failed for %s (%s), error: %d
\n
"
,
serio
->
phys
,
serio
->
name
,
error
);
else
{
serio
->
registered
=
1
;
error
=
sysfs_create_group
(
&
serio
->
dev
.
kobj
,
&
serio_id_attr_group
);
if
(
error
)
printk
(
KERN_ERR
"serio: sysfs_create_group() failed for %s (%s), error: %d
\n
"
,
serio
->
phys
,
serio
->
name
,
error
);
}
}
/*
...
...
@@ -583,10 +601,10 @@ static void serio_destroy_port(struct serio *serio)
if
(
serio
->
registered
)
{
sysfs_remove_group
(
&
serio
->
dev
.
kobj
,
&
serio_id_attr_group
);
device_del
(
&
serio
->
dev
);
list_del_init
(
&
serio
->
node
);
serio
->
registered
=
0
;
}
list_del_init
(
&
serio
->
node
);
serio_remove_pending_events
(
serio
);
put_device
(
&
serio
->
dev
);
}
...
...
@@ -756,6 +774,17 @@ static struct bus_type serio_bus = {
.
remove
=
serio_driver_remove
,
};
static
void
serio_add_driver
(
struct
serio_driver
*
drv
)
{
int
error
;
error
=
driver_register
(
&
drv
->
driver
);
if
(
error
)
printk
(
KERN_ERR
"serio: driver_register() failed for %s, error: %d
\n
"
,
drv
->
driver
.
name
,
error
);
}
void
__serio_register_driver
(
struct
serio_driver
*
drv
,
struct
module
*
owner
)
{
drv
->
driver
.
bus
=
&
serio_bus
;
...
...
@@ -903,18 +932,26 @@ irqreturn_t serio_interrupt(struct serio *serio,
static
int
__init
serio_init
(
void
)
{
serio_task
=
kthread_run
(
serio_thread
,
NULL
,
"kseriod"
);
if
(
IS_ERR
(
serio_task
))
{
printk
(
KERN_ERR
"serio: Failed to start kseriod
\n
"
);
return
PTR_ERR
(
serio_task
);
}
int
error
;
serio_bus
.
dev_attrs
=
serio_device_attrs
;
serio_bus
.
drv_attrs
=
serio_driver_attrs
;
serio_bus
.
match
=
serio_bus_match
;
serio_bus
.
uevent
=
serio_uevent
;
serio_bus
.
resume
=
serio_resume
;
bus_register
(
&
serio_bus
);
error
=
bus_register
(
&
serio_bus
);
if
(
error
)
{
printk
(
KERN_ERR
"serio: failed to register serio bus, error: %d
\n
"
,
error
);
return
error
;
}
serio_task
=
kthread_run
(
serio_thread
,
NULL
,
"kseriod"
);
if
(
IS_ERR
(
serio_task
))
{
bus_unregister
(
&
serio_bus
);
error
=
PTR_ERR
(
serio_task
);
printk
(
KERN_ERR
"serio: Failed to start kseriod, error: %d
\n
"
,
error
);
return
error
;
}
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/isdn/hardware/eicon/divasync.h
浏览文件 @
242898be
...
...
@@ -256,7 +256,6 @@ typedef struct
#define NO_ORDER_CHECK_MASK 0x00000010
#define LOW_CHANNEL_MASK 0x00000020
#define NO_HSCX30_MASK 0x00000040
#define MODE_MASK 0x00000080
#define SET_BOARD 0x00001000
#define SET_CRC4 0x00030000
#define SET_L1_TRISTATE 0x00040000
...
...
This diff is collapsed.
Click to expand it.
drivers/md/linear.c
浏览文件 @
242898be
...
...
@@ -162,7 +162,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
goto
out
;
}
min_spacing
=
mddev
->
array_size
;
min_spacing
=
conf
->
array_size
;
sector_div
(
min_spacing
,
PAGE_SIZE
/
sizeof
(
struct
dev_info
*
));
/* min_spacing is the minimum spacing that will fit the hash
...
...
@@ -171,7 +171,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
* that is larger than min_spacing as use the size of that as
* the actual spacing
*/
conf
->
hash_spacing
=
mddev
->
array_size
;
conf
->
hash_spacing
=
conf
->
array_size
;
for
(
i
=
0
;
i
<
cnt
-
1
;
i
++
)
{
sector_t
sz
=
0
;
int
j
;
...
...
@@ -228,7 +228,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
curr_offset
=
0
;
i
=
0
;
for
(
curr_offset
=
0
;
curr_offset
<
mddev
->
array_size
;
curr_offset
<
conf
->
array_size
;
curr_offset
+=
conf
->
hash_spacing
)
{
while
(
i
<
mddev
->
raid_disks
-
1
&&
...
...
This diff is collapsed.
Click to expand it.
drivers/pnp/pnpacpi/rsparser.c
浏览文件 @
242898be
...
...
@@ -173,6 +173,9 @@ pnpacpi_parse_allocated_address_space(struct pnp_resource_table *res_table,
return
;
}
if
(
p
->
producer_consumer
==
ACPI_PRODUCER
)
return
;
if
(
p
->
resource_type
==
ACPI_MEMORY_RANGE
)
pnpacpi_parse_allocated_memresource
(
res_table
,
p
->
minimum
,
p
->
address_length
);
...
...
@@ -252,9 +255,14 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
break
;
case
ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64
:
if
(
res
->
data
.
ext_address64
.
producer_consumer
==
ACPI_PRODUCER
)
return
AE_OK
;
break
;
case
ACPI_RESOURCE_TYPE_EXTENDED_IRQ
:
if
(
res
->
data
.
extended_irq
.
producer_consumer
==
ACPI_PRODUCER
)
return
AE_OK
;
for
(
i
=
0
;
i
<
res
->
data
.
extended_irq
.
interrupt_count
;
i
++
)
{
pnpacpi_parse_allocated_irqresource
(
res_table
,
res
->
data
.
extended_irq
.
interrupts
[
i
],
...
...
This diff is collapsed.
Click to expand it.
drivers/usb/input/ati_remote.c
浏览文件 @
242898be
...
...
@@ -111,14 +111,28 @@
#define NAME_BUFSIZE 80
/* size of product name, path buffers */
#define DATA_BUFSIZE 63
/* size of URB data buffers */
/*
* Duplicate event filtering time.
* Sequential, identical KIND_FILTERED inputs with less than
* FILTER_TIME milliseconds between them are considered as repeat
* events. The hardware generates 5 events for the first keypress
* and we have to take this into account for an accurate repeat
* behaviour.
*/
#define FILTER_TIME 60
/* msec */
static
unsigned
long
channel_mask
;
module_param
(
channel_mask
,
ulong
,
0
4
44
);
module_param
(
channel_mask
,
ulong
,
0
6
44
);
MODULE_PARM_DESC
(
channel_mask
,
"Bitmask of remote control channels to ignore"
);
static
int
debug
;
module_param
(
debug
,
int
,
0
4
44
);
module_param
(
debug
,
int
,
0
6
44
);
MODULE_PARM_DESC
(
debug
,
"Enable extra debug messages and information"
);
static
int
repeat_filter
=
FILTER_TIME
;
module_param
(
repeat_filter
,
int
,
0644
);
MODULE_PARM_DESC
(
repeat_filter
,
"Repeat filter time, default = 60 msec"
);
#define dbginfo(dev, format, arg...) do { if (debug) dev_info(dev , format , ## arg); } while (0)
#undef err
#define err(format, arg...) printk(KERN_ERR format , ## arg)
...
...
@@ -143,18 +157,6 @@ MODULE_DEVICE_TABLE(usb, ati_remote_table);
static
char
init1
[]
=
{
0x01
,
0x00
,
0x20
,
0x14
};
static
char
init2
[]
=
{
0x01
,
0x00
,
0x20
,
0x14
,
0x20
,
0x20
,
0x20
};
/* Acceleration curve for directional control pad */
static
const
char
accel
[]
=
{
1
,
2
,
4
,
6
,
9
,
13
,
20
};
/* Duplicate event filtering time.
* Sequential, identical KIND_FILTERED inputs with less than
* FILTER_TIME jiffies between them are considered as repeat
* events. The hardware generates 5 events for the first keypress
* and we have to take this into account for an accurate repeat
* behaviour.
*/
#define FILTER_TIME 60
/* msec */
struct
ati_remote
{
struct
input_dev
*
idev
;
struct
usb_device
*
udev
;
...
...
@@ -411,6 +413,43 @@ static int ati_remote_event_lookup(int rem, unsigned char d1, unsigned char d2)
return
-
1
;
}
/*
* ati_remote_compute_accel
*
* Implements acceleration curve for directional control pad
* If elapsed time since last event is > 1/4 second, user "stopped",
* so reset acceleration. Otherwise, user is probably holding the control
* pad down, so we increase acceleration, ramping up over two seconds to
* a maximum speed.
*/
static
int
ati_remote_compute_accel
(
struct
ati_remote
*
ati_remote
)
{
static
const
char
accel
[]
=
{
1
,
2
,
4
,
6
,
9
,
13
,
20
};
unsigned
long
now
=
jiffies
;
int
acc
;
if
(
time_after
(
now
,
ati_remote
->
old_jiffies
+
msecs_to_jiffies
(
250
)))
{
acc
=
1
;
ati_remote
->
acc_jiffies
=
now
;
}
else
if
(
time_before
(
now
,
ati_remote
->
acc_jiffies
+
msecs_to_jiffies
(
125
)))
acc
=
accel
[
0
];
else
if
(
time_before
(
now
,
ati_remote
->
acc_jiffies
+
msecs_to_jiffies
(
250
)))
acc
=
accel
[
1
];
else
if
(
time_before
(
now
,
ati_remote
->
acc_jiffies
+
msecs_to_jiffies
(
500
)))
acc
=
accel
[
2
];
else
if
(
time_before
(
now
,
ati_remote
->
acc_jiffies
+
msecs_to_jiffies
(
1000
)))
acc
=
accel
[
3
];
else
if
(
time_before
(
now
,
ati_remote
->
acc_jiffies
+
msecs_to_jiffies
(
1500
)))
acc
=
accel
[
4
];
else
if
(
time_before
(
now
,
ati_remote
->
acc_jiffies
+
msecs_to_jiffies
(
2000
)))
acc
=
accel
[
5
];
else
acc
=
accel
[
6
];
return
acc
;
}
/*
* ati_remote_report_input
*/
...
...
@@ -464,9 +503,9 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
if
(
ati_remote_tbl
[
index
].
kind
==
KIND_FILTERED
)
{
/* Filter duplicate events which happen "too close" together. */
if
(
(
ati_remote
->
old_data
[
0
]
==
data
[
1
])
&&
(
ati_remote
->
old_data
[
1
]
==
data
[
2
])
&&
time_before
(
jiffies
,
ati_remote
->
old_jiffies
+
msecs_to_jiffies
(
FILTER_TIME
)))
{
if
(
ati_remote
->
old_data
[
0
]
==
data
[
1
]
&&
ati_remote
->
old_data
[
1
]
==
data
[
2
]
&&
time_before
(
jiffies
,
ati_remote
->
old_jiffies
+
msecs_to_jiffies
(
repeat_filter
)))
{
ati_remote
->
repeat_count
++
;
}
else
{
ati_remote
->
repeat_count
=
0
;
...
...
@@ -476,75 +515,61 @@ static void ati_remote_input_report(struct urb *urb, struct pt_regs *regs)
ati_remote
->
old_data
[
1
]
=
data
[
2
];
ati_remote
->
old_jiffies
=
jiffies
;
if
(
(
ati_remote
->
repeat_count
>
0
)
&&
(
ati_remote
->
repeat_count
<
5
)
)
if
(
ati_remote
->
repeat_count
>
0
&&
ati_remote
->
repeat_count
<
5
)
return
;
input_regs
(
dev
,
regs
);
input_event
(
dev
,
ati_remote_tbl
[
index
].
type
,
ati_remote_tbl
[
index
].
code
,
1
);
input_sync
(
dev
);
input_event
(
dev
,
ati_remote_tbl
[
index
].
type
,
ati_remote_tbl
[
index
].
code
,
0
);
input_sync
(
dev
);
return
;
}
}
else
{
/*
* Other event kinds are from the directional control pad, and have an
* acceleration factor applied to them. Without this acceleration, the
* control pad is mostly unusable.
*
* If elapsed time since last event is > 1/4 second, user "stopped",
* so reset acceleration. Otherwise, user is probably holding the control
* pad down, so we increase acceleration, ramping up over two seconds to
* a maximum speed. The acceleration curve is #defined above.
*/
if
(
time_after
(
jiffies
,
ati_remote
->
old_jiffies
+
(
HZ
>>
2
)))
{
acc
=
1
;
ati_remote
->
acc_jiffies
=
jiffies
;
}
else
if
(
time_before
(
jiffies
,
ati_remote
->
acc_jiffies
+
(
HZ
>>
3
)))
acc
=
accel
[
0
];
else
if
(
time_before
(
jiffies
,
ati_remote
->
acc_jiffies
+
(
HZ
>>
2
)))
acc
=
accel
[
1
];
else
if
(
time_before
(
jiffies
,
ati_remote
->
acc_jiffies
+
(
HZ
>>
1
)))
acc
=
accel
[
2
];
else
if
(
time_before
(
jiffies
,
ati_remote
->
acc_jiffies
+
HZ
))
acc
=
accel
[
3
];
else
if
(
time_before
(
jiffies
,
ati_remote
->
acc_jiffies
+
HZ
+
(
HZ
>>
1
)))
acc
=
accel
[
4
];
else
if
(
time_before
(
jiffies
,
ati_remote
->
acc_jiffies
+
(
HZ
<<
1
)))
acc
=
accel
[
5
];
else
acc
=
accel
[
6
];
input_regs
(
dev
,
regs
);
switch
(
ati_remote_tbl
[
index
].
kind
)
{
case
KIND_ACCEL
:
input_event
(
dev
,
ati_remote_tbl
[
index
].
type
,
ati_remote_tbl
[
index
].
code
,
ati_remote_tbl
[
index
].
value
*
acc
);
break
;
case
KIND_LU
:
input_report_rel
(
dev
,
REL_X
,
-
acc
);
input_report_rel
(
dev
,
REL_Y
,
-
acc
);
break
;
case
KIND_RU
:
input_report_rel
(
dev
,
REL_X
,
acc
);
input_report_rel
(
dev
,
REL_Y
,
-
acc
);
break
;
case
KIND_LD
:
input_report_rel
(
dev
,
REL_X
,
-
acc
);
input_report_rel
(
dev
,
REL_Y
,
acc
);
break
;
case
KIND_RD
:
input_report_rel
(
dev
,
REL_X
,
acc
);
input_report_rel
(
dev
,
REL_Y
,
acc
);
break
;
default:
dev_dbg
(
&
ati_remote
->
interface
->
dev
,
"ati_remote kind=%d
\n
"
,
ati_remote_tbl
[
index
].
kind
);
}
input_sync
(
dev
);
/*
* Other event kinds are from the directional control pad, and have an
* acceleration factor applied to them. Without this acceleration, the
* control pad is mostly unusable.
*/
acc
=
ati_remote_compute_accel
(
ati_remote
);
input_regs
(
dev
,
regs
);
switch
(
ati_remote_tbl
[
index
].
kind
)
{
case
KIND_ACCEL
:
input_event
(
dev
,
ati_remote_tbl
[
index
].
type
,
ati_remote_tbl
[
index
].
code
,
ati_remote_tbl
[
index
].
value
*
acc
);
break
;
case
KIND_LU
:
input_report_rel
(
dev
,
REL_X
,
-
acc
);
input_report_rel
(
dev
,
REL_Y
,
-
acc
);
break
;
case
KIND_RU
:
input_report_rel
(
dev
,
REL_X
,
acc
);
input_report_rel
(
dev
,
REL_Y
,
-
acc
);
break
;
case
KIND_LD
:
input_report_rel
(
dev
,
REL_X
,
-
acc
);
input_report_rel
(
dev
,
REL_Y
,
acc
);
break
;
case
KIND_RD
:
input_report_rel
(
dev
,
REL_X
,
acc
);
input_report_rel
(
dev
,
REL_Y
,
acc
);
break
;
default:
dev_dbg
(
&
ati_remote
->
interface
->
dev
,
"ati_remote kind=%d
\n
"
,
ati_remote_tbl
[
index
].
kind
);
}
input_sync
(
dev
);
ati_remote
->
old_jiffies
=
jiffies
;
ati_remote
->
old_data
[
0
]
=
data
[
1
];
ati_remote
->
old_data
[
1
]
=
data
[
2
];
ati_remote
->
old_jiffies
=
jiffies
;
ati_remote
->
old_data
[
0
]
=
data
[
1
];
ati_remote
->
old_data
[
1
]
=
data
[
2
];
}
}
/*
...
...
This diff is collapsed.
Click to expand it.
drivers/usb/input/hid-input.c
浏览文件 @
242898be
...
...
@@ -607,7 +607,8 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
}
if
(
usage
->
hat_min
<
usage
->
hat_max
||
usage
->
hat_dir
)
{
if
(
usage
->
type
==
EV_ABS
&&
(
usage
->
hat_min
<
usage
->
hat_max
||
usage
->
hat_dir
))
{
int
i
;
for
(
i
=
usage
->
code
;
i
<
usage
->
code
+
2
&&
i
<=
max
;
i
++
)
{
input_set_abs_params
(
input
,
i
,
-
1
,
1
,
0
,
0
);
...
...
This diff is collapsed.
Click to expand it.
drivers/usb/input/hiddev.c
浏览文件 @
242898be
...
...
@@ -49,7 +49,7 @@ struct hiddev {
int
open
;
wait_queue_head_t
wait
;
struct
hid_device
*
hid
;
struct
hiddev_list
*
list
;
struct
list_head
list
;
};
struct
hiddev_list
{
...
...
@@ -59,7 +59,7 @@ struct hiddev_list {
unsigned
flags
;
struct
fasync_struct
*
fasync
;
struct
hiddev
*
hiddev
;
struct
hiddev_list
*
next
;
struct
list_head
node
;
};
static
struct
hiddev
*
hiddev_table
[
HIDDEV_MINORS
];
...
...
@@ -73,12 +73,15 @@ static struct hiddev *hiddev_table[HIDDEV_MINORS];
static
struct
hid_report
*
hiddev_lookup_report
(
struct
hid_device
*
hid
,
struct
hiddev_report_info
*
rinfo
)
{
unsigned
flags
=
rinfo
->
report_id
&
~
HID_REPORT_ID_MASK
;
unsigned
int
flags
=
rinfo
->
report_id
&
~
HID_REPORT_ID_MASK
;
unsigned
int
rid
=
rinfo
->
report_id
&
HID_REPORT_ID_MASK
;
struct
hid_report_enum
*
report_enum
;
struct
hid_report
*
report
;
struct
list_head
*
list
;
if
(
rinfo
->
report_type
<
HID_REPORT_TYPE_MIN
||
rinfo
->
report_type
>
HID_REPORT_TYPE_MAX
)
return
NULL
;
rinfo
->
report_type
>
HID_REPORT_TYPE_MAX
)
return
NULL
;
report_enum
=
hid
->
report_enum
+
(
rinfo
->
report_type
-
HID_REPORT_TYPE_MIN
);
...
...
@@ -88,21 +91,25 @@ hiddev_lookup_report(struct hid_device *hid, struct hiddev_report_info *rinfo)
break
;
case
HID_REPORT_ID_FIRST
:
list
=
report_enum
->
report_list
.
next
;
if
(
list
==
&
report_enum
->
report_list
)
if
(
list_empty
(
&
report_enum
->
report_list
))
return
NULL
;
rinfo
->
report_id
=
((
struct
hid_report
*
)
list
)
->
id
;
list
=
report_enum
->
report_list
.
next
;
report
=
list_entry
(
list
,
struct
hid_report
,
list
);
rinfo
->
report_id
=
report
->
id
;
break
;
case
HID_REPORT_ID_NEXT
:
list
=
(
struct
list_head
*
)
report_enum
->
report_id_hash
[
rinfo
->
report_id
&
HID_REPORT_ID_MASK
];
if
(
list
==
NULL
)
report
=
report_enum
->
report_id_hash
[
rid
];
if
(
!
report
)
return
NULL
;
list
=
list
->
next
;
list
=
report
->
list
.
next
;
if
(
list
==
&
report_enum
->
report_list
)
return
NULL
;
rinfo
->
report_id
=
((
struct
hid_report
*
)
list
)
->
id
;
report
=
list_entry
(
list
,
struct
hid_report
,
list
);
rinfo
->
report_id
=
report
->
id
;
break
;
default:
...
...
@@ -125,12 +132,13 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref)
struct
hid_field
*
field
;
if
(
uref
->
report_type
<
HID_REPORT_TYPE_MIN
||
uref
->
report_type
>
HID_REPORT_TYPE_MAX
)
return
NULL
;
uref
->
report_type
>
HID_REPORT_TYPE_MAX
)
return
NULL
;
report_enum
=
hid
->
report_enum
+
(
uref
->
report_type
-
HID_REPORT_TYPE_MIN
);
list_for_each_entry
(
report
,
&
report_enum
->
report_list
,
list
)
list_for_each_entry
(
report
,
&
report_enum
->
report_list
,
list
)
{
for
(
i
=
0
;
i
<
report
->
maxfield
;
i
++
)
{
field
=
report
->
field
[
i
];
for
(
j
=
0
;
j
<
field
->
maxusage
;
j
++
)
{
...
...
@@ -142,6 +150,7 @@ hiddev_lookup_usage(struct hid_device *hid, struct hiddev_usage_ref *uref)
}
}
}
}
return
NULL
;
}
...
...
@@ -150,9 +159,9 @@ static void hiddev_send_event(struct hid_device *hid,
struct
hiddev_usage_ref
*
uref
)
{
struct
hiddev
*
hiddev
=
hid
->
hiddev
;
struct
hiddev_list
*
list
=
hiddev
->
list
;
struct
hiddev_list
*
list
;
while
(
list
)
{
list_for_each_entry
(
list
,
&
hiddev
->
list
,
node
)
{
if
(
uref
->
field_index
!=
HID_FIELD_INDEX_NONE
||
(
list
->
flags
&
HIDDEV_FLAG_REPORT
)
!=
0
)
{
list
->
buffer
[
list
->
head
]
=
*
uref
;
...
...
@@ -160,8 +169,6 @@ static void hiddev_send_event(struct hid_device *hid,
(
HIDDEV_BUFFER_SIZE
-
1
);
kill_fasync
(
&
list
->
fasync
,
SIGIO
,
POLL_IN
);
}
list
=
list
->
next
;
}
wake_up_interruptible
(
&
hiddev
->
wait
);
...
...
@@ -180,7 +187,7 @@ void hiddev_hid_event(struct hid_device *hid, struct hid_field *field,
uref
.
report_type
=
(
type
==
HID_INPUT_REPORT
)
?
HID_REPORT_TYPE_INPUT
:
((
type
==
HID_OUTPUT_REPORT
)
?
HID_REPORT_TYPE_OUTPUT
:
((
type
==
HID_FEATURE_REPORT
)
?
HID_REPORT_TYPE_FEATURE
:
0
));
((
type
==
HID_FEATURE_REPORT
)
?
HID_REPORT_TYPE_FEATURE
:
0
));
uref
.
report_id
=
field
->
report
->
id
;
uref
.
field_index
=
field
->
index
;
uref
.
usage_index
=
(
usage
-
field
->
usage
);
...
...
@@ -200,7 +207,7 @@ void hiddev_report_event(struct hid_device *hid, struct hid_report *report)
uref
.
report_type
=
(
type
==
HID_INPUT_REPORT
)
?
HID_REPORT_TYPE_INPUT
:
((
type
==
HID_OUTPUT_REPORT
)
?
HID_REPORT_TYPE_OUTPUT
:
((
type
==
HID_FEATURE_REPORT
)
?
HID_REPORT_TYPE_FEATURE
:
0
));
((
type
==
HID_FEATURE_REPORT
)
?
HID_REPORT_TYPE_FEATURE
:
0
));
uref
.
report_id
=
report
->
id
;
uref
.
field_index
=
HID_FIELD_INDEX_NONE
;
...
...
@@ -213,7 +220,9 @@ static int hiddev_fasync(int fd, struct file *file, int on)
{
int
retval
;
struct
hiddev_list
*
list
=
file
->
private_data
;
retval
=
fasync_helper
(
fd
,
file
,
on
,
&
list
->
fasync
);
return
retval
<
0
?
retval
:
0
;
}
...
...
@@ -224,14 +233,9 @@ static int hiddev_fasync(int fd, struct file *file, int on)
static
int
hiddev_release
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
hiddev_list
*
list
=
file
->
private_data
;
struct
hiddev_list
**
listptr
;
listptr
=
&
list
->
hiddev
->
list
;
hiddev_fasync
(
-
1
,
file
,
0
);
while
(
*
listptr
&&
(
*
listptr
!=
list
))
listptr
=
&
((
*
listptr
)
->
next
);
*
listptr
=
(
*
listptr
)
->
next
;
list_del
(
&
list
->
node
);
if
(
!--
list
->
hiddev
->
open
)
{
if
(
list
->
hiddev
->
exist
)
...
...
@@ -248,7 +252,8 @@ static int hiddev_release(struct inode * inode, struct file * file)
/*
* open file op
*/
static
int
hiddev_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
static
int
hiddev_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
hiddev_list
*
list
;
int
i
=
iminor
(
inode
)
-
HIDDEV_MINOR_BASE
;
...
...
@@ -260,9 +265,7 @@ static int hiddev_open(struct inode * inode, struct file * file) {
return
-
ENOMEM
;
list
->
hiddev
=
hiddev_table
[
i
];
list
->
next
=
hiddev_table
[
i
]
->
list
;
hiddev_table
[
i
]
->
list
=
list
;
list_add_tail
(
&
list
->
node
,
&
hiddev_table
[
i
]
->
list
);
file
->
private_data
=
list
;
if
(
!
list
->
hiddev
->
open
++
)
...
...
@@ -362,6 +365,7 @@ static ssize_t hiddev_read(struct file * file, char __user * buffer, size_t coun
static
unsigned
int
hiddev_poll
(
struct
file
*
file
,
poll_table
*
wait
)
{
struct
hiddev_list
*
list
=
file
->
private_data
;
poll_wait
(
file
,
&
list
->
hiddev
->
wait
,
wait
);
if
(
list
->
head
!=
list
->
tail
)
return
POLLIN
|
POLLRDNORM
;
...
...
@@ -382,7 +386,7 @@ static int hiddev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
struct
hiddev_collection_info
cinfo
;
struct
hiddev_report_info
rinfo
;
struct
hiddev_field_info
finfo
;
struct
hiddev_usage_ref_multi
*
uref_multi
=
NULL
;
struct
hiddev_usage_ref_multi
*
uref_multi
=
NULL
;
struct
hiddev_usage_ref
*
uref
;
struct
hiddev_devinfo
dinfo
;
struct
hid_report
*
report
;
...
...
@@ -764,15 +768,15 @@ int hiddev_connect(struct hid_device *hid)
}
init_waitqueue_head
(
&
hiddev
->
wait
);
hiddev_table
[
hid
->
intf
->
minor
-
HIDDEV_MINOR_BASE
]
=
hiddev
;
INIT_LIST_HEAD
(
&
hiddev
->
list
);
hiddev
->
hid
=
hid
;
hiddev
->
exist
=
1
;
hid
->
minor
=
hid
->
intf
->
minor
;
hid
->
hiddev
=
hiddev
;
hiddev_table
[
hid
->
intf
->
minor
-
HIDDEV_MINOR_BASE
]
=
hiddev
;
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
drivers/video/aty/aty128fb.c
浏览文件 @
242898be
...
...
@@ -1913,9 +1913,6 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
u8
chip_rev
;
u32
dac
;
if
(
!
par
->
vram_size
)
/* may have already been probed */
par
->
vram_size
=
aty_ld_le32
(
CONFIG_MEMSIZE
)
&
0x03FFFFFF
;
/* Get the chip revision */
chip_rev
=
(
aty_ld_le32
(
CONFIG_CNTL
)
>>
16
)
&
0x1F
;
...
...
@@ -2028,9 +2025,6 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
aty128_init_engine
(
par
);
if
(
register_framebuffer
(
info
)
<
0
)
return
0
;
par
->
pm_reg
=
pci_find_capability
(
pdev
,
PCI_CAP_ID_PM
);
par
->
pdev
=
pdev
;
par
->
asleep
=
0
;
...
...
@@ -2040,6 +2034,9 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
aty128_bl_init
(
par
);
#endif
if
(
register_framebuffer
(
info
)
<
0
)
return
0
;
printk
(
KERN_INFO
"fb%d: %s frame buffer device on %s
\n
"
,
info
->
node
,
info
->
fix
.
id
,
video_card
);
...
...
@@ -2089,7 +2086,6 @@ static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_
par
=
info
->
par
;
info
->
pseudo_palette
=
par
->
pseudo_palette
;
info
->
fix
=
aty128fb_fix
;
/* Virtualize mmio region */
info
->
fix
.
mmio_start
=
reg_addr
;
...
...
This diff is collapsed.
Click to expand it.
drivers/video/au1100fb.c
浏览文件 @
242898be
...
...
@@ -156,7 +156,7 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
info
->
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
info
->
fix
.
line_length
=
info
->
var
.
xres_virtual
<<
1
;
/* depth=16 */
}
}
}
else
{
/* mono */
info
->
fix
.
visual
=
FB_VISUAL_MONO10
;
...
...
@@ -164,20 +164,16 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
}
info
->
screen_size
=
info
->
fix
.
line_length
*
info
->
var
.
yres_virtual
;
info
->
var
.
rotate
=
((
fbdev
->
panel
->
control_base
&
LCD_CONTROL_SM_MASK
)
\
>>
LCD_CONTROL_SM_BIT
)
*
90
;
/* Determine BPP mode and format */
fbdev
->
regs
->
lcd_control
=
fbdev
->
panel
->
control_base
|
((
info
->
var
.
rotate
/
90
)
<<
LCD_CONTROL_SM_BIT
);
fbdev
->
regs
->
lcd_intenable
=
0
;
fbdev
->
regs
->
lcd_intstatus
=
0
;
fbdev
->
regs
->
lcd_control
=
fbdev
->
panel
->
control_base
;
fbdev
->
regs
->
lcd_horztiming
=
fbdev
->
panel
->
horztiming
;
fbdev
->
regs
->
lcd_verttiming
=
fbdev
->
panel
->
verttiming
;
fbdev
->
regs
->
lcd_clkcontrol
=
fbdev
->
panel
->
clkcontrol_base
;
fbdev
->
regs
->
lcd_intenable
=
0
;
fbdev
->
regs
->
lcd_intstatus
=
0
;
fbdev
->
regs
->
lcd_dmaaddr0
=
LCD_DMA_SA_N
(
fbdev
->
fb_phys
);
if
(
panel_is_dual
(
fbdev
->
panel
))
{
...
...
@@ -206,6 +202,8 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
/* Resume controller */
fbdev
->
regs
->
lcd_control
|=
LCD_CONTROL_GO
;
mdelay
(
10
);
au1100fb_fb_blank
(
VESA_NO_BLANKING
,
info
);
return
0
;
}
...
...
This diff is collapsed.
Click to expand it.
fs/befs/linuxvfs.c
浏览文件 @
242898be
...
...
@@ -512,7 +512,11 @@ befs_utf2nls(struct super_block *sb, const char *in,
wchar_t
uni
;
int
unilen
,
utflen
;
char
*
result
;
int
maxlen
=
in_len
;
/* The utf8->nls conversion can't make more chars */
/* The utf8->nls conversion won't make the final nls string bigger
* than the utf one, but if the string is pure ascii they'll have the
* same width and an extra char is needed to save the additional \0
*/
int
maxlen
=
in_len
+
1
;
befs_debug
(
sb
,
"---> utf2nls()"
);
...
...
@@ -588,7 +592,10 @@ befs_nls2utf(struct super_block *sb, const char *in,
wchar_t
uni
;
int
unilen
,
utflen
;
char
*
result
;
int
maxlen
=
3
*
in_len
;
/* There're nls characters that will translate to 3-chars-wide UTF-8
* characters, a additional byte is needed to save the final \0
* in special cases */
int
maxlen
=
(
3
*
in_len
)
+
1
;
befs_debug
(
sb
,
"---> nls2utf()
\n
"
);
...
...
This diff is collapsed.
Click to expand it.
fs/lockd/svclock.c
浏览文件 @
242898be
...
...
@@ -638,9 +638,6 @@ static void nlmsvc_grant_callback(struct rpc_task *task, void *data)
if
(
task
->
tk_status
<
0
)
{
/* RPC error: Re-insert for retransmission */
timeout
=
10
*
HZ
;
}
else
if
(
block
->
b_done
)
{
/* Block already removed, kill it for real */
timeout
=
0
;
}
else
{
/* Call was successful, now wait for client callback */
timeout
=
60
*
HZ
;
...
...
@@ -709,13 +706,10 @@ nlmsvc_retry_blocked(void)
break
;
if
(
time_after
(
block
->
b_when
,
jiffies
))
break
;
dprintk
(
"nlmsvc_retry_blocked(%p, when=%ld
, done=%d
)
\n
"
,
block
,
block
->
b_when
,
block
->
b_done
);
dprintk
(
"nlmsvc_retry_blocked(%p, when=%ld)
\n
"
,
block
,
block
->
b_when
);
kref_get
(
&
block
->
b_count
);
if
(
block
->
b_done
)
nlmsvc_unlink_block
(
block
);
else
nlmsvc_grant_blocked
(
block
);
nlmsvc_grant_blocked
(
block
);
nlmsvc_release_block
(
block
);
}
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/namespace.c
浏览文件 @
242898be
...
...
@@ -51,7 +51,7 @@ char *nfs_path(const char *base, const struct dentry *dentry,
namelen
=
dentry
->
d_name
.
len
;
buflen
-=
namelen
+
1
;
if
(
buflen
<
0
)
goto
Elong
;
goto
Elong
_unlock
;
end
-=
namelen
;
memcpy
(
end
,
dentry
->
d_name
.
name
,
namelen
);
*--
end
=
'/'
;
...
...
@@ -68,6 +68,8 @@ char *nfs_path(const char *base, const struct dentry *dentry,
end
-=
namelen
;
memcpy
(
end
,
base
,
namelen
);
return
end
;
Elong_unlock:
spin_unlock
(
&
dcache_lock
);
Elong:
return
ERR_PTR
(
-
ENAMETOOLONG
);
}
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/read.c
浏览文件 @
242898be
...
...
@@ -63,7 +63,7 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
return
p
;
}
void
nfs_readdata_free
(
struct
nfs_read_data
*
p
)
static
void
nfs_readdata_free
(
struct
nfs_read_data
*
p
)
{
if
(
p
&&
(
p
->
pagevec
!=
&
p
->
page_array
[
0
]))
kfree
(
p
->
pagevec
);
...
...
This diff is collapsed.
Click to expand it.
fs/nfs/write.c
浏览文件 @
242898be
...
...
@@ -137,7 +137,7 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
return
p
;
}
void
nfs_writedata_free
(
struct
nfs_write_data
*
p
)
static
void
nfs_writedata_free
(
struct
nfs_write_data
*
p
)
{
if
(
p
&&
(
p
->
pagevec
!=
&
p
->
page_array
[
0
]))
kfree
(
p
->
pagevec
);
...
...
This diff is collapsed.
Click to expand it.
fs/reiserfs/file.c
浏览文件 @
242898be
...
...
@@ -48,8 +48,8 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
return
0
;
}
reiserfs_write_lock
(
inode
->
i_sb
);
mutex_lock
(
&
inode
->
i_mutex
);
reiserfs_write_lock
(
inode
->
i_sb
);
/* freeing preallocation only involves relogging blocks that
* are already in the current transaction. preallocation gets
* freed at the end of each transaction, so it is impossible for
...
...
This diff is collapsed.
Click to expand it.
fs/reiserfs/inode.c
浏览文件 @
242898be
...
...
@@ -39,14 +39,10 @@ void reiserfs_delete_inode(struct inode *inode)
/* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */
if
(
!
(
inode
->
i_state
&
I_NEW
)
&&
INODE_PKEY
(
inode
)
->
k_objectid
!=
0
)
{
/* also handles bad_inode case */
mutex_lock
(
&
inode
->
i_mutex
);
reiserfs_delete_xattrs
(
inode
);
if
(
journal_begin
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
{
mutex_unlock
(
&
inode
->
i_mutex
);
if
(
journal_begin
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
goto
out
;
}
reiserfs_update_inode_transaction
(
inode
);
err
=
reiserfs_delete_object
(
&
th
,
inode
);
...
...
@@ -57,12 +53,8 @@ void reiserfs_delete_inode(struct inode *inode)
if
(
!
err
)
DQUOT_FREE_INODE
(
inode
);
if
(
journal_end
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
{
mutex_unlock
(
&
inode
->
i_mutex
);
if
(
journal_end
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
goto
out
;
}
mutex_unlock
(
&
inode
->
i_mutex
);
/* check return value from reiserfs_delete_object after
* ending the transaction
...
...
@@ -2348,6 +2340,7 @@ static int reiserfs_write_full_page(struct page *page,
unsigned
long
end_index
=
inode
->
i_size
>>
PAGE_CACHE_SHIFT
;
int
error
=
0
;
unsigned
long
block
;
sector_t
last_block
;
struct
buffer_head
*
head
,
*
bh
;
int
partial
=
0
;
int
nr
=
0
;
...
...
@@ -2395,10 +2388,19 @@ static int reiserfs_write_full_page(struct page *page,
}
bh
=
head
;
block
=
page
->
index
<<
(
PAGE_CACHE_SHIFT
-
s
->
s_blocksize_bits
);
last_block
=
(
i_size_read
(
inode
)
-
1
)
>>
inode
->
i_blkbits
;
/* first map all the buffers, logging any direct items we find */
do
{
if
((
checked
||
buffer_dirty
(
bh
))
&&
(
!
buffer_mapped
(
bh
)
||
(
buffer_mapped
(
bh
)
if
(
block
>
last_block
)
{
/*
* This can happen when the block size is less than
* the page size. The corresponding bytes in the page
* were zero filled above
*/
clear_buffer_dirty
(
bh
);
set_buffer_uptodate
(
bh
);
}
else
if
((
checked
||
buffer_dirty
(
bh
))
&&
(
!
buffer_mapped
(
bh
)
||
(
buffer_mapped
(
bh
)
&&
bh
->
b_blocknr
==
0
)))
{
/* not mapped yet, or it points to a direct item, search
...
...
This diff is collapsed.
Click to expand it.
fs/reiserfs/ioctl.c
浏览文件 @
242898be
...
...
@@ -116,12 +116,12 @@ static int reiserfs_unpack(struct inode *inode, struct file *filp)
if
(
REISERFS_I
(
inode
)
->
i_flags
&
i_nopack_mask
)
{
return
0
;
}
reiserfs_write_lock
(
inode
->
i_sb
);
/* we need to make sure nobody is changing the file size beneath
** us
*/
mutex_lock
(
&
inode
->
i_mutex
);
reiserfs_write_lock
(
inode
->
i_sb
);
write_from
=
inode
->
i_size
&
(
blocksize
-
1
);
/* if we are on a block boundary, we are already unpacked. */
...
...
This diff is collapsed.
Click to expand it.
fs/udf/ialloc.c
浏览文件 @
242898be
...
...
@@ -75,6 +75,12 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err)
}
*
err
=
-
ENOSPC
;
UDF_I_UNIQUE
(
inode
)
=
0
;
UDF_I_LENEXTENTS
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_BLOCK
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_GOAL
(
inode
)
=
0
;
UDF_I_STRAT4096
(
inode
)
=
0
;
block
=
udf_new_block
(
dir
->
i_sb
,
NULL
,
UDF_I_LOCATION
(
dir
).
partitionReferenceNum
,
start
,
err
);
if
(
*
err
)
...
...
@@ -84,11 +90,6 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err)
}
mutex_lock
(
&
sbi
->
s_alloc_mutex
);
UDF_I_UNIQUE
(
inode
)
=
0
;
UDF_I_LENEXTENTS
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_BLOCK
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_GOAL
(
inode
)
=
0
;
UDF_I_STRAT4096
(
inode
)
=
0
;
if
(
UDF_SB_LVIDBH
(
sb
))
{
struct
logicalVolHeaderDesc
*
lvhd
;
...
...
This diff is collapsed.
Click to expand it.
fs/ufs/balloc.c
浏览文件 @
242898be
...
...
@@ -248,7 +248,7 @@ static void ufs_change_blocknr(struct inode *inode, unsigned int baseblk,
if
(
likely
(
cur_index
!=
index
))
{
page
=
ufs_get_locked_page
(
mapping
,
index
);
if
(
IS_ERR
(
page
))
if
(
!
page
||
IS_ERR
(
page
))
/* it was truncated or EIO */
continue
;
}
else
page
=
locked_page
;
...
...
This diff is collapsed.
Click to expand it.
fs/ufs/util.c
浏览文件 @
242898be
...
...
@@ -251,12 +251,12 @@ struct page *ufs_get_locked_page(struct address_space *mapping,
{
struct
page
*
page
;
try_again:
page
=
find_lock_page
(
mapping
,
index
);
if
(
!
page
)
{
page
=
read_cache_page
(
mapping
,
index
,
(
filler_t
*
)
mapping
->
a_ops
->
readpage
,
NULL
);
if
(
IS_ERR
(
page
))
{
printk
(
KERN_ERR
"ufs_change_blocknr: "
"read_cache_page error: ino %lu, index: %lu
\n
"
,
...
...
@@ -266,6 +266,14 @@ struct page *ufs_get_locked_page(struct address_space *mapping,
lock_page
(
page
);
if
(
unlikely
(
page
->
mapping
==
NULL
))
{
/* Truncate got there first */
unlock_page
(
page
);
page_cache_release
(
page
);
page
=
NULL
;
goto
out
;
}
if
(
!
PageUptodate
(
page
)
||
PageError
(
page
))
{
unlock_page
(
page
);
page_cache_release
(
page
);
...
...
@@ -275,15 +283,8 @@ struct page *ufs_get_locked_page(struct address_space *mapping,
mapping
->
host
->
i_ino
,
index
);
page
=
ERR_PTR
(
-
EIO
);
goto
out
;
}
}
if
(
unlikely
(
!
page
->
mapping
||
!
page_has_buffers
(
page
)))
{
unlock_page
(
page
);
page_cache_release
(
page
);
goto
try_again
;
/*we really need these buffers*/
}
out:
return
page
;
}
This diff is collapsed.
Click to expand it.
include/linux/debug_locks.h
浏览文件 @
242898be
#ifndef __LINUX_DEBUG_LOCKING_H
#define __LINUX_DEBUG_LOCKING_H
struct
task_struct
;
extern
int
debug_locks
;
extern
int
debug_locks_silent
;
...
...
This diff is collapsed.
Click to expand it.
include/linux/input.h
浏览文件 @
242898be
...
...
@@ -893,7 +893,6 @@ struct input_dev {
int
(
*
open
)(
struct
input_dev
*
dev
);
void
(
*
close
)(
struct
input_dev
*
dev
);
int
(
*
accept
)(
struct
input_dev
*
dev
,
struct
file
*
file
);
int
(
*
flush
)(
struct
input_dev
*
dev
,
struct
file
*
file
);
int
(
*
event
)(
struct
input_dev
*
dev
,
unsigned
int
type
,
unsigned
int
code
,
int
value
);
int
(
*
upload_effect
)(
struct
input_dev
*
dev
,
struct
ff_effect
*
effect
);
...
...
@@ -961,6 +960,26 @@ struct input_dev {
struct
input_handle
;
/**
* struct input_handler - implements one of interfaces for input devices
* @private: driver-specific data
* @event: event handler
* @connect: called when attaching a handler to an input device
* @disconnect: disconnects a handler from input device
* @start: starts handler for given handle. This function is called by
* input core right after connect() method and also when a process
* that "grabbed" a device releases it
* @fops: file operations this driver implements
* @minor: beginning of range of 32 minors for devices this driver
* can provide
* @name: name of the handler, to be shown in /proc/bus/input/handlers
* @id_table: pointer to a table of input_device_ids this driver can
* handle
* @blacklist: prointer to a table of input_device_ids this driver should
* ignore even if they match @id_table
* @h_list: list of input handles associated with the handler
* @node: for placing the driver onto input_handler_list
*/
struct
input_handler
{
void
*
private
;
...
...
@@ -968,6 +987,7 @@ struct input_handler {
void
(
*
event
)(
struct
input_handle
*
handle
,
unsigned
int
type
,
unsigned
int
code
,
int
value
);
struct
input_handle
*
(
*
connect
)(
struct
input_handler
*
handler
,
struct
input_dev
*
dev
,
struct
input_device_id
*
id
);
void
(
*
disconnect
)(
struct
input_handle
*
handle
);
void
(
*
start
)(
struct
input_handle
*
handle
);
const
struct
file_operations
*
fops
;
int
minor
;
...
...
@@ -1030,10 +1050,10 @@ void input_release_device(struct input_handle *);
int
input_open_device
(
struct
input_handle
*
);
void
input_close_device
(
struct
input_handle
*
);
int
input_accept_process
(
struct
input_handle
*
handle
,
struct
file
*
file
);
int
input_flush_device
(
struct
input_handle
*
handle
,
struct
file
*
file
);
void
input_event
(
struct
input_dev
*
dev
,
unsigned
int
type
,
unsigned
int
code
,
int
value
);
void
input_inject_event
(
struct
input_handle
*
handle
,
unsigned
int
type
,
unsigned
int
code
,
int
value
);
static
inline
void
input_report_key
(
struct
input_dev
*
dev
,
unsigned
int
code
,
int
value
)
{
...
...
This diff is collapsed.
Click to expand it.
include/linux/lockd/lockd.h
浏览文件 @
242898be
...
...
@@ -123,7 +123,6 @@ struct nlm_block {
unsigned
int
b_id
;
/* block id */
unsigned
char
b_queued
;
/* re-queued */
unsigned
char
b_granted
;
/* VFS granted lock */
unsigned
char
b_done
;
/* callback complete */
struct
nlm_file
*
b_file
;
/* file in question */
};
...
...
This diff is collapsed.
Click to expand it.
include/linux/nfs_fs.h
浏览文件 @
242898be
...
...
@@ -476,10 +476,9 @@ static inline int nfs_wb_page(struct inode *inode, struct page* page)
}
/*
* Allocate
and free
nfs_write_data structures
* Allocate nfs_write_data structures
*/
extern
struct
nfs_write_data
*
nfs_writedata_alloc
(
unsigned
int
pagecount
);
extern
void
nfs_writedata_free
(
struct
nfs_write_data
*
p
);
/*
* linux/fs/nfs/read.c
...
...
@@ -491,10 +490,9 @@ extern int nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
extern
void
nfs_readdata_release
(
void
*
data
);
/*
* Allocate
and free
nfs_read_data structures
* Allocate nfs_read_data structures
*/
extern
struct
nfs_read_data
*
nfs_readdata_alloc
(
unsigned
int
pagecount
);
extern
void
nfs_readdata_free
(
struct
nfs_read_data
*
p
);
/*
* linux/fs/nfs3proc.c
...
...
This diff is collapsed.
Click to expand it.
include/linux/sched.h
浏览文件 @
242898be
...
...
@@ -1557,6 +1557,14 @@ static inline void freeze(struct task_struct *p)
p
->
flags
|=
PF_FREEZE
;
}
/*
* Sometimes we may need to cancel the previous 'freeze' request
*/
static
inline
void
do_not_freeze
(
struct
task_struct
*
p
)
{
p
->
flags
&=
~
PF_FREEZE
;
}
/*
* Wake up a frozen process
*/
...
...
This diff is collapsed.
Click to expand it.
include/linux/sunrpc/xprt.h
浏览文件 @
242898be
...
...
@@ -229,7 +229,7 @@ int xprt_reserve_xprt(struct rpc_task *task);
int
xprt_reserve_xprt_cong
(
struct
rpc_task
*
task
);
int
xprt_prepare_transmit
(
struct
rpc_task
*
task
);
void
xprt_transmit
(
struct
rpc_task
*
task
);
void
xprt_
abort
_transmit
(
struct
rpc_task
*
task
);
void
xprt_
end
_transmit
(
struct
rpc_task
*
task
);
int
xprt_adjust_timeout
(
struct
rpc_rqst
*
req
);
void
xprt_release_xprt
(
struct
rpc_xprt
*
xprt
,
struct
rpc_task
*
task
);
void
xprt_release_xprt_cong
(
struct
rpc_xprt
*
xprt
,
struct
rpc_task
*
task
);
...
...
This diff is collapsed.
Click to expand it.
include/linux/vmstat.h
浏览文件 @
242898be
...
...
@@ -41,23 +41,23 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states);
static
inline
void
__count_vm_event
(
enum
vm_event_item
item
)
{
__get_cpu_var
(
vm_event_states
.
event
[
item
])
++
;
__get_cpu_var
(
vm_event_states
).
event
[
item
]
++
;
}
static
inline
void
count_vm_event
(
enum
vm_event_item
item
)
{
get_cpu_var
(
vm_event_states
.
event
[
item
])
++
;
get_cpu_var
(
vm_event_states
).
event
[
item
]
++
;
put_cpu
();
}
static
inline
void
__count_vm_events
(
enum
vm_event_item
item
,
long
delta
)
{
__get_cpu_var
(
vm_event_states
.
event
[
item
])
+=
delta
;
__get_cpu_var
(
vm_event_states
).
event
[
item
]
+=
delta
;
}
static
inline
void
count_vm_events
(
enum
vm_event_item
item
,
long
delta
)
{
get_cpu_var
(
vm_event_states
.
event
[
item
])
+=
delta
;
get_cpu_var
(
vm_event_states
).
event
[
item
]
+=
delta
;
put_cpu
();
}
...
...
This diff is collapsed.
Click to expand it.
include/net/red.h
浏览文件 @
242898be
...
...
@@ -212,7 +212,7 @@ static inline unsigned long red_calc_qavg_from_idle_time(struct red_parms *p)
* Seems, it is the best solution to
* problem of too coarse exponent tabulation.
*/
us_idle
=
(
p
->
qavg
*
us_idle
)
>>
p
->
Scell_log
;
us_idle
=
(
p
->
qavg
*
(
u64
)
us_idle
)
>>
p
->
Scell_log
;
if
(
us_idle
<
(
p
->
qavg
>>
1
))
return
p
->
qavg
-
us_idle
;
...
...
This diff is collapsed.
Click to expand it.
kernel/fork.c
浏览文件 @
242898be
...
...
@@ -1387,8 +1387,10 @@ long do_fork(unsigned long clone_flags,
if
(
clone_flags
&
CLONE_VFORK
)
{
wait_for_completion
(
&
vfork
);
if
(
unlikely
(
current
->
ptrace
&
PT_TRACE_VFORK_DONE
))
if
(
unlikely
(
current
->
ptrace
&
PT_TRACE_VFORK_DONE
))
{
current
->
ptrace_message
=
nr
;
ptrace_notify
((
PTRACE_EVENT_VFORK_DONE
<<
8
)
|
SIGTRAP
);
}
}
}
else
{
free_pid
(
pid
);
...
...
This diff is collapsed.
Click to expand it.
kernel/futex.c
浏览文件 @
242898be
...
...
@@ -948,6 +948,7 @@ static int unqueue_me(struct futex_q *q)
/* In the common case we don't take the spinlock, which is nice. */
retry:
lock_ptr
=
q
->
lock_ptr
;
barrier
();
if
(
lock_ptr
!=
0
)
{
spin_lock
(
lock_ptr
);
/*
...
...
This diff is collapsed.
Click to expand it.
kernel/futex_compat.c
浏览文件 @
242898be
...
...
@@ -39,7 +39,7 @@ void compat_exit_robust_list(struct task_struct *curr)
{
struct
compat_robust_list_head
__user
*
head
=
curr
->
compat_robust_list
;
struct
robust_list
__user
*
entry
,
*
pending
;
unsigned
int
limit
=
ROBUST_LIST_LIMIT
,
pi
;
unsigned
int
limit
=
ROBUST_LIST_LIMIT
,
pi
,
pip
;
compat_uptr_t
uentry
,
upending
;
compat_long_t
futex_offset
;
...
...
@@ -59,10 +59,10 @@ void compat_exit_robust_list(struct task_struct *curr)
* if it exists:
*/
if
(
fetch_robust_entry
(
&
upending
,
&
pending
,
&
head
->
list_op_pending
,
&
pi
))
&
head
->
list_op_pending
,
&
pi
p
))
return
;
if
(
upending
)
handle_futex_death
((
void
*
)
pending
+
futex_offset
,
curr
,
pi
);
handle_futex_death
((
void
*
)
pending
+
futex_offset
,
curr
,
pi
p
);
while
(
compat_ptr
(
uentry
)
!=
&
head
->
list
)
{
/*
...
...
This diff is collapsed.
Click to expand it.
kernel/power/process.c
浏览文件 @
242898be
...
...
@@ -66,13 +66,25 @@ static inline void freeze_process(struct task_struct *p)
}
}
static
void
cancel_freezing
(
struct
task_struct
*
p
)
{
unsigned
long
flags
;
if
(
freezing
(
p
))
{
pr_debug
(
" clean up: %s
\n
"
,
p
->
comm
);
do_not_freeze
(
p
);
spin_lock_irqsave
(
&
p
->
sighand
->
siglock
,
flags
);
recalc_sigpending_tsk
(
p
);
spin_unlock_irqrestore
(
&
p
->
sighand
->
siglock
,
flags
);
}
}
/* 0 = success, else # of processes that we failed to stop */
int
freeze_processes
(
void
)
{
int
todo
,
nr_user
,
user_frozen
;
unsigned
long
start_time
;
struct
task_struct
*
g
,
*
p
;
unsigned
long
flags
;
printk
(
"Stopping tasks: "
);
start_time
=
jiffies
;
...
...
@@ -85,6 +97,10 @@ int freeze_processes(void)
continue
;
if
(
frozen
(
p
))
continue
;
if
(
p
->
state
==
TASK_TRACED
&&
frozen
(
p
->
parent
))
{
cancel_freezing
(
p
);
continue
;
}
if
(
p
->
mm
&&
!
(
p
->
flags
&
PF_BORROWED_MM
))
{
/* The task is a user-space one.
* Freeze it unless there's a vfork completion
...
...
@@ -126,13 +142,7 @@ int freeze_processes(void)
do_each_thread
(
g
,
p
)
{
if
(
freezeable
(
p
)
&&
!
frozen
(
p
))
printk
(
KERN_ERR
" %s
\n
"
,
p
->
comm
);
if
(
freezing
(
p
))
{
pr_debug
(
" clean up: %s
\n
"
,
p
->
comm
);
p
->
flags
&=
~
PF_FREEZE
;
spin_lock_irqsave
(
&
p
->
sighand
->
siglock
,
flags
);
recalc_sigpending_tsk
(
p
);
spin_unlock_irqrestore
(
&
p
->
sighand
->
siglock
,
flags
);
}
cancel_freezing
(
p
);
}
while_each_thread
(
g
,
p
);
read_unlock
(
&
tasklist_lock
);
return
todo
;
...
...
This diff is collapsed.
Click to expand it.
kernel/printk.c
浏览文件 @
242898be
...
...
@@ -799,6 +799,9 @@ void release_console_sem(void)
up
(
&
secondary_console_sem
);
return
;
}
console_may_schedule
=
0
;
for
(
;
;
)
{
spin_lock_irqsave
(
&
logbuf_lock
,
flags
);
wake_klogd
|=
log_start
-
log_end
;
...
...
@@ -812,7 +815,6 @@ void release_console_sem(void)
local_irq_restore
(
flags
);
}
console_locked
=
0
;
console_may_schedule
=
0
;
up
(
&
console_sem
);
spin_unlock_irqrestore
(
&
logbuf_lock
,
flags
);
if
(
wake_klogd
&&
!
oops_in_progress
&&
waitqueue_active
(
&
log_wait
))
{
...
...
This diff is collapsed.
Click to expand it.
kernel/resource.c
浏览文件 @
242898be
...
...
@@ -244,6 +244,7 @@ int find_next_system_ram(struct resource *res)
start
=
res
->
start
;
end
=
res
->
end
;
BUG_ON
(
start
>=
end
);
read_lock
(
&
resource_lock
);
for
(
p
=
iomem_resource
.
child
;
p
;
p
=
p
->
sibling
)
{
...
...
@@ -254,15 +255,17 @@ int find_next_system_ram(struct resource *res)
p
=
NULL
;
break
;
}
if
(
p
->
start
>=
start
)
if
(
(
p
->
end
>=
start
)
&&
(
p
->
start
<
end
)
)
break
;
}
read_unlock
(
&
resource_lock
);
if
(
!
p
)
return
-
1
;
/* copy data */
res
->
start
=
p
->
start
;
res
->
end
=
p
->
end
;
if
(
res
->
start
<
p
->
start
)
res
->
start
=
p
->
start
;
if
(
res
->
end
>
p
->
end
)
res
->
end
=
p
->
end
;
return
0
;
}
#endif
...
...
This diff is collapsed.
Click to expand it.
lib/spinlock_debug.c
浏览文件 @
242898be
...
...
@@ -162,6 +162,7 @@ static void rwlock_bug(rwlock_t *lock, const char *msg)
#define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg)
#if 0 /* __write_lock_debug() can lock up - maybe this can too? */
static void __read_lock_debug(rwlock_t *lock)
{
int print_once = 1;
...
...
@@ -184,12 +185,12 @@ static void __read_lock_debug(rwlock_t *lock)
}
}
}
#endif
void
_raw_read_lock
(
rwlock_t
*
lock
)
{
RWLOCK_BUG_ON
(
lock
->
magic
!=
RWLOCK_MAGIC
,
lock
,
"bad magic"
);
if
(
unlikely
(
!
__raw_read_trylock
(
&
lock
->
raw_lock
)))
__read_lock_debug
(
lock
);
__raw_read_lock
(
&
lock
->
raw_lock
);
}
int
_raw_read_trylock
(
rwlock_t
*
lock
)
...
...
@@ -235,6 +236,7 @@ static inline void debug_write_unlock(rwlock_t *lock)
lock
->
owner_cpu
=
-
1
;
}
#if 0 /* This can cause lockups */
static void __write_lock_debug(rwlock_t *lock)
{
int print_once = 1;
...
...
@@ -257,12 +259,12 @@ static void __write_lock_debug(rwlock_t *lock)
}
}
}
#endif
void
_raw_write_lock
(
rwlock_t
*
lock
)
{
debug_write_lock_before
(
lock
);
if
(
unlikely
(
!
__raw_write_trylock
(
&
lock
->
raw_lock
)))
__write_lock_debug
(
lock
);
__raw_write_lock
(
&
lock
->
raw_lock
);
debug_write_lock_after
(
lock
);
}
...
...
This diff is collapsed.
Click to expand it.
mm/fadvise.c
浏览文件 @
242898be
...
...
@@ -73,7 +73,6 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
file
->
f_ra
.
ra_pages
=
bdi
->
ra_pages
*
2
;
break
;
case
POSIX_FADV_WILLNEED
:
case
POSIX_FADV_NOREUSE
:
if
(
!
mapping
->
a_ops
->
readpage
)
{
ret
=
-
EINVAL
;
break
;
...
...
@@ -94,6 +93,8 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
if
(
ret
>
0
)
ret
=
0
;
break
;
case
POSIX_FADV_NOREUSE
:
break
;
case
POSIX_FADV_DONTNEED
:
if
(
!
bdi_write_congested
(
mapping
->
backing_dev_info
))
filemap_flush
(
mapping
);
...
...
This diff is collapsed.
Click to expand it.
mm/memory_hotplug.c
浏览文件 @
242898be
...
...
@@ -52,6 +52,9 @@ static int __add_section(struct zone *zone, unsigned long phys_start_pfn)
int
nr_pages
=
PAGES_PER_SECTION
;
int
ret
;
if
(
pfn_valid
(
phys_start_pfn
))
return
-
EEXIST
;
ret
=
sparse_add_one_section
(
zone
,
phys_start_pfn
,
nr_pages
);
if
(
ret
<
0
)
...
...
@@ -76,15 +79,22 @@ int __add_pages(struct zone *zone, unsigned long phys_start_pfn,
{
unsigned
long
i
;
int
err
=
0
;
int
start_sec
,
end_sec
;
/* during initialize mem_map, align hot-added range to section */
start_sec
=
pfn_to_section_nr
(
phys_start_pfn
);
end_sec
=
pfn_to_section_nr
(
phys_start_pfn
+
nr_pages
-
1
);
for
(
i
=
0
;
i
<
nr_pages
;
i
+=
PAGES_PER_SECTION
)
{
err
=
__add_section
(
zone
,
phys_start_pfn
+
i
);
for
(
i
=
start_sec
;
i
<=
end_sec
;
i
++
)
{
err
=
__add_section
(
zone
,
i
<<
PFN_SECTION_SHIFT
);
/* We want to keep adding the rest of the
* sections if the first ones already exist
/*
* EEXIST is finally dealed with by ioresource collision
* check. see add_memory() => register_memory_resource()
* Warning will be printed if there is collision.
*/
if
(
err
&&
(
err
!=
-
EEXIST
))
break
;
err
=
0
;
}
return
err
;
...
...
@@ -156,7 +166,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages)
res
.
flags
=
IORESOURCE_MEM
;
/* we just need system ram */
section_end
=
res
.
end
;
while
(
find_next_system_ram
(
&
res
)
>=
0
)
{
while
(
(
res
.
start
<
res
.
end
)
&&
(
find_next_system_ram
(
&
res
)
>=
0
)
)
{
start_pfn
=
(
unsigned
long
)(
res
.
start
>>
PAGE_SHIFT
);
nr_pages
=
(
unsigned
long
)
((
res
.
end
+
1
-
res
.
start
)
>>
PAGE_SHIFT
);
...
...
@@ -213,10 +223,9 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat)
}
/* add this memory to iomem resource */
static
void
register_memory_resource
(
u64
start
,
u64
size
)
static
struct
resource
*
register_memory_resource
(
u64
start
,
u64
size
)
{
struct
resource
*
res
;
res
=
kzalloc
(
sizeof
(
struct
resource
),
GFP_KERNEL
);
BUG_ON
(
!
res
);
...
...
@@ -228,7 +237,18 @@ static void register_memory_resource(u64 start, u64 size)
printk
(
"System RAM resource %llx - %llx cannot be added
\n
"
,
(
unsigned
long
long
)
res
->
start
,
(
unsigned
long
long
)
res
->
end
);
kfree
(
res
);
res
=
NULL
;
}
return
res
;
}
static
void
release_memory_resource
(
struct
resource
*
res
)
{
if
(
!
res
)
return
;
release_resource
(
res
);
kfree
(
res
);
return
;
}
...
...
@@ -237,8 +257,13 @@ int add_memory(int nid, u64 start, u64 size)
{
pg_data_t
*
pgdat
=
NULL
;
int
new_pgdat
=
0
;
struct
resource
*
res
;
int
ret
;
res
=
register_memory_resource
(
start
,
size
);
if
(
!
res
)
return
-
EEXIST
;
if
(
!
node_online
(
nid
))
{
pgdat
=
hotadd_new_pgdat
(
nid
,
start
);
if
(
!
pgdat
)
...
...
@@ -268,14 +293,13 @@ int add_memory(int nid, u64 start, u64 size)
BUG_ON
(
ret
);
}
/* register this memory as resource */
register_memory_resource
(
start
,
size
);
return
ret
;
error:
/* rollback pgdat allocation and others */
if
(
new_pgdat
)
rollback_node_hotadd
(
nid
,
pgdat
);
if
(
res
)
release_memory_resource
(
res
);
return
ret
;
}
...
...
This diff is collapsed.
Click to expand it.
net/bridge/br_netlink.c
浏览文件 @
242898be
...
...
@@ -85,7 +85,7 @@ void br_ifinfo_notify(int event, struct net_bridge_port *port)
goto
err_out
;
err
=
br_fill_ifinfo
(
skb
,
port
,
current
->
pid
,
0
,
event
,
0
);
if
(
err
)
if
(
err
<
0
)
goto
err_kfree
;
NETLINK_CB
(
skb
).
dst_group
=
RTNLGRP_LINK
;
...
...
This diff is collapsed.
Click to expand it.
net/ipv4/tcp_input.c
浏览文件 @
242898be
...
...
@@ -3541,7 +3541,8 @@ void tcp_cwnd_application_limited(struct sock *sk)
if
(
inet_csk
(
sk
)
->
icsk_ca_state
==
TCP_CA_Open
&&
sk
->
sk_socket
&&
!
test_bit
(
SOCK_NOSPACE
,
&
sk
->
sk_socket
->
flags
))
{
/* Limited by application or receiver window. */
u32
win_used
=
max
(
tp
->
snd_cwnd_used
,
2U
);
u32
init_win
=
tcp_init_cwnd
(
tp
,
__sk_dst_get
(
sk
));
u32
win_used
=
max
(
tp
->
snd_cwnd_used
,
init_win
);
if
(
win_used
<
tp
->
snd_cwnd
)
{
tp
->
snd_ssthresh
=
tcp_current_ssthresh
(
sk
);
tp
->
snd_cwnd
=
(
tp
->
snd_cwnd
+
win_used
)
>>
1
;
...
...
This diff is collapsed.
Click to expand it.
net/lapb/lapb_iface.c
浏览文件 @
242898be
...
...
@@ -238,11 +238,13 @@ int lapb_setparms(struct net_device *dev, struct lapb_parms_struct *parms)
goto
out_put
;
if
(
lapb
->
state
==
LAPB_STATE_0
)
{
if
(((
parms
->
mode
&
LAPB_EXTENDED
)
&&
(
parms
->
window
<
1
||
parms
->
window
>
127
))
||
(
parms
->
window
<
1
||
parms
->
window
>
7
))
goto
out_put
;
if
(
parms
->
mode
&
LAPB_EXTENDED
)
{
if
(
parms
->
window
<
1
||
parms
->
window
>
127
)
goto
out_put
;
}
else
{
if
(
parms
->
window
<
1
||
parms
->
window
>
7
)
goto
out_put
;
}
lapb
->
mode
=
parms
->
mode
;
lapb
->
window
=
parms
->
window
;
}
...
...
This diff is collapsed.
Click to expand it.
net/llc/af_llc.c
浏览文件 @
242898be
...
...
@@ -784,24 +784,20 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock,
copied
+=
used
;
len
-=
used
;
if
(
used
+
offset
<
skb
->
len
)
continue
;
if
(
!
(
flags
&
MSG_PEEK
))
{
sk_eat_skb
(
sk
,
skb
,
0
);
*
seq
=
0
;
}
/* For non stream protcols we get one packet per recvmsg call */
if
(
sk
->
sk_type
!=
SOCK_STREAM
)
goto
copy_uaddr
;
/* Partial read */
if
(
used
+
offset
<
skb
->
len
)
continue
;
}
while
(
len
>
0
);
/*
* According to UNIX98, msg_name/msg_namelen are ignored
* on connected socket. -ANK
* But... af_llc still doesn't have separate sets of methods for
* SOCK_DGRAM and SOCK_STREAM :-( So we have to do this test, will
* eventually fix this tho :-) -acme
*/
if
(
sk
->
sk_type
==
SOCK_DGRAM
)
goto
copy_uaddr
;
out:
release_sock
(
sk
);
return
copied
;
...
...
This diff is collapsed.
Click to expand it.
net/llc/llc_sap.c
浏览文件 @
242898be
...
...
@@ -51,10 +51,10 @@ void llc_save_primitive(struct sock *sk, struct sk_buff* skb, u8 prim)
{
struct
sockaddr_llc
*
addr
;
if
(
skb
->
sk
->
sk_type
==
SOCK_STREAM
)
/* See UNIX98 */
return
;
/* save primitive for use by the user. */
addr
=
llc_ui_skb_cb
(
skb
);
memset
(
addr
,
0
,
sizeof
(
*
addr
));
addr
->
sllc_family
=
sk
->
sk_family
;
addr
->
sllc_arphrd
=
skb
->
dev
->
type
;
addr
->
sllc_test
=
prim
==
LLC_TEST_PRIM
;
...
...
This diff is collapsed.
Click to expand it.
net/sched/sch_api.c
浏览文件 @
242898be
...
...
@@ -430,7 +430,7 @@ qdisc_create(struct net_device *dev, u32 handle, struct rtattr **tca, int *errp)
}
#endif
err
=
-
E
INVAL
;
err
=
-
E
NOENT
;
if
(
ops
==
NULL
)
goto
err_out
;
...
...
This diff is collapsed.
Click to expand it.
net/sunrpc/cache.c
浏览文件 @
242898be
...
...
@@ -71,7 +71,12 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
new
=
detail
->
alloc
();
if
(
!
new
)
return
NULL
;
/* must fully initialise 'new', else
* we might get lose if we need to
* cache_put it soon.
*/
cache_init
(
new
);
detail
->
init
(
new
,
key
);
write_lock
(
&
detail
->
hash_lock
);
...
...
@@ -85,7 +90,6 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
return
tmp
;
}
}
detail
->
init
(
new
,
key
);
new
->
next
=
*
head
;
*
head
=
new
;
detail
->
entries
++
;
...
...
This diff is collapsed.
Click to expand it.
net/sunrpc/clnt.c
浏览文件 @
242898be
...
...
@@ -921,26 +921,43 @@ call_transmit(struct rpc_task *task)
task
->
tk_status
=
xprt_prepare_transmit
(
task
);
if
(
task
->
tk_status
!=
0
)
return
;
task
->
tk_action
=
call_transmit_status
;
/* Encode here so that rpcsec_gss can use correct sequence number. */
if
(
rpc_task_need_encode
(
task
))
{
task
->
tk_rqstp
->
rq_bytes_sent
=
0
;
BUG_ON
(
task
->
tk_rqstp
->
rq_bytes_sent
!=
0
)
;
call_encode
(
task
);
/* Did the encode result in an error condition? */
if
(
task
->
tk_status
!=
0
)
goto
out_nosend
;
return
;
}
task
->
tk_action
=
call_transmit_status
;
xprt_transmit
(
task
);
if
(
task
->
tk_status
<
0
)
return
;
if
(
!
task
->
tk_msg
.
rpc_proc
->
p_decode
)
{
task
->
tk_action
=
rpc_exit_task
;
rpc_wake_up_task
(
task
);
}
return
;
out_nosend:
/* release socket write lock before attempting to handle error */
xprt_abort_transmit
(
task
);
/*
* On success, ensure that we call xprt_end_transmit() before sleeping
* in order to allow access to the socket to other RPC requests.
*/
call_transmit_status
(
task
);
if
(
task
->
tk_msg
.
rpc_proc
->
p_decode
!=
NULL
)
return
;
task
->
tk_action
=
rpc_exit_task
;
rpc_wake_up_task
(
task
);
}
/*
* 5a. Handle cleanup after a transmission
*/
static
void
call_transmit_status
(
struct
rpc_task
*
task
)
{
task
->
tk_action
=
call_status
;
/*
* Special case: if we've been waiting on the socket's write_space()
* callback, then don't call xprt_end_transmit().
*/
if
(
task
->
tk_status
==
-
EAGAIN
)
return
;
xprt_end_transmit
(
task
);
rpc_task_force_reencode
(
task
);
}
...
...
@@ -992,18 +1009,7 @@ call_status(struct rpc_task *task)
}
/*
* 6a. Handle transmission errors.
*/
static
void
call_transmit_status
(
struct
rpc_task
*
task
)
{
if
(
task
->
tk_status
!=
-
EAGAIN
)
rpc_task_force_reencode
(
task
);
call_status
(
task
);
}
/*
* 6b. Handle RPC timeout
* 6a. Handle RPC timeout
* We do not release the request slot, so we keep using the
* same XID for all retransmits.
*/
...
...
This diff is collapsed.
Click to expand it.
net/sunrpc/rpc_pipe.c
浏览文件 @
242898be
...
...
@@ -667,10 +667,11 @@ rpc_mkdir(char *path, struct rpc_clnt *rpc_client)
RPCAUTH_info
,
RPCAUTH_EOF
);
if
(
error
)
goto
err_depopulate
;
dget
(
dentry
);
out:
mutex_unlock
(
&
dir
->
i_mutex
);
rpc_release_path
(
&
nd
);
return
d
get
(
dentry
)
;
return
d
entry
;
err_depopulate:
rpc_depopulate
(
dentry
);
__rpc_rmdir
(
dir
,
dentry
);
...
...
@@ -731,10 +732,11 @@ rpc_mkpipe(char *path, void *private, struct rpc_pipe_ops *ops, int flags)
rpci
->
flags
=
flags
;
rpci
->
ops
=
ops
;
inode_dir_notify
(
dir
,
DN_CREATE
);
dget
(
dentry
);
out:
mutex_unlock
(
&
dir
->
i_mutex
);
rpc_release_path
(
&
nd
);
return
d
get
(
dentry
)
;
return
d
entry
;
err_dput:
dput
(
dentry
);
dentry
=
ERR_PTR
(
-
ENOMEM
);
...
...
This diff is collapsed.
Click to expand it.
net/sunrpc/xprt.c
浏览文件 @
242898be
...
...
@@ -707,12 +707,9 @@ int xprt_prepare_transmit(struct rpc_task *task)
return
err
;
}
void
xprt_abort_transmit
(
struct
rpc_task
*
task
)
void
xprt_end_transmit
(
struct
rpc_task
*
task
)
{
struct
rpc_xprt
*
xprt
=
task
->
tk_xprt
;
xprt_release_write
(
xprt
,
task
);
xprt_release_write
(
task
->
tk_xprt
,
task
);
}
/**
...
...
@@ -761,8 +758,6 @@ void xprt_transmit(struct rpc_task *task)
task
->
tk_status
=
-
ENOTCONN
;
else
if
(
!
req
->
rq_received
)
rpc_sleep_on
(
&
xprt
->
pending
,
task
,
NULL
,
xprt_timer
);
xprt
->
ops
->
release_xprt
(
xprt
,
task
);
spin_unlock_bh
(
&
xprt
->
transport_lock
);
return
;
}
...
...
@@ -772,18 +767,8 @@ void xprt_transmit(struct rpc_task *task)
* schedq, and being picked up by a parallel run of rpciod().
*/
task
->
tk_status
=
status
;
switch
(
status
)
{
case
-
ECONNREFUSED
:
if
(
status
==
-
ECONNREFUSED
)
rpc_sleep_on
(
&
xprt
->
sending
,
task
,
NULL
,
NULL
);
case
-
EAGAIN
:
case
-
ENOTCONN
:
return
;
default:
break
;
}
xprt_release_write
(
xprt
,
task
);
return
;
}
static
inline
void
do_xprt_reserve
(
struct
rpc_task
*
task
)
...
...
This diff is collapsed.
Click to expand it.
net/sunrpc/xprtsock.c
浏览文件 @
242898be
...
...
@@ -413,6 +413,33 @@ static int xs_tcp_send_request(struct rpc_task *task)
return
status
;
}
/**
* xs_tcp_release_xprt - clean up after a tcp transmission
* @xprt: transport
* @task: rpc task
*
* This cleans up if an error causes us to abort the transmission of a request.
* In this case, the socket may need to be reset in order to avoid confusing
* the server.
*/
static
void
xs_tcp_release_xprt
(
struct
rpc_xprt
*
xprt
,
struct
rpc_task
*
task
)
{
struct
rpc_rqst
*
req
;
if
(
task
!=
xprt
->
snd_task
)
return
;
if
(
task
==
NULL
)
goto
out_release
;
req
=
task
->
tk_rqstp
;
if
(
req
->
rq_bytes_sent
==
0
)
goto
out_release
;
if
(
req
->
rq_bytes_sent
==
req
->
rq_snd_buf
.
len
)
goto
out_release
;
set_bit
(
XPRT_CLOSE_WAIT
,
&
task
->
tk_xprt
->
state
);
out_release:
xprt_release_xprt
(
xprt
,
task
);
}
/**
* xs_close - close a socket
* @xprt: transport
...
...
@@ -1250,7 +1277,7 @@ static struct rpc_xprt_ops xs_udp_ops = {
static
struct
rpc_xprt_ops
xs_tcp_ops
=
{
.
reserve_xprt
=
xprt_reserve_xprt
,
.
release_xprt
=
x
prt
_release_xprt
,
.
release_xprt
=
x
s_tcp
_release_xprt
,
.
set_port
=
xs_set_port
,
.
connect
=
xs_connect
,
.
buf_alloc
=
rpc_malloc
,
...
...
This diff is collapsed.
Click to expand it.
sound/aoa/codecs/snd-aoa-codec-toonie.c
浏览文件 @
242898be
...
...
@@ -51,6 +51,13 @@ static struct transfer_info toonie_transfers[] = {
{}
};
static
int
toonie_usable
(
struct
codec_info_item
*
cii
,
struct
transfer_info
*
ti
,
struct
transfer_info
*
out
)
{
return
1
;
}
#ifdef CONFIG_PM
static
int
toonie_suspend
(
struct
codec_info_item
*
cii
,
pm_message_t
state
)
{
...
...
@@ -69,6 +76,7 @@ static struct codec_info toonie_codec_info = {
.
sysclock_factor
=
256
,
.
bus_factor
=
64
,
.
owner
=
THIS_MODULE
,
.
usable
=
toonie_usable
,
#ifdef CONFIG_PM
.
suspend
=
toonie_suspend
,
.
resume
=
toonie_resume
,
...
...
@@ -79,19 +87,20 @@ static int toonie_init_codec(struct aoa_codec *codec)
{
struct
toonie
*
toonie
=
codec_to_toonie
(
codec
);
/* nothing connected? what a joke! */
if
(
toonie
->
codec
.
connected
!=
1
)
return
-
ENOTCONN
;
if
(
aoa_snd_device_new
(
SNDRV_DEV_LOWLEVEL
,
toonie
,
&
ops
))
{
printk
(
KERN_ERR
PFX
"failed to create toonie snd device!
\n
"
);
return
-
ENODEV
;
}
/* nothing connected? what a joke! */
if
(
toonie
->
codec
.
connected
!=
1
)
return
-
ENOTCONN
;
if
(
toonie
->
codec
.
soundbus_dev
->
attach_codec
(
toonie
->
codec
.
soundbus_dev
,
aoa_get_card
(),
&
toonie_codec_info
,
toonie
))
{
printk
(
KERN_ERR
PFX
"error creating toonie pcm
\n
"
);
snd_device_free
(
aoa_get_card
(),
toonie
);
return
-
ENODEV
;
}
...
...
This diff is collapsed.
Click to expand it.
sound/aoa/core/snd-aoa-gpio-feature.c
浏览文件 @
242898be
...
...
@@ -112,7 +112,10 @@ static struct device_node *get_gpio(char *name,
static
void
get_irq
(
struct
device_node
*
np
,
int
*
irqptr
)
{
*
irqptr
=
irq_of_parse_and_map
(
np
,
0
);
if
(
np
)
*
irqptr
=
irq_of_parse_and_map
(
np
,
0
);
else
*
irqptr
=
NO_IRQ
;
}
/* 0x4 is outenable, 0x1 is out, thus 4 or 5 */
...
...
@@ -322,7 +325,7 @@ static int ftr_set_notify(struct gpio_runtime *rt,
return
-
EINVAL
;
}
if
(
irq
==
-
1
)
if
(
irq
==
NO_IRQ
)
return
-
ENODEV
;
mutex_lock
(
&
notif
->
mutex
);
...
...
This diff is collapsed.
Click to expand it.
sound/aoa/core/snd-aoa-gpio-pmf.c
浏览文件 @
242898be
...
...
@@ -18,7 +18,7 @@ static void pmf_gpio_set_##name(struct gpio_runtime *rt, int on)\
\
if (unlikely(!rt)) return; \
rc = pmf_call_function(rt->node, #name "-mute", &args); \
if (rc
)
\
if (rc
&& rc != -ENODEV)
\
printk(KERN_WARNING "pmf_gpio_set_" #name \
" failed, rc: %d\n", rc); \
rt->implementation_private &= ~(1<<bit); \
...
...
This diff is collapsed.
Click to expand it.
sound/core/oss/mixer_oss.c
浏览文件 @
242898be
...
...
@@ -988,13 +988,12 @@ static int snd_mixer_oss_build_input(struct snd_mixer_oss *mixer, struct snd_mix
if
(
ptr
->
index
==
0
&&
(
kctl
=
snd_mixer_oss_test_id
(
mixer
,
"Capture Source"
,
0
))
!=
NULL
)
{
struct
snd_ctl_elem_info
*
uinfo
;
uinfo
=
k
m
alloc
(
sizeof
(
*
uinfo
),
GFP_KERNEL
);
uinfo
=
k
z
alloc
(
sizeof
(
*
uinfo
),
GFP_KERNEL
);
if
(
!
uinfo
)
{
up_read
(
&
mixer
->
card
->
controls_rwsem
);
return
-
ENOMEM
;
}
memset
(
uinfo
,
0
,
sizeof
(
*
uinfo
));
if
(
kctl
->
info
(
kctl
,
uinfo
))
{
up_read
(
&
mixer
->
card
->
controls_rwsem
);
return
0
;
...
...
This diff is collapsed.
Click to expand it.
sound/core/oss/pcm_oss.c
浏览文件 @
242898be
...
...
@@ -2228,6 +2228,8 @@ static int snd_pcm_oss_open_file(struct file *file,
for
(
idx
=
0
;
idx
<
2
;
idx
++
)
{
if
(
setup
[
idx
].
disable
)
continue
;
if
(
!
pcm
->
streams
[
idx
].
substream_count
)
continue
;
/* no matching substream */
if
(
idx
==
SNDRV_PCM_STREAM_PLAYBACK
)
{
if
(
!
(
f_mode
&
FMODE_WRITE
))
continue
;
...
...
This diff is collapsed.
Click to expand it.
sound/core/seq/seq_device.c
浏览文件 @
242898be
...
...
@@ -372,10 +372,9 @@ static struct ops_list * create_driver(char *id)
{
struct
ops_list
*
ops
;
ops
=
k
m
alloc
(
sizeof
(
*
ops
),
GFP_KERNEL
);
ops
=
k
z
alloc
(
sizeof
(
*
ops
),
GFP_KERNEL
);
if
(
ops
==
NULL
)
return
ops
;
memset
(
ops
,
0
,
sizeof
(
*
ops
));
/* set up driver entry */
strlcpy
(
ops
->
id
,
id
,
sizeof
(
ops
->
id
));
...
...
This diff is collapsed.
Click to expand it.
sound/core/sgbuf.c
浏览文件 @
242898be
...
...
@@ -68,21 +68,18 @@ void *snd_malloc_sgbuf_pages(struct device *device,
dmab
->
area
=
NULL
;
dmab
->
addr
=
0
;
dmab
->
private_data
=
sgbuf
=
k
m
alloc
(
sizeof
(
*
sgbuf
),
GFP_KERNEL
);
dmab
->
private_data
=
sgbuf
=
k
z
alloc
(
sizeof
(
*
sgbuf
),
GFP_KERNEL
);
if
(
!
sgbuf
)
return
NULL
;
memset
(
sgbuf
,
0
,
sizeof
(
*
sgbuf
));
sgbuf
->
dev
=
device
;
pages
=
snd_sgbuf_aligned_pages
(
size
);
sgbuf
->
tblsize
=
sgbuf_align_table
(
pages
);
sgbuf
->
table
=
k
malloc
(
sizeof
(
*
sgbuf
->
table
)
*
sgbuf
->
tblsize
,
GFP_KERNEL
);
sgbuf
->
table
=
k
calloc
(
sgbuf
->
tblsize
,
sizeof
(
*
sgbuf
->
table
)
,
GFP_KERNEL
);
if
(
!
sgbuf
->
table
)
goto
_failed
;
memset
(
sgbuf
->
table
,
0
,
sizeof
(
*
sgbuf
->
table
)
*
sgbuf
->
tblsize
);
sgbuf
->
page_table
=
kmalloc
(
sizeof
(
*
sgbuf
->
page_table
)
*
sgbuf
->
tblsize
,
GFP_KERNEL
);
sgbuf
->
page_table
=
kcalloc
(
sgbuf
->
tblsize
,
sizeof
(
*
sgbuf
->
page_table
),
GFP_KERNEL
);
if
(
!
sgbuf
->
page_table
)
goto
_failed
;
memset
(
sgbuf
->
page_table
,
0
,
sizeof
(
*
sgbuf
->
page_table
)
*
sgbuf
->
tblsize
);
/* allocate each page */
for
(
i
=
0
;
i
<
pages
;
i
++
)
{
...
...
This diff is collapsed.
Click to expand it.
sound/drivers/vx/vx_pcm.c
浏览文件 @
242898be
...
...
@@ -1252,18 +1252,15 @@ static int vx_init_audio_io(struct vx_core *chip)
chip
->
audio_info
=
rmh
.
Stat
[
1
];
/* allocate pipes */
chip
->
playback_pipes
=
k
malloc
(
sizeof
(
struct
vx_pipe
*
)
*
chip
->
audio_outs
,
GFP_KERNEL
);
chip
->
playback_pipes
=
k
calloc
(
chip
->
audio_outs
,
sizeof
(
struct
vx_pipe
*
)
,
GFP_KERNEL
);
if
(
!
chip
->
playback_pipes
)
return
-
ENOMEM
;
chip
->
capture_pipes
=
k
malloc
(
sizeof
(
struct
vx_pipe
*
)
*
chip
->
audio_ins
,
GFP_KERNEL
);
chip
->
capture_pipes
=
k
calloc
(
chip
->
audio_ins
,
sizeof
(
struct
vx_pipe
*
)
,
GFP_KERNEL
);
if
(
!
chip
->
capture_pipes
)
{
kfree
(
chip
->
playback_pipes
);
return
-
ENOMEM
;
}
memset
(
chip
->
playback_pipes
,
0
,
sizeof
(
struct
vx_pipe
*
)
*
chip
->
audio_outs
);
memset
(
chip
->
capture_pipes
,
0
,
sizeof
(
struct
vx_pipe
*
)
*
chip
->
audio_ins
);
preferred
=
chip
->
ibl
.
size
;
chip
->
ibl
.
size
=
0
;
vx_set_ibl
(
chip
,
&
chip
->
ibl
);
/* query the info */
...
...
This diff is collapsed.
Click to expand it.
sound/pci/echoaudio/echoaudio.c
浏览文件 @
242898be
...
...
@@ -236,9 +236,9 @@ static int pcm_open(struct snd_pcm_substream *substream,
chip
=
snd_pcm_substream_chip
(
substream
);
runtime
=
substream
->
runtime
;
if
(
!
(
pipe
=
kmalloc
(
sizeof
(
struct
audiopipe
),
GFP_KERNEL
)))
pipe
=
kzalloc
(
sizeof
(
struct
audiopipe
),
GFP_KERNEL
);
if
(
!
pipe
)
return
-
ENOMEM
;
memset
(
pipe
,
0
,
sizeof
(
struct
audiopipe
));
pipe
->
index
=
-
1
;
/* Not configured yet */
/* Set up hw capabilities and contraints */
...
...
This diff is collapsed.
Click to expand it.
sound/pci/emu10k1/emu10k1_main.c
浏览文件 @
242898be
...
...
@@ -936,6 +936,17 @@ static struct snd_emu_chip_details emu_chip_details[] = {
.
ca0151_chip
=
1
,
.
spk71
=
1
,
.
spdif_bug
=
1
}
,
/* Dell OEM/Creative Labs Audigy 2 ZS */
/* See ALSA bug#1365 */
{.
vendor
=
0x1102
,
.
device
=
0x0004
,
.
subsystem
=
0x10031102
,
.
driver
=
"Audigy2"
,
.
name
=
"Audigy 2 ZS [SB0353]"
,
.
id
=
"Audigy2"
,
.
emu10k2_chip
=
1
,
.
ca0102_chip
=
1
,
.
ca0151_chip
=
1
,
.
spk71
=
1
,
.
spdif_bug
=
1
,
.
ac97_chip
=
1
}
,
{.
vendor
=
0x1102
,
.
device
=
0x0004
,
.
subsystem
=
0x10021102
,
.
driver
=
"Audigy2"
,
.
name
=
"Audigy 2 Platinum [SB0240P]"
,
.
id
=
"Audigy2"
,
...
...
This diff is collapsed.
Click to expand it.
sound/pci/emu10k1/irq.c
浏览文件 @
242898be
...
...
@@ -37,9 +37,13 @@ irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id, struct pt_regs *regs)
int
handled
=
0
;
while
((
status
=
inl
(
emu
->
port
+
IPR
))
!=
0
)
{
//
printk(
"emu10k1 irq - status = 0x%x\n", status);
//
snd_printk(KERN_INFO
"emu10k1 irq - status = 0x%x\n", status);
orig_status
=
status
;
handled
=
1
;
if
((
status
&
0xffffffff
)
==
0xffffffff
)
{
snd_printk
(
KERN_INFO
"snd-emu10k1: Suspected sound card removal
\n
"
);
break
;
}
if
(
status
&
IPR_PCIERROR
)
{
snd_printk
(
KERN_ERR
"interrupt: PCI error
\n
"
);
snd_emu10k1_intr_disable
(
emu
,
INTE_PCIERRORENABLE
);
...
...
This diff is collapsed.
Click to expand it.
sound/ppc/awacs.c
浏览文件 @
242898be
...
...
@@ -801,11 +801,10 @@ snd_pmac_awacs_init(struct snd_pmac *chip)
chip
->
revision
=
(
in_le32
(
&
chip
->
awacs
->
codec_stat
)
>>
12
)
&
0xf
;
#ifdef PMAC_AMP_AVAIL
if
(
chip
->
revision
==
3
&&
chip
->
has_iic
&&
CHECK_CUDA_AMP
())
{
struct
awacs_amp
*
amp
=
k
m
alloc
(
sizeof
(
*
amp
),
GFP_KERNEL
);
struct
awacs_amp
*
amp
=
k
z
alloc
(
sizeof
(
*
amp
),
GFP_KERNEL
);
if
(
!
amp
)
return
-
ENOMEM
;
chip
->
mixer_data
=
amp
;
memset
(
amp
,
0
,
sizeof
(
*
amp
));
chip
->
mixer_free
=
awacs_amp_free
;
awacs_amp_set_vol
(
amp
,
0
,
63
,
63
,
0
);
/* mute and zero vol */
awacs_amp_set_vol
(
amp
,
1
,
63
,
63
,
0
);
...
...
This diff is collapsed.
Click to expand it.
sound/ppc/daca.c
浏览文件 @
242898be
...
...
@@ -258,10 +258,9 @@ int __init snd_pmac_daca_init(struct snd_pmac *chip)
request_module
(
"i2c-powermac"
);
#endif
/* CONFIG_KMOD */
mix
=
k
m
alloc
(
sizeof
(
*
mix
),
GFP_KERNEL
);
mix
=
k
z
alloc
(
sizeof
(
*
mix
),
GFP_KERNEL
);
if
(
!
mix
)
return
-
ENOMEM
;
memset
(
mix
,
0
,
sizeof
(
*
mix
));
chip
->
mixer_data
=
mix
;
chip
->
mixer_free
=
daca_cleanup
;
mix
->
amp_on
=
1
;
/* default on */
...
...
This diff is collapsed.
Click to expand it.
sound/ppc/keywest.c
浏览文件 @
242898be
...
...
@@ -64,11 +64,10 @@ static int keywest_attach_adapter(struct i2c_adapter *adapter)
if
(
strncmp
(
i2c_device_name
(
adapter
),
"mac-io"
,
6
))
return
0
;
/* ignored */
new_client
=
k
m
alloc
(
sizeof
(
struct
i2c_client
),
GFP_KERNEL
);
new_client
=
k
z
alloc
(
sizeof
(
struct
i2c_client
),
GFP_KERNEL
);
if
(
!
new_client
)
return
-
ENOMEM
;
memset
(
new_client
,
0
,
sizeof
(
*
new_client
));
new_client
->
addr
=
keywest_ctx
->
addr
;
i2c_set_clientdata
(
new_client
,
keywest_ctx
);
new_client
->
adapter
=
adapter
;
...
...
This diff is collapsed.
Click to expand it.
sound/ppc/powermac.c
浏览文件 @
242898be
...
...
@@ -181,21 +181,14 @@ static int __init alsa_card_pmac_init(void)
if
((
err
=
platform_driver_register
(
&
snd_pmac_driver
))
<
0
)
return
err
;
device
=
platform_device_register_simple
(
SND_PMAC_DRIVER
,
-
1
,
NULL
,
0
);
if
(
!
IS_ERR
(
device
))
{
if
(
platform_get_drvdata
(
device
))
return
0
;
platform_device_unregister
(
device
);
err
=
-
ENODEV
;
}
else
err
=
PTR_ERR
(
device
);
platform_driver_unregister
(
&
snd_pmac_driver
);
return
err
;
return
0
;
}
static
void
__exit
alsa_card_pmac_exit
(
void
)
{
platform_device_unregister
(
device
);
if
(
!
IS_ERR
(
device
))
platform_device_unregister
(
device
);
platform_driver_unregister
(
&
snd_pmac_driver
);
}
...
...
This diff is collapsed.
Click to expand it.
sound/ppc/tumbler.c
浏览文件 @
242898be
...
...
@@ -1316,10 +1316,9 @@ int __init snd_pmac_tumbler_init(struct snd_pmac *chip)
request_module
(
"i2c-powermac"
);
#endif
/* CONFIG_KMOD */
mix
=
k
m
alloc
(
sizeof
(
*
mix
),
GFP_KERNEL
);
mix
=
k
z
alloc
(
sizeof
(
*
mix
),
GFP_KERNEL
);
if
(
!
mix
)
return
-
ENOMEM
;
memset
(
mix
,
0
,
sizeof
(
*
mix
));
mix
->
headphone_irq
=
-
1
;
chip
->
mixer_data
=
mix
;
...
...
This diff is collapsed.
Click to expand it.
sound/usb/usbaudio.c
浏览文件 @
242898be
...
...
@@ -2260,10 +2260,9 @@ static int add_audio_endpoint(struct snd_usb_audio *chip, int stream, struct aud
}
/* create a new pcm */
as
=
k
m
alloc
(
sizeof
(
*
as
),
GFP_KERNEL
);
as
=
k
z
alloc
(
sizeof
(
*
as
),
GFP_KERNEL
);
if
(
!
as
)
return
-
ENOMEM
;
memset
(
as
,
0
,
sizeof
(
*
as
));
as
->
pcm_index
=
chip
->
pcm_devs
;
as
->
chip
=
chip
;
as
->
fmt_type
=
fp
->
fmt_type
;
...
...
@@ -2633,13 +2632,12 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
csep
=
NULL
;
}
fp
=
k
m
alloc
(
sizeof
(
*
fp
),
GFP_KERNEL
);
fp
=
k
z
alloc
(
sizeof
(
*
fp
),
GFP_KERNEL
);
if
(
!
fp
)
{
snd_printk
(
KERN_ERR
"cannot malloc
\n
"
);
return
-
ENOMEM
;
}
memset
(
fp
,
0
,
sizeof
(
*
fp
));
fp
->
iface
=
iface_no
;
fp
->
altsetting
=
altno
;
fp
->
altset_idx
=
i
;
...
...
This diff is collapsed.
Click to expand it.
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录
反馈
建议
客服
返回
顶部