mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-13 20:33:15 +00:00
Merge branch 'akpm' (Andrew's patch-bomb)
Merge Andrew's first set of patches: "Non-MM patches: - lots of misc bits - tree-wide have_clk() cleanups - quite a lot of printk tweaks. I draw your attention to "printk: convert the format for KERN_<LEVEL> to a 2 byte pattern" which looks a bit scary. But afaict it's solid. - backlight updates - lib/ feature work (notably the addition and use of memweight()) - checkpatch updates - rtc updates - nilfs updates - fatfs updates (partial, still waiting for acks) - kdump, proc, fork, IPC, sysctl, taskstats, pps, etc - new fault-injection feature work" * Merge emailed patches from Andrew Morton <akpm@linux-foundation.org>: (128 commits) drivers/misc/lkdtm.c: fix missing allocation failure check lib/scatterlist: do not re-write gfp_flags in __sg_alloc_table() fault-injection: add tool to run command with failslab or fail_page_alloc fault-injection: add selftests for cpu and memory hotplug powerpc: pSeries reconfig notifier error injection module memory: memory notifier error injection module PM: PM notifier error injection module cpu: rewrite cpu-notifier-error-inject module fault-injection: notifier error injection c/r: fcntl: add F_GETOWNER_UIDS option resource: make sure requested range is included in the root range include/linux/aio.h: cpp->C conversions fs: cachefiles: add support for large files in filesystem caching pps: return PTR_ERR on error in device_create taskstats: check nla_reserve() return sysctl: suppress kmemleak messages ipc: use Kconfig options for __ARCH_WANT_[COMPAT_]IPC_PARSE_VERSION ipc: compat: use signed size_t types for msgsnd and msgrcv ipc: allow compat IPC version field parsing if !ARCH_WANT_OLD_COMPAT_IPC ipc: add COMPAT_SHMLBA support ...
This commit is contained in:
commit
27c1ee3f92
@ -240,3 +240,30 @@ trap "echo 0 > /sys/kernel/debug/$FAILTYPE/probability" SIGINT SIGTERM EXIT
|
||||
echo "Injecting errors into the module $module... (interrupt to stop)"
|
||||
sleep 1000000
|
||||
|
||||
Tool to run command with failslab or fail_page_alloc
|
||||
----------------------------------------------------
|
||||
In order to make it easier to accomplish the tasks mentioned above, we can use
|
||||
tools/testing/fault-injection/failcmd.sh. Please run a command
|
||||
"./tools/testing/fault-injection/failcmd.sh --help" for more information and
|
||||
see the following examples.
|
||||
|
||||
Examples:
|
||||
|
||||
Run a command "make -C tools/testing/selftests/ run_tests" with injecting slab
|
||||
allocation failure.
|
||||
|
||||
# ./tools/testing/fault-injection/failcmd.sh \
|
||||
-- make -C tools/testing/selftests/ run_tests
|
||||
|
||||
Same as above except to specify 100 times failures at most instead of one time
|
||||
at most by default.
|
||||
|
||||
# ./tools/testing/fault-injection/failcmd.sh --times=100 \
|
||||
-- make -C tools/testing/selftests/ run_tests
|
||||
|
||||
Same as above except to inject page allocation failure instead of slab
|
||||
allocation failure.
|
||||
|
||||
# env FAILCMD_TYPE=fail_page_alloc \
|
||||
./tools/testing/fault-injection/failcmd.sh --times=100 \
|
||||
-- make -C tools/testing/selftests/ run_tests
|
||||
|
99
Documentation/fault-injection/notifier-error-inject.txt
Normal file
99
Documentation/fault-injection/notifier-error-inject.txt
Normal file
@ -0,0 +1,99 @@
|
||||
Notifier error injection
|
||||
========================
|
||||
|
||||
Notifier error injection provides the ability to inject artifical errors to
|
||||
specified notifier chain callbacks. It is useful to test the error handling of
|
||||
notifier call chain failures which is rarely executed. There are kernel
|
||||
modules that can be used to test the following notifiers.
|
||||
|
||||
* CPU notifier
|
||||
* PM notifier
|
||||
* Memory hotplug notifier
|
||||
* powerpc pSeries reconfig notifier
|
||||
|
||||
CPU notifier error injection module
|
||||
-----------------------------------
|
||||
This feature can be used to test the error handling of the CPU notifiers by
|
||||
injecting artifical errors to CPU notifier chain callbacks.
|
||||
|
||||
If the notifier call chain should be failed with some events notified, write
|
||||
the error code to debugfs interface
|
||||
/sys/kernel/debug/notifier-error-inject/cpu/actions/<notifier event>/error
|
||||
|
||||
Possible CPU notifier events to be failed are:
|
||||
|
||||
* CPU_UP_PREPARE
|
||||
* CPU_UP_PREPARE_FROZEN
|
||||
* CPU_DOWN_PREPARE
|
||||
* CPU_DOWN_PREPARE_FROZEN
|
||||
|
||||
Example1: Inject CPU offline error (-1 == -EPERM)
|
||||
|
||||
# cd /sys/kernel/debug/notifier-error-inject/cpu
|
||||
# echo -1 > actions/CPU_DOWN_PREPARE/error
|
||||
# echo 0 > /sys/devices/system/cpu/cpu1/online
|
||||
bash: echo: write error: Operation not permitted
|
||||
|
||||
Example2: inject CPU online error (-2 == -ENOENT)
|
||||
|
||||
# echo -2 > actions/CPU_UP_PREPARE/error
|
||||
# echo 1 > /sys/devices/system/cpu/cpu1/online
|
||||
bash: echo: write error: No such file or directory
|
||||
|
||||
PM notifier error injection module
|
||||
----------------------------------
|
||||
This feature is controlled through debugfs interface
|
||||
/sys/kernel/debug/notifier-error-inject/pm/actions/<notifier event>/error
|
||||
|
||||
Possible PM notifier events to be failed are:
|
||||
|
||||
* PM_HIBERNATION_PREPARE
|
||||
* PM_SUSPEND_PREPARE
|
||||
* PM_RESTORE_PREPARE
|
||||
|
||||
Example: Inject PM suspend error (-12 = -ENOMEM)
|
||||
|
||||
# cd /sys/kernel/debug/notifier-error-inject/pm/
|
||||
# echo -12 > actions/PM_SUSPEND_PREPARE/error
|
||||
# echo mem > /sys/power/state
|
||||
bash: echo: write error: Cannot allocate memory
|
||||
|
||||
Memory hotplug notifier error injection module
|
||||
----------------------------------------------
|
||||
This feature is controlled through debugfs interface
|
||||
/sys/kernel/debug/notifier-error-inject/memory/actions/<notifier event>/error
|
||||
|
||||
Possible memory notifier events to be failed are:
|
||||
|
||||
* MEM_GOING_ONLINE
|
||||
* MEM_GOING_OFFLINE
|
||||
|
||||
Example: Inject memory hotplug offline error (-12 == -ENOMEM)
|
||||
|
||||
# cd /sys/kernel/debug/notifier-error-inject/memory
|
||||
# echo -12 > actions/MEM_GOING_OFFLINE/error
|
||||
# echo offline > /sys/devices/system/memory/memoryXXX/state
|
||||
bash: echo: write error: Cannot allocate memory
|
||||
|
||||
powerpc pSeries reconfig notifier error injection module
|
||||
--------------------------------------------------------
|
||||
This feature is controlled through debugfs interface
|
||||
/sys/kernel/debug/notifier-error-inject/pSeries-reconfig/actions/<notifier event>/error
|
||||
|
||||
Possible pSeries reconfig notifier events to be failed are:
|
||||
|
||||
* PSERIES_RECONFIG_ADD
|
||||
* PSERIES_RECONFIG_REMOVE
|
||||
* PSERIES_DRCONF_MEM_ADD
|
||||
* PSERIES_DRCONF_MEM_REMOVE
|
||||
|
||||
For more usage examples
|
||||
-----------------------
|
||||
There are tools/testing/selftests using the notifier error injection features
|
||||
for CPU and memory notifiers.
|
||||
|
||||
* tools/testing/selftests/cpu-hotplug/on-off-test.sh
|
||||
* tools/testing/selftests/memory-hotplug/on-off-test.sh
|
||||
|
||||
These scripts first do simple online and offline tests and then do fault
|
||||
injection tests if notifier error injection module is available.
|
@ -53,9 +53,20 @@ Struct Resources:
|
||||
For printing struct resources. The 'R' and 'r' specifiers result in a
|
||||
printed resource with ('R') or without ('r') a decoded flags member.
|
||||
|
||||
Raw buffer as a hex string:
|
||||
%*ph 00 01 02 ... 3f
|
||||
%*phC 00:01:02: ... :3f
|
||||
%*phD 00-01-02- ... -3f
|
||||
%*phN 000102 ... 3f
|
||||
|
||||
For printing a small buffers (up to 64 bytes long) as a hex string with
|
||||
certain separator. For the larger buffers consider to use
|
||||
print_hex_dump().
|
||||
|
||||
MAC/FDDI addresses:
|
||||
|
||||
%pM 00:01:02:03:04:05
|
||||
%pMR 05:04:03:02:01:00
|
||||
%pMF 00-01-02-03-04-05
|
||||
%pm 000102030405
|
||||
|
||||
@ -67,6 +78,10 @@ MAC/FDDI addresses:
|
||||
the 'M' specifier to use dash ('-') separators instead of the default
|
||||
separator.
|
||||
|
||||
For Bluetooth addresses the 'R' specifier shall be used after the 'M'
|
||||
specifier to use reversed byte order suitable for visual interpretation
|
||||
of Bluetooth addresses which are in the little endian order.
|
||||
|
||||
IPv4 addresses:
|
||||
|
||||
%pI4 1.2.3.4
|
||||
|
@ -163,16 +163,22 @@ This value can be used to query and set the core dump mode for setuid
|
||||
or otherwise protected/tainted binaries. The modes are
|
||||
|
||||
0 - (default) - traditional behaviour. Any process which has changed
|
||||
privilege levels or is execute only will not be dumped
|
||||
privilege levels or is execute only will not be dumped.
|
||||
1 - (debug) - all processes dump core when possible. The core dump is
|
||||
owned by the current user and no security is applied. This is
|
||||
intended for system debugging situations only. Ptrace is unchecked.
|
||||
This is insecure as it allows regular users to examine the memory
|
||||
contents of privileged processes.
|
||||
2 - (suidsafe) - any binary which normally would not be dumped is dumped
|
||||
readable by root only. This allows the end user to remove
|
||||
such a dump but not access it directly. For security reasons
|
||||
core dumps in this mode will not overwrite one another or
|
||||
other files. This mode is appropriate when administrators are
|
||||
attempting to debug problems in a normal environment.
|
||||
anyway, but only if the "core_pattern" kernel sysctl is set to
|
||||
either a pipe handler or a fully qualified path. (For more details
|
||||
on this limitation, see CVE-2006-2451.) This mode is appropriate
|
||||
when administrators are attempting to debug problems in a normal
|
||||
environment, and either have a core dump pipe handler that knows
|
||||
to treat privileged core dumps with care, or specific directory
|
||||
defined for catching core dumps. If a core dump happens without
|
||||
a pipe handler or fully qualifid path, a message will be emitted
|
||||
to syslog warning about the lack of a correct setting.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
@ -2750,6 +2750,7 @@ M: Jingoo Han <jg1.han@samsung.com>
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/video/exynos/exynos_dp*
|
||||
F: include/video/exynos_dp*
|
||||
|
||||
EXYNOS MIPI DISPLAY DRIVERS
|
||||
M: Inki Dae <inki.dae@samsung.com>
|
||||
|
@ -248,7 +248,14 @@ config HAVE_CMPXCHG_LOCAL
|
||||
config HAVE_CMPXCHG_DOUBLE
|
||||
bool
|
||||
|
||||
config ARCH_WANT_IPC_PARSE_VERSION
|
||||
bool
|
||||
|
||||
config ARCH_WANT_COMPAT_IPC_PARSE_VERSION
|
||||
bool
|
||||
|
||||
config ARCH_WANT_OLD_COMPAT_IPC
|
||||
select ARCH_WANT_COMPAT_IPC_PARSE_VERSION
|
||||
bool
|
||||
|
||||
config HAVE_ARCH_SECCOMP_FILTER
|
||||
|
@ -14,6 +14,7 @@ config ALPHA
|
||||
select AUTO_IRQ_AFFINITY if SMP
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_CMOS_UPDATE
|
||||
|
@ -470,7 +470,6 @@
|
||||
|
||||
#define NR_SYSCALLS 504
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -933,18 +933,6 @@ void SMC37c669_display_device_info(
|
||||
*
|
||||
*--
|
||||
*/
|
||||
#if 0
|
||||
/* $INCLUDE_OPTIONS$ */
|
||||
#include "cp$inc:platform_io.h"
|
||||
/* $INCLUDE_OPTIONS_END$ */
|
||||
#include "cp$src:common.h"
|
||||
#include "cp$inc:prototypes.h"
|
||||
#include "cp$src:kernel_def.h"
|
||||
#include "cp$src:msg_def.h"
|
||||
#include "cp$src:smcc669_def.h"
|
||||
/* Platform-specific includes */
|
||||
#include "cp$src:platform.h"
|
||||
#endif
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
|
@ -11,6 +11,7 @@ config ARM
|
||||
select RTC_LIB
|
||||
select SYS_SUPPORTS_APM_EMULATION
|
||||
select GENERIC_ATOMIC64 if (CPU_V6 || !CPU_32v6K || !AEABI)
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select HAVE_OPROFILE if (HAVE_PERF_EVENTS)
|
||||
select HAVE_ARCH_JUMP_LABEL if !XIP_KERNEL
|
||||
select HAVE_ARCH_KGDB
|
||||
@ -38,6 +39,7 @@ config ARM
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IRQ_PROBE
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HARDIRQS_SW_RESEND
|
||||
select CPU_PM if (SUSPEND || CPU_IDLE)
|
||||
select GENERIC_PCI_IOMAP
|
||||
|
@ -446,7 +446,6 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
#define __ARCH_WANT_SYS_PAUSE
|
||||
|
@ -11,13 +11,14 @@
|
||||
*
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/kern_levels.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
.align
|
||||
|
||||
.Liosl_warning:
|
||||
.ascii "<4>insl/outsl not implemented, called from %08lX\0"
|
||||
.ascii KERN_WARNING "insl/outsl not implemented, called from %08lX\0"
|
||||
.align
|
||||
|
||||
/*
|
||||
|
@ -69,29 +69,6 @@ void netx_clcd_remove(struct clcd_fb *fb)
|
||||
fb->fb.screen_base, fb->fb.fix.smem_start);
|
||||
}
|
||||
|
||||
void clk_disable(struct clk *clk)
|
||||
{
|
||||
}
|
||||
|
||||
int clk_set_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int clk_enable(struct clk *clk)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct clk *clk_get(struct device *dev, const char *id)
|
||||
{
|
||||
return dev && strcmp(dev_name(dev), "fb") == 0 ? NULL : ERR_PTR(-ENOENT);
|
||||
}
|
||||
|
||||
void clk_put(struct clk *clk)
|
||||
{
|
||||
}
|
||||
|
||||
static AMBA_AHB_DEVICE(fb, "fb", 0, 0x00104000, { NETX_IRQ_LCD }, NULL);
|
||||
|
||||
int netx_fb_init(struct clcd_board *board, struct clcd_panel *panel)
|
||||
|
@ -16,6 +16,7 @@
|
||||
*/
|
||||
#include <asm/thread_info.h>
|
||||
#include <asm/vfpmacros.h>
|
||||
#include <linux/kern_levels.h>
|
||||
#include "../kernel/entry-header.S"
|
||||
|
||||
.macro DBGSTR, str
|
||||
@ -24,7 +25,7 @@
|
||||
add r0, pc, #4
|
||||
bl printk
|
||||
b 1f
|
||||
.asciz "<7>VFP: \str\n"
|
||||
.asciz KERN_DEBUG "VFP: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
#endif
|
||||
@ -37,7 +38,7 @@
|
||||
add r0, pc, #4
|
||||
bl printk
|
||||
b 1f
|
||||
.asciz "<7>VFP: \str\n"
|
||||
.asciz KERN_DEBUG "VFP: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
#endif
|
||||
@ -52,7 +53,7 @@
|
||||
add r0, pc, #4
|
||||
bl printk
|
||||
b 1f
|
||||
.asciz "<7>VFP: \str\n"
|
||||
.asciz KERN_DEBUG "VFP: \str\n"
|
||||
.balign 4
|
||||
1: ldmfd sp!, {r0-r3, ip, lr}
|
||||
#endif
|
||||
|
@ -12,6 +12,7 @@ config AVR32
|
||||
select HARDIRQS_SW_RESEND
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_HAVE_CUSTOM_GPIO_H
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
|
@ -97,7 +97,7 @@ static struct atmel_nand_data atstk1006_nand_data __initdata = {
|
||||
.enable_pin = GPIO_PIN_PB(29),
|
||||
.ecc_mode = NAND_ECC_SOFT,
|
||||
.parts = nand_partitions,
|
||||
.num_parts = ARRAY_SIZE(num_partitions),
|
||||
.num_parts = ARRAY_SIZE(nand_partitions),
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -318,7 +318,6 @@
|
||||
/* SMP stuff */
|
||||
#define __IGNORE_getcpu
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -61,10 +61,10 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs)
|
||||
const struct exception_table_entry *fixup;
|
||||
unsigned long address;
|
||||
unsigned long page;
|
||||
int writeaccess;
|
||||
long signr;
|
||||
int code;
|
||||
int fault;
|
||||
unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
||||
|
||||
if (notify_page_fault(regs, ecr))
|
||||
return;
|
||||
@ -86,6 +86,7 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs)
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
retry:
|
||||
down_read(&mm->mmap_sem);
|
||||
|
||||
vma = find_vma(mm, address);
|
||||
@ -104,7 +105,6 @@ asmlinkage void do_page_fault(unsigned long ecr, struct pt_regs *regs)
|
||||
*/
|
||||
good_area:
|
||||
code = SEGV_ACCERR;
|
||||
writeaccess = 0;
|
||||
|
||||
switch (ecr) {
|
||||
case ECR_PROTECTION_X:
|
||||
@ -121,7 +121,7 @@ good_area:
|
||||
case ECR_TLB_MISS_W:
|
||||
if (!(vma->vm_flags & VM_WRITE))
|
||||
goto bad_area;
|
||||
writeaccess = 1;
|
||||
flags |= FAULT_FLAG_WRITE;
|
||||
break;
|
||||
default:
|
||||
panic("Unhandled case %lu in do_page_fault!", ecr);
|
||||
@ -132,7 +132,11 @@ good_area:
|
||||
* sure we exit gracefully rather than endlessly redo the
|
||||
* fault.
|
||||
*/
|
||||
fault = handle_mm_fault(mm, vma, address, writeaccess ? FAULT_FLAG_WRITE : 0);
|
||||
fault = handle_mm_fault(mm, vma, address, flags);
|
||||
|
||||
if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
|
||||
return;
|
||||
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
@ -140,10 +144,23 @@ good_area:
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
}
|
||||
if (fault & VM_FAULT_MAJOR)
|
||||
tsk->maj_flt++;
|
||||
else
|
||||
tsk->min_flt++;
|
||||
|
||||
if (flags & FAULT_FLAG_ALLOW_RETRY) {
|
||||
if (fault & VM_FAULT_MAJOR)
|
||||
tsk->maj_flt++;
|
||||
else
|
||||
tsk->min_flt++;
|
||||
if (fault & VM_FAULT_RETRY) {
|
||||
flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
||||
|
||||
/*
|
||||
* No need to up_read(&mm->mmap_sem) as we would have
|
||||
* already released it in __lock_page_or_retry() in
|
||||
* mm/filemap.c.
|
||||
*/
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
up_read(&mm->mmap_sem);
|
||||
return;
|
||||
|
@ -33,6 +33,7 @@ config BLACKFIN
|
||||
select HAVE_PERF_EVENTS
|
||||
select ARCH_HAVE_CUSTOM_GPIO_H
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_ATOMIC64
|
||||
select GENERIC_IRQ_PROBE
|
||||
|
@ -434,7 +434,6 @@
|
||||
#define __IGNORE_getcpu
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -42,6 +42,7 @@ config CRIS
|
||||
select HAVE_IDE
|
||||
select GENERIC_ATOMIC64
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_IOMAP
|
||||
select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32
|
||||
|
@ -347,7 +347,6 @@
|
||||
|
||||
#include <arch/unistd.h>
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_OLD_STAT
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
@ -9,6 +9,7 @@ config FRV
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
select GENERIC_CPU_DEVICES
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
|
||||
config ZONE_DMA
|
||||
bool
|
||||
|
@ -349,7 +349,6 @@
|
||||
|
||||
#define NR_syscalls 338
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
/* #define __ARCH_WANT_OLD_READDIR */
|
||||
#define __ARCH_WANT_OLD_STAT
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
@ -10,10 +10,10 @@
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/kern_levels.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
|
||||
#define KERN_ERR "<3>"
|
||||
|
||||
.section .rodata
|
||||
kernel_thread_emsg:
|
||||
|
@ -3,6 +3,7 @@ config H8300
|
||||
default y
|
||||
select HAVE_IDE
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select GENERIC_IRQ_SHOW
|
||||
select GENERIC_CPU_DEVICES
|
||||
|
||||
|
@ -331,7 +331,6 @@
|
||||
|
||||
#define NR_syscalls 321
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_OLD_STAT
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
@ -7,6 +7,7 @@ config M32R
|
||||
select HAVE_KERNEL_GZIP
|
||||
select HAVE_KERNEL_BZIP2
|
||||
select HAVE_KERNEL_LZMA
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
|
@ -336,7 +336,6 @@
|
||||
|
||||
#define NR_syscalls 326
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -10,6 +10,7 @@ config M68K
|
||||
select GENERIC_STRNCPY_FROM_USER if MMU
|
||||
select GENERIC_STRNLEN_USER if MMU
|
||||
select FPU if MMU
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select ARCH_USES_GETTIMEOFFSET if MMU && !COLDFIRE
|
||||
|
||||
config RWSEM_GENERIC_SPINLOCK
|
||||
|
@ -357,7 +357,6 @@
|
||||
|
||||
#define NR_syscalls 347
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_OLD_STAT
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
@ -15,6 +15,7 @@ config MICROBLAZE
|
||||
select TRACING_SUPPORT
|
||||
select OF
|
||||
select OF_EARLY_FLATTREE
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select IRQ_DOMAIN
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_PROBE
|
||||
|
@ -400,7 +400,6 @@
|
||||
#ifdef __KERNEL__
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
/* #define __ARCH_WANT_OLD_READDIR */
|
||||
/* #define __ARCH_WANT_OLD_STAT */
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
@ -20,12 +20,14 @@ config MIPS
|
||||
select ARCH_BINFMT_ELF_RANDOMIZE_PIE
|
||||
select RTC_LIB if !MACH_LOONGSON
|
||||
select GENERIC_ATOMIC64 if !64BIT
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select HAVE_DMA_ATTRS
|
||||
select HAVE_DMA_API_DEBUG
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_IRQ_SHOW
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select IRQ_FORCED_THREADING
|
||||
select HAVE_MEMBLOCK
|
||||
select HAVE_MEMBLOCK_NODE_MAP
|
||||
|
@ -1034,7 +1034,6 @@
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#define __ARCH_OMIT_COMPAT_SYS_GETDENTS64
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -3,6 +3,7 @@ config MN10300
|
||||
select HAVE_OPROFILE
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HAVE_ARCH_TRACEHOOK
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_NMI_WATCHDOG if MN10300_WD_TIMER
|
||||
|
@ -358,7 +358,6 @@
|
||||
/*
|
||||
* specify the deprecated syscalls we want to support on this arch
|
||||
*/
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_OLD_STAT
|
||||
#define __ARCH_WANT_STAT64
|
||||
|
@ -115,11 +115,13 @@ config PPC
|
||||
select HAVE_OPROFILE
|
||||
select HAVE_SYSCALL_WRAPPERS if PPC64
|
||||
select GENERIC_ATOMIC64 if PPC32
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select HAVE_IRQ_WORK
|
||||
select HAVE_PERF_EVENTS
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select SPARSE_IRQ
|
||||
select IRQ_PER_CPU
|
||||
select IRQ_DOMAIN
|
||||
|
@ -389,7 +389,6 @@
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
|
@ -85,6 +85,7 @@ config S390
|
||||
select HAVE_ARCH_MUTEX_CPU_RELAX
|
||||
select HAVE_ARCH_JUMP_LABEL if !MARCH_G5
|
||||
select ARCH_SAVE_PAGE_KEYS if HIBERNATION
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select HAVE_MEMBLOCK
|
||||
select HAVE_MEMBLOCK_NODE_MAP
|
||||
select HAVE_CMPXCHG_LOCAL
|
||||
@ -117,6 +118,7 @@ config S390
|
||||
select ARCH_INLINE_WRITE_UNLOCK_BH
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQ
|
||||
select ARCH_INLINE_WRITE_UNLOCK_IRQRESTORE
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select GENERIC_TIME_VSYSCALL
|
||||
select GENERIC_CLOCKEVENTS
|
||||
|
@ -388,7 +388,6 @@
|
||||
#define __IGNORE_recvmmsg
|
||||
#define __IGNORE_sendmmsg
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
#define __ARCH_WANT_SYS_GETHOSTNAME
|
||||
|
@ -21,6 +21,7 @@ config SUPERH
|
||||
select HAVE_KERNEL_LZMA
|
||||
select HAVE_KERNEL_XZ
|
||||
select HAVE_KERNEL_LZO
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HAVE_SYSCALL_TRACEPOINTS
|
||||
select HAVE_REGS_AND_STACK_ACCESS_API
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
@ -50,6 +51,7 @@ config SUPERH32
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_FUNCTION_TRACE_MCOUNT_TEST
|
||||
select HAVE_FTRACE_NMI_ENTER if DYNAMIC_FTRACE
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select HAVE_FUNCTION_GRAPH_TRACER
|
||||
select HAVE_ARCH_KGDB
|
||||
select HAVE_HW_BREAKPOINT
|
||||
|
@ -6,7 +6,6 @@
|
||||
# endif
|
||||
|
||||
# define __ARCH_WANT_SYS_RT_SIGSUSPEND
|
||||
# define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
# define __ARCH_WANT_OLD_READDIR
|
||||
# define __ARCH_WANT_OLD_STAT
|
||||
# define __ARCH_WANT_STAT64
|
||||
|
@ -27,6 +27,7 @@ config SPARC
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_WANT_IPC_PARSE_VERSION
|
||||
select USE_GENERIC_SMP_HELPERS if SMP
|
||||
select GENERIC_PCI_IOMAP
|
||||
select HAVE_NMI_WATCHDOG if SPARC64
|
||||
|
@ -423,7 +423,6 @@
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
#define __ARCH_WANT_STAT64
|
||||
#define __ARCH_WANT_SYS_ALARM
|
||||
|
@ -470,7 +470,7 @@ SYSCALL_DEFINE6(sparc_ipc, unsigned int, call, int, first, unsigned long, second
|
||||
switch (call) {
|
||||
case SHMAT: {
|
||||
ulong raddr;
|
||||
err = do_shmat(first, ptr, (int)second, &raddr);
|
||||
err = do_shmat(first, ptr, (int)second, &raddr, SHMLBA);
|
||||
if (!err) {
|
||||
if (put_user(raddr,
|
||||
(ulong __user *) third))
|
||||
|
@ -70,6 +70,7 @@ config X86
|
||||
select HAVE_ARCH_JUMP_LABEL
|
||||
select HAVE_TEXT_POKE_SMP
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
|
||||
select SPARSE_IRQ
|
||||
select GENERIC_FIND_FIRST_BIT
|
||||
select GENERIC_IRQ_PROBE
|
||||
@ -84,6 +85,7 @@ config X86
|
||||
select GENERIC_IOMAP
|
||||
select DCACHE_WORD_ACCESS
|
||||
select GENERIC_SMP_IDLE_THREAD
|
||||
select ARCH_WANT_IPC_PARSE_VERSION if X86_32
|
||||
select HAVE_ARCH_SECCOMP_FILTER
|
||||
select BUILDTIME_EXTABLE_SORT
|
||||
select GENERIC_CMOS_UPDATE
|
||||
|
@ -15,7 +15,6 @@
|
||||
# ifdef CONFIG_X86_32
|
||||
|
||||
# include <asm/unistd_32.h>
|
||||
# define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
# define __ARCH_WANT_STAT64
|
||||
# define __ARCH_WANT_SYS_IPC
|
||||
# define __ARCH_WANT_SYS_OLD_MMAP
|
||||
|
@ -944,7 +944,7 @@ void __init e820_reserve_resources(void)
|
||||
for (i = 0; i < e820_saved.nr_map; i++) {
|
||||
struct e820entry *entry = &e820_saved.map[i];
|
||||
firmware_map_add_early(entry->addr,
|
||||
entry->addr + entry->size - 1,
|
||||
entry->addr + entry->size,
|
||||
e820_type_to_string(entry->type));
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ asmlinkage long xtensa_shmat(int shmid, char __user *shmaddr, int shmflg)
|
||||
unsigned long ret;
|
||||
long err;
|
||||
|
||||
err = do_shmat(shmid, shmaddr, shmflg, &ret);
|
||||
err = do_shmat(shmid, shmaddr, shmflg, &ret, SHMLBA);
|
||||
if (err)
|
||||
return err;
|
||||
return (long)ret;
|
||||
|
@ -44,6 +44,7 @@ void do_page_fault(struct pt_regs *regs)
|
||||
|
||||
int is_write, is_exec;
|
||||
int fault;
|
||||
unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
||||
|
||||
info.si_code = SEGV_MAPERR;
|
||||
|
||||
@ -71,6 +72,7 @@ void do_page_fault(struct pt_regs *regs)
|
||||
address, exccause, regs->pc, is_write? "w":"", is_exec? "x":"");
|
||||
#endif
|
||||
|
||||
retry:
|
||||
down_read(&mm->mmap_sem);
|
||||
vma = find_vma(mm, address);
|
||||
|
||||
@ -93,6 +95,7 @@ good_area:
|
||||
if (is_write) {
|
||||
if (!(vma->vm_flags & VM_WRITE))
|
||||
goto bad_area;
|
||||
flags |= FAULT_FLAG_WRITE;
|
||||
} else if (is_exec) {
|
||||
if (!(vma->vm_flags & VM_EXEC))
|
||||
goto bad_area;
|
||||
@ -104,7 +107,11 @@ good_area:
|
||||
* make sure we exit gracefully rather than endlessly redo
|
||||
* the fault.
|
||||
*/
|
||||
fault = handle_mm_fault(mm, vma, address, is_write ? FAULT_FLAG_WRITE : 0);
|
||||
fault = handle_mm_fault(mm, vma, address, flags);
|
||||
|
||||
if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current))
|
||||
return;
|
||||
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
goto out_of_memory;
|
||||
@ -112,10 +119,22 @@ good_area:
|
||||
goto do_sigbus;
|
||||
BUG();
|
||||
}
|
||||
if (fault & VM_FAULT_MAJOR)
|
||||
current->maj_flt++;
|
||||
else
|
||||
current->min_flt++;
|
||||
if (flags & FAULT_FLAG_ALLOW_RETRY) {
|
||||
if (fault & VM_FAULT_MAJOR)
|
||||
current->maj_flt++;
|
||||
else
|
||||
current->min_flt++;
|
||||
if (fault & VM_FAULT_RETRY) {
|
||||
flags &= ~FAULT_FLAG_ALLOW_RETRY;
|
||||
|
||||
/* No need to up_read(&mm->mmap_sem) as we would
|
||||
* have already released it in __lock_page_or_retry
|
||||
* in mm/filemap.c.
|
||||
*/
|
||||
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
up_read(&mm->mmap_sem);
|
||||
return;
|
||||
|
@ -184,10 +184,8 @@
|
||||
struct arasan_cf_dev {
|
||||
/* pointer to ata_host structure */
|
||||
struct ata_host *host;
|
||||
/* clk structure, only if HAVE_CLK is defined */
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
/* clk structure */
|
||||
struct clk *clk;
|
||||
#endif
|
||||
|
||||
/* physical base address of controller */
|
||||
dma_addr_t pbase;
|
||||
@ -312,13 +310,11 @@ static int cf_init(struct arasan_cf_dev *acdev)
|
||||
unsigned long flags;
|
||||
int ret = 0;
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
ret = clk_enable(acdev->clk);
|
||||
if (ret) {
|
||||
dev_dbg(acdev->host->dev, "clock enable failed");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(&acdev->host->lock, flags);
|
||||
/* configure CF interface clock */
|
||||
@ -344,9 +340,7 @@ static void cf_exit(struct arasan_cf_dev *acdev)
|
||||
writel(readl(acdev->vbase + OP_MODE) & ~CFHOST_ENB,
|
||||
acdev->vbase + OP_MODE);
|
||||
spin_unlock_irqrestore(&acdev->host->lock, flags);
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_disable(acdev->clk);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void dma_callback(void *dev)
|
||||
@ -828,13 +822,11 @@ static int __devinit arasan_cf_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
acdev->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(acdev->clk)) {
|
||||
dev_warn(&pdev->dev, "Clock not found\n");
|
||||
return PTR_ERR(acdev->clk);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* allocate host */
|
||||
host = ata_host_alloc(&pdev->dev, 1);
|
||||
@ -899,9 +891,7 @@ static int __devinit arasan_cf_probe(struct platform_device *pdev)
|
||||
&arasan_cf_sht);
|
||||
|
||||
free_clk:
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_put(acdev->clk);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -912,9 +902,7 @@ static int __devexit arasan_cf_remove(struct platform_device *pdev)
|
||||
|
||||
ata_host_detach(host);
|
||||
cf_exit(acdev);
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_put(acdev->clk);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -25,7 +25,6 @@ menu "Common Clock Framework"
|
||||
|
||||
config COMMON_CLK_DEBUG
|
||||
bool "DebugFS representation of clock tree"
|
||||
depends on COMMON_CLK
|
||||
select DEBUG_FS
|
||||
---help---
|
||||
Creates a directory hierchy in debugfs for visualizing the clk
|
||||
|
@ -465,6 +465,9 @@ static void __clk_disable(struct clk *clk)
|
||||
if (!clk)
|
||||
return;
|
||||
|
||||
if (WARN_ON(IS_ERR(clk)))
|
||||
return;
|
||||
|
||||
if (WARN_ON(clk->enable_count == 0))
|
||||
return;
|
||||
|
||||
|
@ -98,7 +98,7 @@ static LIST_HEAD(map_entries);
|
||||
/**
|
||||
* firmware_map_add_entry() - Does the real work to add a firmware memmap entry.
|
||||
* @start: Start of the memory range.
|
||||
* @end: End of the memory range (inclusive).
|
||||
* @end: End of the memory range (exclusive).
|
||||
* @type: Type of the memory range.
|
||||
* @entry: Pre-allocated (either kmalloc() or bootmem allocator), uninitialised
|
||||
* entry.
|
||||
@ -113,7 +113,7 @@ static int firmware_map_add_entry(u64 start, u64 end,
|
||||
BUG_ON(start > end);
|
||||
|
||||
entry->start = start;
|
||||
entry->end = end;
|
||||
entry->end = end - 1;
|
||||
entry->type = type;
|
||||
INIT_LIST_HEAD(&entry->list);
|
||||
kobject_init(&entry->kobj, &memmap_ktype);
|
||||
@ -148,7 +148,7 @@ static int add_sysfs_fw_map_entry(struct firmware_map_entry *entry)
|
||||
* firmware_map_add_hotplug() - Adds a firmware mapping entry when we do
|
||||
* memory hotplug.
|
||||
* @start: Start of the memory range.
|
||||
* @end: End of the memory range (inclusive).
|
||||
* @end: End of the memory range (exclusive)
|
||||
* @type: Type of the memory range.
|
||||
*
|
||||
* Adds a firmware mapping entry. This function is for memory hotplug, it is
|
||||
@ -175,7 +175,7 @@ int __meminit firmware_map_add_hotplug(u64 start, u64 end, const char *type)
|
||||
/**
|
||||
* firmware_map_add_early() - Adds a firmware mapping entry.
|
||||
* @start: Start of the memory range.
|
||||
* @end: End of the memory range (inclusive).
|
||||
* @end: End of the memory range.
|
||||
* @type: Type of the memory range.
|
||||
*
|
||||
* Adds a firmware mapping entry. This function uses the bootmem allocator
|
||||
|
@ -95,7 +95,7 @@ efi_setup_pcdp_console(char *cmdline)
|
||||
if (efi.hcdp == EFI_INVALID_TABLE_ADDR)
|
||||
return -ENODEV;
|
||||
|
||||
pcdp = ioremap(efi.hcdp, 4096);
|
||||
pcdp = early_ioremap(efi.hcdp, 4096);
|
||||
printk(KERN_INFO "PCDP: v%d at 0x%lx\n", pcdp->rev, efi.hcdp);
|
||||
|
||||
if (strstr(cmdline, "console=hcdp")) {
|
||||
@ -131,6 +131,6 @@ efi_setup_pcdp_console(char *cmdline)
|
||||
}
|
||||
|
||||
out:
|
||||
iounmap(pcdp);
|
||||
early_iounmap(pcdp, 4096);
|
||||
return rc;
|
||||
}
|
||||
|
@ -41,13 +41,6 @@
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
||||
#ifndef CONFIG_HAVE_CLK
|
||||
#define clk_get(dev, id) NULL
|
||||
#define clk_put(clk) do { } while (0)
|
||||
#define clk_disable(clk) do { } while (0)
|
||||
#define clk_enable(clk) do { } while (0)
|
||||
#endif
|
||||
|
||||
struct pxa_reg_layout {
|
||||
u32 ibmr;
|
||||
u32 idbr;
|
||||
|
@ -571,16 +571,6 @@ static void disk_dtr(struct dm_dirty_log *log)
|
||||
destroy_log_context(lc);
|
||||
}
|
||||
|
||||
static int count_bits32(uint32_t *addr, unsigned size)
|
||||
{
|
||||
int count = 0, i;
|
||||
|
||||
for (i = 0; i < size; i++) {
|
||||
count += hweight32(*(addr+i));
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
static void fail_log_device(struct log_c *lc)
|
||||
{
|
||||
if (lc->log_dev_failed)
|
||||
@ -629,7 +619,8 @@ static int disk_resume(struct dm_dirty_log *log)
|
||||
|
||||
/* copy clean across to sync */
|
||||
memcpy(lc->sync_bits, lc->clean_bits, size);
|
||||
lc->sync_count = count_bits32(lc->clean_bits, lc->bitset_uint32_count);
|
||||
lc->sync_count = memweight(lc->clean_bits,
|
||||
lc->bitset_uint32_count * sizeof(uint32_t));
|
||||
lc->sync_search = 0;
|
||||
|
||||
/* set the correct number of regions in the header */
|
||||
|
@ -2083,7 +2083,7 @@ int uvc_ctrl_init_device(struct uvc_device *dev)
|
||||
/* Walk the entities list and instantiate controls */
|
||||
list_for_each_entry(entity, &dev->entities, list) {
|
||||
struct uvc_control *ctrl;
|
||||
unsigned int bControlSize = 0, ncontrols = 0;
|
||||
unsigned int bControlSize = 0, ncontrols;
|
||||
__u8 *bmControls = NULL;
|
||||
|
||||
if (UVC_ENTITY_TYPE(entity) == UVC_VC_EXTENSION_UNIT) {
|
||||
@ -2101,8 +2101,7 @@ int uvc_ctrl_init_device(struct uvc_device *dev)
|
||||
uvc_ctrl_prune_entity(dev, entity);
|
||||
|
||||
/* Count supported controls and allocate the controls array */
|
||||
for (i = 0; i < bControlSize; ++i)
|
||||
ncontrols += hweight8(bmControls[i]);
|
||||
ncontrols = memweight(bmControls, bControlSize);
|
||||
if (ncontrols == 0)
|
||||
continue;
|
||||
|
||||
|
@ -188,6 +188,13 @@ static int i2o_cfg_parms(unsigned long arg, unsigned int type)
|
||||
if (!dev)
|
||||
return -ENXIO;
|
||||
|
||||
/*
|
||||
* Stop users being able to try and allocate arbitary amounts
|
||||
* of DMA space. 64K is way more than sufficient for this.
|
||||
*/
|
||||
if (kcmd.oplen > 65536)
|
||||
return -EMSGSIZE;
|
||||
|
||||
ops = memdup_user(kcmd.opbuf, kcmd.oplen);
|
||||
if (IS_ERR(ops))
|
||||
return PTR_ERR(ops);
|
||||
|
@ -255,9 +255,8 @@ static char *scsi_devices[] = {
|
||||
"Array Controller Device"
|
||||
};
|
||||
|
||||
static char *chtostr(u8 * chars, int n)
|
||||
static char *chtostr(char *tmp, u8 *chars, int n)
|
||||
{
|
||||
char tmp[256];
|
||||
tmp[0] = 0;
|
||||
return strncat(tmp, (char *)chars, n);
|
||||
}
|
||||
@ -791,6 +790,7 @@ static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)
|
||||
} *result;
|
||||
|
||||
i2o_exec_execute_ddm_table ddm_table;
|
||||
char tmp[28 + 1];
|
||||
|
||||
result = kmalloc(sizeof(*result), GFP_KERNEL);
|
||||
if (!result)
|
||||
@ -826,7 +826,7 @@ static int i2o_seq_show_ddm_table(struct seq_file *seq, void *v)
|
||||
seq_printf(seq, "%-#7x", ddm_table.i2o_vendor_id);
|
||||
seq_printf(seq, "%-#8x", ddm_table.module_id);
|
||||
seq_printf(seq, "%-29s",
|
||||
chtostr(ddm_table.module_name_version, 28));
|
||||
chtostr(tmp, ddm_table.module_name_version, 28));
|
||||
seq_printf(seq, "%9d ", ddm_table.data_size);
|
||||
seq_printf(seq, "%8d", ddm_table.code_size);
|
||||
|
||||
@ -893,6 +893,7 @@ static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)
|
||||
|
||||
i2o_driver_result_table *result;
|
||||
i2o_driver_store_table *dst;
|
||||
char tmp[28 + 1];
|
||||
|
||||
result = kmalloc(sizeof(i2o_driver_result_table), GFP_KERNEL);
|
||||
if (result == NULL)
|
||||
@ -927,8 +928,9 @@ static int i2o_seq_show_drivers_stored(struct seq_file *seq, void *v)
|
||||
|
||||
seq_printf(seq, "%-#7x", dst->i2o_vendor_id);
|
||||
seq_printf(seq, "%-#8x", dst->module_id);
|
||||
seq_printf(seq, "%-29s", chtostr(dst->module_name_version, 28));
|
||||
seq_printf(seq, "%-9s", chtostr(dst->date, 8));
|
||||
seq_printf(seq, "%-29s",
|
||||
chtostr(tmp, dst->module_name_version, 28));
|
||||
seq_printf(seq, "%-9s", chtostr(tmp, dst->date, 8));
|
||||
seq_printf(seq, "%8d ", dst->module_size);
|
||||
seq_printf(seq, "%8d ", dst->mpb_size);
|
||||
seq_printf(seq, "0x%04x", dst->module_flags);
|
||||
@ -1248,6 +1250,7 @@ static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)
|
||||
// == (allow) 512d bytes (max)
|
||||
static u16 *work16 = (u16 *) work32;
|
||||
int token;
|
||||
char tmp[16 + 1];
|
||||
|
||||
token = i2o_parm_field_get(d, 0xF100, -1, &work32, sizeof(work32));
|
||||
|
||||
@ -1260,13 +1263,13 @@ static int i2o_seq_show_dev_identity(struct seq_file *seq, void *v)
|
||||
seq_printf(seq, "Owner TID : %0#5x\n", work16[2]);
|
||||
seq_printf(seq, "Parent TID : %0#5x\n", work16[3]);
|
||||
seq_printf(seq, "Vendor info : %s\n",
|
||||
chtostr((u8 *) (work32 + 2), 16));
|
||||
chtostr(tmp, (u8 *) (work32 + 2), 16));
|
||||
seq_printf(seq, "Product info : %s\n",
|
||||
chtostr((u8 *) (work32 + 6), 16));
|
||||
chtostr(tmp, (u8 *) (work32 + 6), 16));
|
||||
seq_printf(seq, "Description : %s\n",
|
||||
chtostr((u8 *) (work32 + 10), 16));
|
||||
chtostr(tmp, (u8 *) (work32 + 10), 16));
|
||||
seq_printf(seq, "Product rev. : %s\n",
|
||||
chtostr((u8 *) (work32 + 14), 8));
|
||||
chtostr(tmp, (u8 *) (work32 + 14), 8));
|
||||
|
||||
seq_printf(seq, "Serial number : ");
|
||||
print_serial_number(seq, (u8 *) (work32 + 16),
|
||||
@ -1303,6 +1306,8 @@ static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)
|
||||
u8 pad[256]; // allow up to 256 byte (max) serial number
|
||||
} result;
|
||||
|
||||
char tmp[24 + 1];
|
||||
|
||||
token = i2o_parm_field_get(d, 0xF101, -1, &result, sizeof(result));
|
||||
|
||||
if (token < 0) {
|
||||
@ -1312,9 +1317,9 @@ static int i2o_seq_show_ddm_identity(struct seq_file *seq, void *v)
|
||||
|
||||
seq_printf(seq, "Registering DDM TID : 0x%03x\n", result.ddm_tid);
|
||||
seq_printf(seq, "Module name : %s\n",
|
||||
chtostr(result.module_name, 24));
|
||||
chtostr(tmp, result.module_name, 24));
|
||||
seq_printf(seq, "Module revision : %s\n",
|
||||
chtostr(result.module_rev, 8));
|
||||
chtostr(tmp, result.module_rev, 8));
|
||||
|
||||
seq_printf(seq, "Serial number : ");
|
||||
print_serial_number(seq, result.serial_number, sizeof(result) - 36);
|
||||
@ -1338,6 +1343,8 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)
|
||||
u8 instance_number[4];
|
||||
} result;
|
||||
|
||||
char tmp[64 + 1];
|
||||
|
||||
token = i2o_parm_field_get(d, 0xF102, -1, &result, sizeof(result));
|
||||
|
||||
if (token < 0) {
|
||||
@ -1346,13 +1353,13 @@ static int i2o_seq_show_uinfo(struct seq_file *seq, void *v)
|
||||
}
|
||||
|
||||
seq_printf(seq, "Device name : %s\n",
|
||||
chtostr(result.device_name, 64));
|
||||
chtostr(tmp, result.device_name, 64));
|
||||
seq_printf(seq, "Service name : %s\n",
|
||||
chtostr(result.service_name, 64));
|
||||
chtostr(tmp, result.service_name, 64));
|
||||
seq_printf(seq, "Physical name : %s\n",
|
||||
chtostr(result.physical_location, 64));
|
||||
chtostr(tmp, result.physical_location, 64));
|
||||
seq_printf(seq, "Instance number : %s\n",
|
||||
chtostr(result.instance_number, 4));
|
||||
chtostr(tmp, result.instance_number, 4));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -477,6 +477,8 @@ static ssize_t lkdtm_debugfs_read(struct file *f, char __user *user_buf,
|
||||
int i, n, out;
|
||||
|
||||
buf = (char *)__get_free_page(GFP_KERNEL);
|
||||
if (buf == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
n = snprintf(buf, PAGE_SIZE, "Available crash types:\n");
|
||||
for (i = 0; i < ARRAY_SIZE(cp_type); i++)
|
||||
|
@ -349,6 +349,11 @@ void st_int_recv(void *disc_data,
|
||||
st_gdata->rx_skb = alloc_skb(
|
||||
st_gdata->list[type]->max_frame_size,
|
||||
GFP_ATOMIC);
|
||||
if (st_gdata->rx_skb == NULL) {
|
||||
pr_err("out of memory: dropping\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
skb_reserve(st_gdata->rx_skb,
|
||||
st_gdata->list[type]->reserve);
|
||||
/* next 2 required for BT only */
|
||||
|
@ -74,7 +74,6 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
|
||||
const struct platform_device_id *id;
|
||||
struct resource *mem;
|
||||
int irq;
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
struct clk *clk;
|
||||
|
||||
/* get the appropriate clk */
|
||||
@ -84,7 +83,6 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
|
||||
ret = -ENODEV;
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* get the platform data */
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
@ -145,10 +143,8 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev)
|
||||
|
||||
dev->irq = irq;
|
||||
priv->base = addr;
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
priv->can.clock.freq = clk_get_rate(clk);
|
||||
priv->priv = clk;
|
||||
#endif
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
SET_NETDEV_DEV(dev, &pdev->dev);
|
||||
@ -172,10 +168,8 @@ exit_iounmap:
|
||||
exit_release_mem:
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
exit_free_clk:
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_put(clk);
|
||||
exit:
|
||||
#endif
|
||||
dev_err(&pdev->dev, "probe failed\n");
|
||||
|
||||
return ret;
|
||||
@ -196,9 +190,7 @@ static int __devexit c_can_plat_remove(struct platform_device *pdev)
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_put(priv->priv);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -82,9 +82,7 @@ struct stmmac_priv {
|
||||
struct stmmac_counters mmc;
|
||||
struct dma_features dma_cap;
|
||||
int hw_cap_support;
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
struct clk *stmmac_clk;
|
||||
#endif
|
||||
int clk_csr;
|
||||
int synopsys_id;
|
||||
struct timer_list eee_ctrl_timer;
|
||||
@ -113,46 +111,6 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
||||
void stmmac_disable_eee_mode(struct stmmac_priv *priv);
|
||||
bool stmmac_eee_init(struct stmmac_priv *priv);
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
static inline int stmmac_clk_enable(struct stmmac_priv *priv)
|
||||
{
|
||||
if (!IS_ERR(priv->stmmac_clk))
|
||||
return clk_prepare_enable(priv->stmmac_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void stmmac_clk_disable(struct stmmac_priv *priv)
|
||||
{
|
||||
if (IS_ERR(priv->stmmac_clk))
|
||||
return;
|
||||
|
||||
clk_disable_unprepare(priv->stmmac_clk);
|
||||
}
|
||||
static inline int stmmac_clk_get(struct stmmac_priv *priv)
|
||||
{
|
||||
priv->stmmac_clk = clk_get(priv->device, NULL);
|
||||
|
||||
if (IS_ERR(priv->stmmac_clk))
|
||||
return PTR_ERR(priv->stmmac_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int stmmac_clk_enable(struct stmmac_priv *priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void stmmac_clk_disable(struct stmmac_priv *priv)
|
||||
{
|
||||
}
|
||||
static inline int stmmac_clk_get(struct stmmac_priv *priv)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_HAVE_CLK */
|
||||
|
||||
|
||||
#ifdef CONFIG_STMMAC_PLATFORM
|
||||
extern struct platform_driver stmmac_pltfr_driver;
|
||||
static inline int stmmac_register_platform(void)
|
||||
|
@ -28,6 +28,7 @@
|
||||
https://bugzilla.stlinux.com/
|
||||
*******************************************************************************/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ip.h>
|
||||
@ -173,12 +174,8 @@ static void stmmac_verify_args(void)
|
||||
|
||||
static void stmmac_clk_csr_set(struct stmmac_priv *priv)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
u32 clk_rate;
|
||||
|
||||
if (IS_ERR(priv->stmmac_clk))
|
||||
return;
|
||||
|
||||
clk_rate = clk_get_rate(priv->stmmac_clk);
|
||||
|
||||
/* Platform provided default clk_csr would be assumed valid
|
||||
@ -200,7 +197,6 @@ static void stmmac_clk_csr_set(struct stmmac_priv *priv)
|
||||
* we can not estimate the proper divider as it is not known
|
||||
* the frequency of clk_csr_i. So we do not change the default
|
||||
* divider. */
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(STMMAC_XMIT_DEBUG) || defined(STMMAC_RX_DEBUG)
|
||||
@ -1070,7 +1066,7 @@ static int stmmac_open(struct net_device *dev)
|
||||
} else
|
||||
priv->tm->enable = 1;
|
||||
#endif
|
||||
stmmac_clk_enable(priv);
|
||||
clk_enable(priv->stmmac_clk);
|
||||
|
||||
stmmac_check_ether_addr(priv);
|
||||
|
||||
@ -1192,7 +1188,7 @@ open_error:
|
||||
if (priv->phydev)
|
||||
phy_disconnect(priv->phydev);
|
||||
|
||||
stmmac_clk_disable(priv);
|
||||
clk_disable(priv->stmmac_clk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -1250,7 +1246,7 @@ static int stmmac_release(struct net_device *dev)
|
||||
#ifdef CONFIG_STMMAC_DEBUG_FS
|
||||
stmmac_exit_fs();
|
||||
#endif
|
||||
stmmac_clk_disable(priv);
|
||||
clk_disable(priv->stmmac_clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -2078,11 +2074,14 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
||||
ret = register_netdev(ndev);
|
||||
if (ret) {
|
||||
pr_err("%s: ERROR %i registering the device\n", __func__, ret);
|
||||
goto error;
|
||||
goto error_netdev_register;
|
||||
}
|
||||
|
||||
if (stmmac_clk_get(priv))
|
||||
priv->stmmac_clk = clk_get(priv->device, NULL);
|
||||
if (IS_ERR(priv->stmmac_clk)) {
|
||||
pr_warning("%s: warning: cannot get CSR clock\n", __func__);
|
||||
goto error_clk_get;
|
||||
}
|
||||
|
||||
/* If a specific clk_csr value is passed from the platform
|
||||
* this means that the CSR Clock Range selection cannot be
|
||||
@ -2100,15 +2099,17 @@ struct stmmac_priv *stmmac_dvr_probe(struct device *device,
|
||||
if (ret < 0) {
|
||||
pr_debug("%s: MDIO bus (id: %d) registration failed",
|
||||
__func__, priv->plat->bus_id);
|
||||
goto error;
|
||||
goto error_mdio_register;
|
||||
}
|
||||
|
||||
return priv;
|
||||
|
||||
error:
|
||||
netif_napi_del(&priv->napi);
|
||||
|
||||
error_mdio_register:
|
||||
clk_put(priv->stmmac_clk);
|
||||
error_clk_get:
|
||||
unregister_netdev(ndev);
|
||||
error_netdev_register:
|
||||
netif_napi_del(&priv->napi);
|
||||
free_netdev(ndev);
|
||||
|
||||
return NULL;
|
||||
@ -2177,7 +2178,7 @@ int stmmac_suspend(struct net_device *ndev)
|
||||
else {
|
||||
stmmac_set_mac(priv->ioaddr, false);
|
||||
/* Disable clock in case of PWM is off */
|
||||
stmmac_clk_disable(priv);
|
||||
clk_disable(priv->stmmac_clk);
|
||||
}
|
||||
spin_unlock_irqrestore(&priv->lock, flags);
|
||||
return 0;
|
||||
@ -2202,7 +2203,7 @@ int stmmac_resume(struct net_device *ndev)
|
||||
priv->hw->mac->pmt(priv->ioaddr, 0);
|
||||
else
|
||||
/* enable the clk prevously disabled */
|
||||
stmmac_clk_enable(priv);
|
||||
clk_enable(priv->stmmac_clk);
|
||||
|
||||
netif_device_attach(ndev);
|
||||
|
||||
|
@ -327,8 +327,10 @@ int pps_register_cdev(struct pps_device *pps)
|
||||
}
|
||||
pps->dev = device_create(pps_class, pps->info.dev, devt, pps,
|
||||
"pps%d", pps->id);
|
||||
if (IS_ERR(pps->dev))
|
||||
if (IS_ERR(pps->dev)) {
|
||||
err = PTR_ERR(pps->dev);
|
||||
goto del_cdev;
|
||||
}
|
||||
|
||||
pps->dev->release = pps_device_destruct;
|
||||
|
||||
|
@ -704,6 +704,7 @@ config RTC_DRV_AB3100
|
||||
config RTC_DRV_AB8500
|
||||
tristate "ST-Ericsson AB8500 RTC"
|
||||
depends on AB8500_CORE
|
||||
select RTC_INTF_DEV_UIE_EMUL
|
||||
help
|
||||
Select this to enable the ST-Ericsson AB8500 power management IC RTC
|
||||
support. This chip contains a battery- and capacitor-backed RTC.
|
||||
|
@ -89,22 +89,17 @@ static int ab8500_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
/* Early AB8500 chips will not clear the rtc read request bit */
|
||||
if (abx500_get_chip_id(dev) == 0) {
|
||||
usleep_range(1000, 1000);
|
||||
} else {
|
||||
/* Wait for some cycles after enabling the rtc read in ab8500 */
|
||||
while (time_before(jiffies, timeout)) {
|
||||
retval = abx500_get_register_interruptible(dev,
|
||||
AB8500_RTC, AB8500_RTC_READ_REQ_REG, &value);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
/* Wait for some cycles after enabling the rtc read in ab8500 */
|
||||
while (time_before(jiffies, timeout)) {
|
||||
retval = abx500_get_register_interruptible(dev,
|
||||
AB8500_RTC, AB8500_RTC_READ_REQ_REG, &value);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
|
||||
if (!(value & RTC_READ_REQUEST))
|
||||
break;
|
||||
if (!(value & RTC_READ_REQUEST))
|
||||
break;
|
||||
|
||||
usleep_range(1000, 5000);
|
||||
}
|
||||
usleep_range(1000, 5000);
|
||||
}
|
||||
|
||||
/* Read the Watchtime registers */
|
||||
@ -225,7 +220,8 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
{
|
||||
int retval, i;
|
||||
unsigned char buf[ARRAY_SIZE(ab8500_rtc_alarm_regs)];
|
||||
unsigned long mins, secs = 0;
|
||||
unsigned long mins, secs = 0, cursec = 0;
|
||||
struct rtc_time curtm;
|
||||
|
||||
if (alarm->time.tm_year < (AB8500_RTC_EPOCH - 1900)) {
|
||||
dev_dbg(dev, "year should be equal to or greater than %d\n",
|
||||
@ -236,6 +232,18 @@ static int ab8500_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
/* Get the number of seconds since 1970 */
|
||||
rtc_tm_to_time(&alarm->time, &secs);
|
||||
|
||||
/*
|
||||
* Check whether alarm is set less than 1min.
|
||||
* Since our RTC doesn't support alarm resolution less than 1min,
|
||||
* return -EINVAL, so UIE EMUL can take it up, incase of UIE_ON
|
||||
*/
|
||||
ab8500_rtc_read_time(dev, &curtm); /* Read current time */
|
||||
rtc_tm_to_time(&curtm, &cursec);
|
||||
if ((secs - cursec) < 59) {
|
||||
dev_dbg(dev, "Alarm less than 1 minute not supported\r\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert it to the number of seconds since 01-01-2000 00:00:00, since
|
||||
* we only have a small counter in the RTC.
|
||||
|
@ -155,13 +155,10 @@ static int __exit coh901331_remove(struct platform_device *pdev)
|
||||
struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
if (rtap) {
|
||||
free_irq(rtap->irq, rtap);
|
||||
rtc_device_unregister(rtap->rtc);
|
||||
clk_unprepare(rtap->clk);
|
||||
clk_put(rtap->clk);
|
||||
iounmap(rtap->virtbase);
|
||||
release_mem_region(rtap->phybase, rtap->physize);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(rtap);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -174,49 +171,43 @@ static int __init coh901331_probe(struct platform_device *pdev)
|
||||
struct coh901331_port *rtap;
|
||||
struct resource *res;
|
||||
|
||||
rtap = kzalloc(sizeof(struct coh901331_port), GFP_KERNEL);
|
||||
rtap = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct coh901331_port), GFP_KERNEL);
|
||||
if (!rtap)
|
||||
return -ENOMEM;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
ret = -ENOENT;
|
||||
goto out_no_resource;
|
||||
}
|
||||
if (!res)
|
||||
return -ENOENT;
|
||||
|
||||
rtap->phybase = res->start;
|
||||
rtap->physize = resource_size(res);
|
||||
|
||||
if (request_mem_region(rtap->phybase, rtap->physize,
|
||||
"rtc-coh901331") == NULL) {
|
||||
ret = -EBUSY;
|
||||
goto out_no_memregion;
|
||||
}
|
||||
if (devm_request_mem_region(&pdev->dev, rtap->phybase, rtap->physize,
|
||||
"rtc-coh901331") == NULL)
|
||||
return -EBUSY;
|
||||
|
||||
rtap->virtbase = ioremap(rtap->phybase, rtap->physize);
|
||||
if (!rtap->virtbase) {
|
||||
ret = -ENOMEM;
|
||||
goto out_no_remap;
|
||||
}
|
||||
rtap->virtbase = devm_ioremap(&pdev->dev, rtap->phybase, rtap->physize);
|
||||
if (!rtap->virtbase)
|
||||
return -ENOMEM;
|
||||
|
||||
rtap->irq = platform_get_irq(pdev, 0);
|
||||
if (request_irq(rtap->irq, coh901331_interrupt, 0,
|
||||
"RTC COH 901 331 Alarm", rtap)) {
|
||||
ret = -EIO;
|
||||
goto out_no_irq;
|
||||
}
|
||||
if (devm_request_irq(&pdev->dev, rtap->irq, coh901331_interrupt, 0,
|
||||
"RTC COH 901 331 Alarm", rtap))
|
||||
return -EIO;
|
||||
|
||||
rtap->clk = clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(rtap->clk)) {
|
||||
ret = PTR_ERR(rtap->clk);
|
||||
dev_err(&pdev->dev, "could not get clock\n");
|
||||
goto out_no_clk;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* We enable/disable the clock only to assure it works */
|
||||
ret = clk_enable(rtap->clk);
|
||||
ret = clk_prepare_enable(rtap->clk);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "could not enable clock\n");
|
||||
goto out_no_clk_enable;
|
||||
goto out_no_clk_prepenable;
|
||||
}
|
||||
clk_disable(rtap->clk);
|
||||
|
||||
@ -232,18 +223,9 @@ static int __init coh901331_probe(struct platform_device *pdev)
|
||||
|
||||
out_no_rtc:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
out_no_clk_enable:
|
||||
clk_unprepare(rtap->clk);
|
||||
out_no_clk_prepenable:
|
||||
clk_put(rtap->clk);
|
||||
out_no_clk:
|
||||
free_irq(rtap->irq, rtap);
|
||||
out_no_irq:
|
||||
iounmap(rtap->virtbase);
|
||||
out_no_remap:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
out_no_memregion:
|
||||
release_mem_region(rtap->phybase, SZ_4K);
|
||||
out_no_resource:
|
||||
kfree(rtap);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -265,6 +247,7 @@ static int coh901331_suspend(struct platform_device *pdev, pm_message_t state)
|
||||
writel(0, rtap->virtbase + COH901331_IRQ_MASK);
|
||||
clk_disable(rtap->clk);
|
||||
}
|
||||
clk_unprepare(rtap->clk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -272,6 +255,7 @@ static int coh901331_resume(struct platform_device *pdev)
|
||||
{
|
||||
struct coh901331_port *rtap = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
clk_prepare(rtap->clk);
|
||||
if (device_may_wakeup(&pdev->dev)) {
|
||||
disable_irq_wake(rtap->irq);
|
||||
} else {
|
||||
@ -293,6 +277,7 @@ static void coh901331_shutdown(struct platform_device *pdev)
|
||||
clk_enable(rtap->clk);
|
||||
writel(0, rtap->virtbase + COH901331_IRQ_MASK);
|
||||
clk_disable(rtap->clk);
|
||||
clk_unprepare(rtap->clk);
|
||||
}
|
||||
|
||||
static struct platform_driver coh901331_driver = {
|
||||
|
@ -245,7 +245,7 @@ static int __devinit da9052_rtc_probe(struct platform_device *pdev)
|
||||
"ALM", rtc);
|
||||
if (ret != 0) {
|
||||
rtc_err(rtc->da9052, "irq registration failed: %d\n", ret);
|
||||
goto err_mem;
|
||||
return ret;
|
||||
}
|
||||
|
||||
rtc->rtc = rtc_device_register(pdev->name, &pdev->dev,
|
||||
@ -259,8 +259,6 @@ static int __devinit da9052_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
err_free_irq:
|
||||
free_irq(rtc->irq, rtc);
|
||||
err_mem:
|
||||
devm_kfree(&pdev->dev, rtc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -271,7 +269,6 @@ static int __devexit da9052_rtc_remove(struct platform_device *pdev)
|
||||
rtc_device_unregister(rtc->rtc);
|
||||
free_irq(rtc->irq, rtc);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
devm_kfree(&pdev->dev, rtc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -404,9 +404,12 @@ static const struct platform_device_id mc13xxx_rtc_idtable[] = {
|
||||
.name = "mc13783-rtc",
|
||||
}, {
|
||||
.name = "mc13892-rtc",
|
||||
}, {
|
||||
.name = "mc34708-rtc",
|
||||
},
|
||||
{ }
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(platform, mc13xxx_rtc_idtable);
|
||||
|
||||
static struct platform_driver mc13xxx_rtc_driver = {
|
||||
.id_table = mc13xxx_rtc_idtable,
|
||||
@ -432,4 +435,3 @@ module_exit(mc13xxx_rtc_exit);
|
||||
MODULE_AUTHOR("Sascha Hauer <s.hauer@pengutronix.de>");
|
||||
MODULE_DESCRIPTION("RTC driver for Freescale MC13XXX PMIC");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_ALIAS("platform:" DRIVER_NAME);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
|
||||
#define DRV_VERSION "0.4.3"
|
||||
|
||||
@ -285,9 +286,19 @@ static const struct i2c_device_id pcf8563_id[] = {
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, pcf8563_id);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static const struct of_device_id pcf8563_of_match[] __devinitconst = {
|
||||
{ .compatible = "nxp,pcf8563" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pcf8563_of_match);
|
||||
#endif
|
||||
|
||||
static struct i2c_driver pcf8563_driver = {
|
||||
.driver = {
|
||||
.name = "rtc-pcf8563",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(pcf8563_of_match),
|
||||
},
|
||||
.probe = pcf8563_probe,
|
||||
.remove = pcf8563_remove,
|
||||
|
@ -68,11 +68,26 @@
|
||||
|
||||
#define RTC_TIMER_FREQ 32768
|
||||
|
||||
/**
|
||||
* struct pl031_vendor_data - per-vendor variations
|
||||
* @ops: the vendor-specific operations used on this silicon version
|
||||
* @clockwatch: if this is an ST Microelectronics silicon version with a
|
||||
* clockwatch function
|
||||
* @st_weekday: if this is an ST Microelectronics silicon version that need
|
||||
* the weekday fix
|
||||
* @irqflags: special IRQ flags per variant
|
||||
*/
|
||||
struct pl031_vendor_data {
|
||||
struct rtc_class_ops ops;
|
||||
bool clockwatch;
|
||||
bool st_weekday;
|
||||
unsigned long irqflags;
|
||||
};
|
||||
|
||||
struct pl031_local {
|
||||
struct pl031_vendor_data *vendor;
|
||||
struct rtc_device *rtc;
|
||||
void __iomem *base;
|
||||
u8 hw_designer;
|
||||
u8 hw_revision:4;
|
||||
};
|
||||
|
||||
static int pl031_alarm_irq_enable(struct device *dev,
|
||||
@ -303,7 +318,8 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
{
|
||||
int ret;
|
||||
struct pl031_local *ldata;
|
||||
struct rtc_class_ops *ops = id->data;
|
||||
struct pl031_vendor_data *vendor = id->data;
|
||||
struct rtc_class_ops *ops = &vendor->ops;
|
||||
unsigned long time;
|
||||
|
||||
ret = amba_request_regions(adev, NULL);
|
||||
@ -315,6 +331,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
ldata->vendor = vendor;
|
||||
|
||||
ldata->base = ioremap(adev->res.start, resource_size(&adev->res));
|
||||
|
||||
@ -325,14 +342,11 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
|
||||
amba_set_drvdata(adev, ldata);
|
||||
|
||||
ldata->hw_designer = amba_manf(adev);
|
||||
ldata->hw_revision = amba_rev(adev);
|
||||
|
||||
dev_dbg(&adev->dev, "designer ID = 0x%02x\n", ldata->hw_designer);
|
||||
dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision);
|
||||
dev_dbg(&adev->dev, "designer ID = 0x%02x\n", amba_manf(adev));
|
||||
dev_dbg(&adev->dev, "revision = 0x%01x\n", amba_rev(adev));
|
||||
|
||||
/* Enable the clockwatch on ST Variants */
|
||||
if (ldata->hw_designer == AMBA_VENDOR_ST)
|
||||
if (vendor->clockwatch)
|
||||
writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN,
|
||||
ldata->base + RTC_CR);
|
||||
|
||||
@ -340,7 +354,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
* On ST PL031 variants, the RTC reset value does not provide correct
|
||||
* weekday for 2000-01-01. Correct the erroneous sunday to saturday.
|
||||
*/
|
||||
if (ldata->hw_designer == AMBA_VENDOR_ST) {
|
||||
if (vendor->st_weekday) {
|
||||
if (readl(ldata->base + RTC_YDR) == 0x2000) {
|
||||
time = readl(ldata->base + RTC_DR);
|
||||
if ((time &
|
||||
@ -361,7 +375,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id)
|
||||
}
|
||||
|
||||
if (request_irq(adev->irq[0], pl031_interrupt,
|
||||
0, "rtc-pl031", ldata)) {
|
||||
vendor->irqflags, "rtc-pl031", ldata)) {
|
||||
ret = -EIO;
|
||||
goto out_no_irq;
|
||||
}
|
||||
@ -383,48 +397,65 @@ err_req:
|
||||
}
|
||||
|
||||
/* Operations for the original ARM version */
|
||||
static struct rtc_class_ops arm_pl031_ops = {
|
||||
.read_time = pl031_read_time,
|
||||
.set_time = pl031_set_time,
|
||||
.read_alarm = pl031_read_alarm,
|
||||
.set_alarm = pl031_set_alarm,
|
||||
.alarm_irq_enable = pl031_alarm_irq_enable,
|
||||
static struct pl031_vendor_data arm_pl031 = {
|
||||
.ops = {
|
||||
.read_time = pl031_read_time,
|
||||
.set_time = pl031_set_time,
|
||||
.read_alarm = pl031_read_alarm,
|
||||
.set_alarm = pl031_set_alarm,
|
||||
.alarm_irq_enable = pl031_alarm_irq_enable,
|
||||
},
|
||||
.irqflags = IRQF_NO_SUSPEND,
|
||||
};
|
||||
|
||||
/* The First ST derivative */
|
||||
static struct rtc_class_ops stv1_pl031_ops = {
|
||||
.read_time = pl031_read_time,
|
||||
.set_time = pl031_set_time,
|
||||
.read_alarm = pl031_read_alarm,
|
||||
.set_alarm = pl031_set_alarm,
|
||||
.alarm_irq_enable = pl031_alarm_irq_enable,
|
||||
static struct pl031_vendor_data stv1_pl031 = {
|
||||
.ops = {
|
||||
.read_time = pl031_read_time,
|
||||
.set_time = pl031_set_time,
|
||||
.read_alarm = pl031_read_alarm,
|
||||
.set_alarm = pl031_set_alarm,
|
||||
.alarm_irq_enable = pl031_alarm_irq_enable,
|
||||
},
|
||||
.clockwatch = true,
|
||||
.st_weekday = true,
|
||||
.irqflags = IRQF_NO_SUSPEND,
|
||||
};
|
||||
|
||||
/* And the second ST derivative */
|
||||
static struct rtc_class_ops stv2_pl031_ops = {
|
||||
.read_time = pl031_stv2_read_time,
|
||||
.set_time = pl031_stv2_set_time,
|
||||
.read_alarm = pl031_stv2_read_alarm,
|
||||
.set_alarm = pl031_stv2_set_alarm,
|
||||
.alarm_irq_enable = pl031_alarm_irq_enable,
|
||||
static struct pl031_vendor_data stv2_pl031 = {
|
||||
.ops = {
|
||||
.read_time = pl031_stv2_read_time,
|
||||
.set_time = pl031_stv2_set_time,
|
||||
.read_alarm = pl031_stv2_read_alarm,
|
||||
.set_alarm = pl031_stv2_set_alarm,
|
||||
.alarm_irq_enable = pl031_alarm_irq_enable,
|
||||
},
|
||||
.clockwatch = true,
|
||||
.st_weekday = true,
|
||||
/*
|
||||
* This variant shares the IRQ with another block and must not
|
||||
* suspend that IRQ line.
|
||||
*/
|
||||
.irqflags = IRQF_SHARED | IRQF_NO_SUSPEND,
|
||||
};
|
||||
|
||||
static struct amba_id pl031_ids[] = {
|
||||
{
|
||||
.id = 0x00041031,
|
||||
.mask = 0x000fffff,
|
||||
.data = &arm_pl031_ops,
|
||||
.data = &arm_pl031,
|
||||
},
|
||||
/* ST Micro variants */
|
||||
{
|
||||
.id = 0x00180031,
|
||||
.mask = 0x00ffffff,
|
||||
.data = &stv1_pl031_ops,
|
||||
.data = &stv1_pl031,
|
||||
},
|
||||
{
|
||||
.id = 0x00280031,
|
||||
.mask = 0x00ffffff,
|
||||
.data = &stv2_pl031_ops,
|
||||
.data = &stv2_pl031,
|
||||
},
|
||||
{0, 0},
|
||||
};
|
||||
|
@ -138,8 +138,7 @@ static int __devinit r9701_probe(struct spi_device *spi)
|
||||
* contain invalid values. If so, try to write a default date:
|
||||
* 2000/1/1 00:00:00
|
||||
*/
|
||||
r9701_get_datetime(&spi->dev, &dt);
|
||||
if (rtc_valid_tm(&dt)) {
|
||||
if (r9701_get_datetime(&spi->dev, &dt)) {
|
||||
dev_info(&spi->dev, "trying to repair invalid date/time\n");
|
||||
dt.tm_sec = 0;
|
||||
dt.tm_min = 0;
|
||||
@ -148,7 +147,8 @@ static int __devinit r9701_probe(struct spi_device *spi)
|
||||
dt.tm_mon = 0;
|
||||
dt.tm_year = 100;
|
||||
|
||||
if (r9701_set_datetime(&spi->dev, &dt)) {
|
||||
if (r9701_set_datetime(&spi->dev, &dt) ||
|
||||
r9701_get_datetime(&spi->dev, &dt)) {
|
||||
dev_err(&spi->dev, "cannot repair RTC register\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
@ -26,10 +26,10 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <plat/regs-rtc.h>
|
||||
|
||||
|
@ -1583,12 +1583,10 @@ static int __exit m66592_remove(struct platform_device *pdev)
|
||||
iounmap(m66592->reg);
|
||||
free_irq(platform_get_irq(pdev, 0), m66592);
|
||||
m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (m66592->pdata->on_chip) {
|
||||
clk_disable(m66592->clk);
|
||||
clk_put(m66592->clk);
|
||||
}
|
||||
#endif
|
||||
kfree(m66592);
|
||||
return 0;
|
||||
}
|
||||
@ -1602,9 +1600,7 @@ static int __init m66592_probe(struct platform_device *pdev)
|
||||
struct resource *res, *ires;
|
||||
void __iomem *reg = NULL;
|
||||
struct m66592 *m66592 = NULL;
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
char clk_name[8];
|
||||
#endif
|
||||
int ret = 0;
|
||||
int i;
|
||||
|
||||
@ -1671,7 +1667,6 @@ static int __init m66592_probe(struct platform_device *pdev)
|
||||
goto clean_up;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (m66592->pdata->on_chip) {
|
||||
snprintf(clk_name, sizeof(clk_name), "usbf%d", pdev->id);
|
||||
m66592->clk = clk_get(&pdev->dev, clk_name);
|
||||
@ -1683,7 +1678,7 @@ static int __init m66592_probe(struct platform_device *pdev)
|
||||
}
|
||||
clk_enable(m66592->clk);
|
||||
}
|
||||
#endif
|
||||
|
||||
INIT_LIST_HEAD(&m66592->gadget.ep_list);
|
||||
m66592->gadget.ep0 = &m66592->ep[0].ep;
|
||||
INIT_LIST_HEAD(&m66592->gadget.ep0->ep_list);
|
||||
@ -1731,13 +1726,11 @@ err_add_udc:
|
||||
m66592_free_request(&m66592->ep[0].ep, m66592->ep0_req);
|
||||
|
||||
clean_up3:
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (m66592->pdata->on_chip) {
|
||||
clk_disable(m66592->clk);
|
||||
clk_put(m66592->clk);
|
||||
}
|
||||
clean_up2:
|
||||
#endif
|
||||
free_irq(ires->start, m66592);
|
||||
clean_up:
|
||||
if (m66592) {
|
||||
|
@ -13,10 +13,7 @@
|
||||
#ifndef __M66592_UDC_H__
|
||||
#define __M66592_UDC_H__
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
#include <linux/clk.h>
|
||||
#endif
|
||||
|
||||
#include <linux/usb/m66592.h>
|
||||
|
||||
#define M66592_SYSCFG 0x00
|
||||
@ -468,9 +465,7 @@ struct m66592_ep {
|
||||
struct m66592 {
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
struct clk *clk;
|
||||
#endif
|
||||
struct m66592_platdata *pdata;
|
||||
unsigned long irq_trigger;
|
||||
|
||||
|
@ -1831,12 +1831,12 @@ static int __exit r8a66597_remove(struct platform_device *pdev)
|
||||
iounmap(r8a66597->sudmac_reg);
|
||||
free_irq(platform_get_irq(pdev, 0), r8a66597);
|
||||
r8a66597_free_request(&r8a66597->ep[0].ep, r8a66597->ep0_req);
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
|
||||
if (r8a66597->pdata->on_chip) {
|
||||
clk_disable(r8a66597->clk);
|
||||
clk_put(r8a66597->clk);
|
||||
}
|
||||
#endif
|
||||
|
||||
device_unregister(&r8a66597->gadget.dev);
|
||||
kfree(r8a66597);
|
||||
return 0;
|
||||
@ -1868,9 +1868,7 @@ static int __init r8a66597_sudmac_ioremap(struct r8a66597 *r8a66597,
|
||||
|
||||
static int __init r8a66597_probe(struct platform_device *pdev)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
char clk_name[8];
|
||||
#endif
|
||||
struct resource *res, *ires;
|
||||
int irq;
|
||||
void __iomem *reg = NULL;
|
||||
@ -1934,7 +1932,6 @@ static int __init r8a66597_probe(struct platform_device *pdev)
|
||||
r8a66597->timer.data = (unsigned long)r8a66597;
|
||||
r8a66597->reg = reg;
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (r8a66597->pdata->on_chip) {
|
||||
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
|
||||
r8a66597->clk = clk_get(&pdev->dev, clk_name);
|
||||
@ -1946,7 +1943,7 @@ static int __init r8a66597_probe(struct platform_device *pdev)
|
||||
}
|
||||
clk_enable(r8a66597->clk);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (r8a66597->pdata->sudmac) {
|
||||
ret = r8a66597_sudmac_ioremap(r8a66597, pdev);
|
||||
if (ret < 0)
|
||||
@ -2006,13 +2003,11 @@ err_add_udc:
|
||||
clean_up3:
|
||||
free_irq(irq, r8a66597);
|
||||
clean_up2:
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (r8a66597->pdata->on_chip) {
|
||||
clk_disable(r8a66597->clk);
|
||||
clk_put(r8a66597->clk);
|
||||
}
|
||||
clean_up_dev:
|
||||
#endif
|
||||
device_unregister(&r8a66597->gadget.dev);
|
||||
clean_up:
|
||||
if (r8a66597) {
|
||||
|
@ -13,10 +13,7 @@
|
||||
#ifndef __R8A66597_H__
|
||||
#define __R8A66597_H__
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
#include <linux/clk.h>
|
||||
#endif
|
||||
|
||||
#include <linux/usb/r8a66597.h>
|
||||
|
||||
#define R8A66597_MAX_SAMPLING 10
|
||||
@ -92,9 +89,7 @@ struct r8a66597 {
|
||||
void __iomem *reg;
|
||||
void __iomem *sudmac_reg;
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
struct clk *clk;
|
||||
#endif
|
||||
struct r8a66597_platdata *pdata;
|
||||
|
||||
struct usb_gadget gadget;
|
||||
|
@ -95,9 +95,7 @@ static int r8a66597_clock_enable(struct r8a66597 *r8a66597)
|
||||
int i = 0;
|
||||
|
||||
if (r8a66597->pdata->on_chip) {
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_enable(r8a66597->clk);
|
||||
#endif
|
||||
do {
|
||||
r8a66597_write(r8a66597, SCKE, SYSCFG0);
|
||||
tmp = r8a66597_read(r8a66597, SYSCFG0);
|
||||
@ -141,9 +139,7 @@ static void r8a66597_clock_disable(struct r8a66597 *r8a66597)
|
||||
udelay(1);
|
||||
|
||||
if (r8a66597->pdata->on_chip) {
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
clk_disable(r8a66597->clk);
|
||||
#endif
|
||||
} else {
|
||||
r8a66597_bclr(r8a66597, PLLC, SYSCFG0);
|
||||
r8a66597_bclr(r8a66597, XCKE, SYSCFG0);
|
||||
@ -2406,19 +2402,15 @@ static int __devexit r8a66597_remove(struct platform_device *pdev)
|
||||
del_timer_sync(&r8a66597->rh_timer);
|
||||
usb_remove_hcd(hcd);
|
||||
iounmap(r8a66597->reg);
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (r8a66597->pdata->on_chip)
|
||||
clk_put(r8a66597->clk);
|
||||
#endif
|
||||
usb_put_hcd(hcd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __devinit r8a66597_probe(struct platform_device *pdev)
|
||||
{
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
char clk_name[8];
|
||||
#endif
|
||||
struct resource *res = NULL, *ires;
|
||||
int irq = -1;
|
||||
void __iomem *reg = NULL;
|
||||
@ -2482,7 +2474,6 @@ static int __devinit r8a66597_probe(struct platform_device *pdev)
|
||||
r8a66597->irq_sense_low = irq_trigger == IRQF_TRIGGER_LOW;
|
||||
|
||||
if (r8a66597->pdata->on_chip) {
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
snprintf(clk_name, sizeof(clk_name), "usb%d", pdev->id);
|
||||
r8a66597->clk = clk_get(&pdev->dev, clk_name);
|
||||
if (IS_ERR(r8a66597->clk)) {
|
||||
@ -2491,7 +2482,6 @@ static int __devinit r8a66597_probe(struct platform_device *pdev)
|
||||
ret = PTR_ERR(r8a66597->clk);
|
||||
goto clean_up2;
|
||||
}
|
||||
#endif
|
||||
r8a66597->max_root_hub = 1;
|
||||
} else
|
||||
r8a66597->max_root_hub = 2;
|
||||
@ -2531,11 +2521,9 @@ static int __devinit r8a66597_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
clean_up3:
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
if (r8a66597->pdata->on_chip)
|
||||
clk_put(r8a66597->clk);
|
||||
clean_up2:
|
||||
#endif
|
||||
usb_put_hcd(hcd);
|
||||
|
||||
clean_up:
|
||||
|
@ -26,10 +26,7 @@
|
||||
#ifndef __R8A66597_H__
|
||||
#define __R8A66597_H__
|
||||
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
#include <linux/clk.h>
|
||||
#endif
|
||||
|
||||
#include <linux/usb/r8a66597.h>
|
||||
|
||||
#define R8A66597_MAX_NUM_PIPE 10
|
||||
@ -113,9 +110,7 @@ struct r8a66597_root_hub {
|
||||
struct r8a66597 {
|
||||
spinlock_t lock;
|
||||
void __iomem *reg;
|
||||
#ifdef CONFIG_HAVE_CLK
|
||||
struct clk *clk;
|
||||
#endif
|
||||
struct r8a66597_platdata *pdata;
|
||||
struct r8a66597_device device0;
|
||||
struct r8a66597_root_hub root_hub[R8A66597_MAX_ROOT_HUB];
|
||||
|
@ -81,14 +81,6 @@ struct musb_ep;
|
||||
#define is_peripheral_active(m) (!(m)->is_host)
|
||||
#define is_host_active(m) ((m)->is_host)
|
||||
|
||||
#ifndef CONFIG_HAVE_CLK
|
||||
/* Dummy stub for clk framework */
|
||||
#define clk_get(dev, id) NULL
|
||||
#define clk_put(clock) do {} while (0)
|
||||
#define clk_enable(clock) do {} while (0)
|
||||
#define clk_disable(clock) do {} while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
#include <linux/fs.h>
|
||||
#define MUSB_CONFIG_PROC_FS
|
||||
|
@ -127,7 +127,8 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev)
|
||||
struct atmel_pwm_bl *pwmbl;
|
||||
int retval;
|
||||
|
||||
pwmbl = kzalloc(sizeof(struct atmel_pwm_bl), GFP_KERNEL);
|
||||
pwmbl = devm_kzalloc(&pdev->dev, sizeof(struct atmel_pwm_bl),
|
||||
GFP_KERNEL);
|
||||
if (!pwmbl)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -154,7 +155,8 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev)
|
||||
goto err_free_mem;
|
||||
|
||||
if (pwmbl->gpio_on != -1) {
|
||||
retval = gpio_request(pwmbl->gpio_on, "gpio_atmel_pwm_bl");
|
||||
retval = devm_gpio_request(&pdev->dev, pwmbl->gpio_on,
|
||||
"gpio_atmel_pwm_bl");
|
||||
if (retval) {
|
||||
pwmbl->gpio_on = -1;
|
||||
goto err_free_pwm;
|
||||
@ -164,7 +166,7 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev)
|
||||
retval = gpio_direction_output(pwmbl->gpio_on,
|
||||
0 ^ pdata->on_active_low);
|
||||
if (retval)
|
||||
goto err_free_gpio;
|
||||
goto err_free_pwm;
|
||||
}
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
@ -174,7 +176,7 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev)
|
||||
&atmel_pwm_bl_ops, &props);
|
||||
if (IS_ERR(bldev)) {
|
||||
retval = PTR_ERR(bldev);
|
||||
goto err_free_gpio;
|
||||
goto err_free_pwm;
|
||||
}
|
||||
|
||||
pwmbl->bldev = bldev;
|
||||
@ -196,13 +198,9 @@ static int atmel_pwm_bl_probe(struct platform_device *pdev)
|
||||
err_free_bl_dev:
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
backlight_device_unregister(bldev);
|
||||
err_free_gpio:
|
||||
if (pwmbl->gpio_on != -1)
|
||||
gpio_free(pwmbl->gpio_on);
|
||||
err_free_pwm:
|
||||
pwm_channel_free(&pwmbl->pwmc);
|
||||
err_free_mem:
|
||||
kfree(pwmbl);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@ -210,15 +208,12 @@ static int __exit atmel_pwm_bl_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct atmel_pwm_bl *pwmbl = platform_get_drvdata(pdev);
|
||||
|
||||
if (pwmbl->gpio_on != -1) {
|
||||
if (pwmbl->gpio_on != -1)
|
||||
gpio_set_value(pwmbl->gpio_on, 0);
|
||||
gpio_free(pwmbl->gpio_on);
|
||||
}
|
||||
pwm_channel_disable(&pwmbl->pwmc);
|
||||
pwm_channel_free(&pwmbl->pwmc);
|
||||
backlight_device_unregister(pwmbl->bldev);
|
||||
platform_set_drvdata(pdev, NULL);
|
||||
kfree(pwmbl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -492,7 +492,8 @@ static int setup_gpio_backlight(struct corgi_lcd *lcd,
|
||||
lcd->gpio_backlight_cont = -1;
|
||||
|
||||
if (gpio_is_valid(pdata->gpio_backlight_on)) {
|
||||
err = gpio_request(pdata->gpio_backlight_on, "BL_ON");
|
||||
err = devm_gpio_request(&spi->dev, pdata->gpio_backlight_on,
|
||||
"BL_ON");
|
||||
if (err) {
|
||||
dev_err(&spi->dev, "failed to request GPIO%d for "
|
||||
"backlight_on\n", pdata->gpio_backlight_on);
|
||||
@ -504,11 +505,12 @@ static int setup_gpio_backlight(struct corgi_lcd *lcd,
|
||||
}
|
||||
|
||||
if (gpio_is_valid(pdata->gpio_backlight_cont)) {
|
||||
err = gpio_request(pdata->gpio_backlight_cont, "BL_CONT");
|
||||
err = devm_gpio_request(&spi->dev, pdata->gpio_backlight_cont,
|
||||
"BL_CONT");
|
||||
if (err) {
|
||||
dev_err(&spi->dev, "failed to request GPIO%d for "
|
||||
"backlight_cont\n", pdata->gpio_backlight_cont);
|
||||
goto err_free_backlight_on;
|
||||
return err;
|
||||
}
|
||||
|
||||
lcd->gpio_backlight_cont = pdata->gpio_backlight_cont;
|
||||
@ -525,11 +527,6 @@ static int setup_gpio_backlight(struct corgi_lcd *lcd,
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
err_free_backlight_on:
|
||||
if (gpio_is_valid(lcd->gpio_backlight_on))
|
||||
gpio_free(lcd->gpio_backlight_on);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int __devinit corgi_lcd_probe(struct spi_device *spi)
|
||||
@ -602,12 +599,6 @@ static int __devexit corgi_lcd_remove(struct spi_device *spi)
|
||||
backlight_update_status(lcd->bl_dev);
|
||||
backlight_device_unregister(lcd->bl_dev);
|
||||
|
||||
if (gpio_is_valid(lcd->gpio_backlight_on))
|
||||
gpio_free(lcd->gpio_backlight_on);
|
||||
|
||||
if (gpio_is_valid(lcd->gpio_backlight_cont))
|
||||
gpio_free(lcd->gpio_backlight_cont);
|
||||
|
||||
corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN);
|
||||
lcd_device_unregister(lcd->lcd_dev);
|
||||
|
||||
|
@ -175,28 +175,27 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi)
|
||||
|
||||
priv->spi = spi;
|
||||
|
||||
ret = gpio_request_one(pdata->reset_gpio, GPIOF_OUT_INIT_HIGH,
|
||||
"lcd l4f00242t03 reset");
|
||||
ret = devm_gpio_request_one(&spi->dev, pdata->reset_gpio,
|
||||
GPIOF_OUT_INIT_HIGH, "lcd l4f00242t03 reset");
|
||||
if (ret) {
|
||||
dev_err(&spi->dev,
|
||||
"Unable to get the lcd l4f00242t03 reset gpio.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = gpio_request_one(pdata->data_enable_gpio, GPIOF_OUT_INIT_LOW,
|
||||
"lcd l4f00242t03 data enable");
|
||||
ret = devm_gpio_request_one(&spi->dev, pdata->data_enable_gpio,
|
||||
GPIOF_OUT_INIT_LOW, "lcd l4f00242t03 data enable");
|
||||
if (ret) {
|
||||
dev_err(&spi->dev,
|
||||
"Unable to get the lcd l4f00242t03 data en gpio.\n");
|
||||
goto err;
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv->io_reg = regulator_get(&spi->dev, "vdd");
|
||||
if (IS_ERR(priv->io_reg)) {
|
||||
ret = PTR_ERR(priv->io_reg);
|
||||
dev_err(&spi->dev, "%s: Unable to get the IO regulator\n",
|
||||
__func__);
|
||||
goto err2;
|
||||
return PTR_ERR(priv->io_reg);
|
||||
}
|
||||
|
||||
priv->core_reg = regulator_get(&spi->dev, "vcore");
|
||||
@ -204,14 +203,14 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi)
|
||||
ret = PTR_ERR(priv->core_reg);
|
||||
dev_err(&spi->dev, "%s: Unable to get the core regulator\n",
|
||||
__func__);
|
||||
goto err3;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
priv->ld = lcd_device_register("l4f00242t03",
|
||||
&spi->dev, priv, &l4f_ops);
|
||||
if (IS_ERR(priv->ld)) {
|
||||
ret = PTR_ERR(priv->ld);
|
||||
goto err4;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
/* Init the LCD */
|
||||
@ -223,14 +222,10 @@ static int __devinit l4f00242t03_probe(struct spi_device *spi)
|
||||
|
||||
return 0;
|
||||
|
||||
err4:
|
||||
regulator_put(priv->core_reg);
|
||||
err3:
|
||||
regulator_put(priv->io_reg);
|
||||
err2:
|
||||
gpio_free(pdata->data_enable_gpio);
|
||||
err:
|
||||
gpio_free(pdata->reset_gpio);
|
||||
regulator_put(priv->core_reg);
|
||||
err1:
|
||||
regulator_put(priv->io_reg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -238,16 +233,12 @@ err:
|
||||
static int __devexit l4f00242t03_remove(struct spi_device *spi)
|
||||
{
|
||||
struct l4f00242t03_priv *priv = dev_get_drvdata(&spi->dev);
|
||||
struct l4f00242t03_pdata *pdata = priv->spi->dev.platform_data;
|
||||
|
||||
l4f00242t03_lcd_power_set(priv->ld, FB_BLANK_POWERDOWN);
|
||||
lcd_device_unregister(priv->ld);
|
||||
|
||||
dev_set_drvdata(&spi->dev, NULL);
|
||||
|
||||
gpio_free(pdata->data_enable_gpio);
|
||||
gpio_free(pdata->reset_gpio);
|
||||
|
||||
regulator_put(priv->io_reg);
|
||||
regulator_put(priv->core_reg);
|
||||
|
||||
|
@ -295,7 +295,7 @@ static int __devinit lm3533_bl_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
bl = kzalloc(sizeof(*bl), GFP_KERNEL);
|
||||
bl = devm_kzalloc(&pdev->dev, sizeof(*bl), GFP_KERNEL);
|
||||
if (!bl) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to allocate memory for backlight\n");
|
||||
@ -317,8 +317,7 @@ static int __devinit lm3533_bl_probe(struct platform_device *pdev)
|
||||
&lm3533_bl_ops, &props);
|
||||
if (IS_ERR(bd)) {
|
||||
dev_err(&pdev->dev, "failed to register backlight device\n");
|
||||
ret = PTR_ERR(bd);
|
||||
goto err_free;
|
||||
return PTR_ERR(bd);
|
||||
}
|
||||
|
||||
bl->bd = bd;
|
||||
@ -348,8 +347,6 @@ err_sysfs_remove:
|
||||
sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group);
|
||||
err_unregister:
|
||||
backlight_device_unregister(bd);
|
||||
err_free:
|
||||
kfree(bl);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@ -367,7 +364,6 @@ static int __devexit lm3533_bl_remove(struct platform_device *pdev)
|
||||
lm3533_ctrlbank_disable(&bl->cb);
|
||||
sysfs_remove_group(&bd->dev.kobj, &lm3533_bl_attribute_group);
|
||||
backlight_device_unregister(bd);
|
||||
kfree(bl);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -158,29 +158,27 @@ static int __devinit lms283gf05_probe(struct spi_device *spi)
|
||||
int ret = 0;
|
||||
|
||||
if (pdata != NULL) {
|
||||
ret = gpio_request(pdata->reset_gpio, "LMS285GF05 RESET");
|
||||
ret = devm_gpio_request(&spi->dev, pdata->reset_gpio,
|
||||
"LMS285GF05 RESET");
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = gpio_direction_output(pdata->reset_gpio,
|
||||
!pdata->reset_inverted);
|
||||
if (ret)
|
||||
goto err;
|
||||
return ret;
|
||||
}
|
||||
|
||||
st = devm_kzalloc(&spi->dev, sizeof(struct lms283gf05_state),
|
||||
GFP_KERNEL);
|
||||
if (st == NULL) {
|
||||
dev_err(&spi->dev, "No memory for device state\n");
|
||||
ret = -ENOMEM;
|
||||
goto err;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ld = lcd_device_register("lms283gf05", &spi->dev, st, &lms_ops);
|
||||
if (IS_ERR(ld)) {
|
||||
ret = PTR_ERR(ld);
|
||||
goto err;
|
||||
}
|
||||
if (IS_ERR(ld))
|
||||
return PTR_ERR(ld);
|
||||
|
||||
st->spi = spi;
|
||||
st->ld = ld;
|
||||
@ -193,24 +191,14 @@ static int __devinit lms283gf05_probe(struct spi_device *spi)
|
||||
lms283gf05_toggle(spi, disp_initseq, ARRAY_SIZE(disp_initseq));
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (pdata != NULL)
|
||||
gpio_free(pdata->reset_gpio);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __devexit lms283gf05_remove(struct spi_device *spi)
|
||||
{
|
||||
struct lms283gf05_state *st = dev_get_drvdata(&spi->dev);
|
||||
struct lms283gf05_pdata *pdata = st->spi->dev.platform_data;
|
||||
|
||||
lcd_device_unregister(st->ld);
|
||||
|
||||
if (pdata != NULL)
|
||||
gpio_free(pdata->reset_gpio);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -14,11 +14,15 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/lp855x.h>
|
||||
#include <linux/platform_data/lp855x.h>
|
||||
|
||||
/* Registers */
|
||||
#define BRIGHTNESS_CTRL (0x00)
|
||||
#define DEVICE_CTRL (0x01)
|
||||
#define BRIGHTNESS_CTRL 0x00
|
||||
#define DEVICE_CTRL 0x01
|
||||
#define EEPROM_START 0xA0
|
||||
#define EEPROM_END 0xA7
|
||||
#define EPROM_START 0xA0
|
||||
#define EPROM_END 0xAF
|
||||
|
||||
#define BUF_SIZE 20
|
||||
#define DEFAULT_BL_NAME "lcd-backlight"
|
||||
|
@ -84,7 +84,8 @@ static int ot200_backlight_probe(struct platform_device *pdev)
|
||||
int retval = 0;
|
||||
|
||||
/* request gpio */
|
||||
if (gpio_request(GPIO_DIMM, "ot200 backlight dimmer") < 0) {
|
||||
if (devm_gpio_request(&pdev->dev, GPIO_DIMM,
|
||||
"ot200 backlight dimmer") < 0) {
|
||||
dev_err(&pdev->dev, "failed to request GPIO %d\n", GPIO_DIMM);
|
||||
return -ENODEV;
|
||||
}
|
||||
@ -93,14 +94,13 @@ static int ot200_backlight_probe(struct platform_device *pdev)
|
||||
pwm_timer = cs5535_mfgpt_alloc_timer(7, MFGPT_DOMAIN_ANY);
|
||||
if (!pwm_timer) {
|
||||
dev_err(&pdev->dev, "MFGPT 7 not available\n");
|
||||
retval = -ENODEV;
|
||||
goto error_mfgpt_alloc;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||
data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
retval = -ENOMEM;
|
||||
goto error_kzalloc;
|
||||
goto error_devm_kzalloc;
|
||||
}
|
||||
|
||||
/* setup gpio */
|
||||
@ -122,26 +122,21 @@ static int ot200_backlight_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(bl)) {
|
||||
dev_err(&pdev->dev, "failed to register backlight\n");
|
||||
retval = PTR_ERR(bl);
|
||||
goto error_backlight_device_register;
|
||||
goto error_devm_kzalloc;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, bl);
|
||||
|
||||
return 0;
|
||||
|
||||
error_backlight_device_register:
|
||||
kfree(data);
|
||||
error_kzalloc:
|
||||
error_devm_kzalloc:
|
||||
cs5535_mfgpt_free_timer(pwm_timer);
|
||||
error_mfgpt_alloc:
|
||||
gpio_free(GPIO_DIMM);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int ot200_backlight_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct backlight_device *bl = platform_get_drvdata(pdev);
|
||||
struct ot200_backlight_data *data = bl_get_data(bl);
|
||||
|
||||
backlight_device_unregister(bl);
|
||||
|
||||
@ -152,9 +147,7 @@ static int ot200_backlight_remove(struct platform_device *pdev)
|
||||
MAX_COMP2 - dim_table[100]);
|
||||
|
||||
cs5535_mfgpt_free_timer(pwm_timer);
|
||||
gpio_free(GPIO_DIMM);
|
||||
|
||||
kfree(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -92,14 +92,14 @@ static int __devinit tosa_bl_probe(struct i2c_client *client,
|
||||
|
||||
data->comadj = sharpsl_param.comadj == -1 ? COMADJ_DEFAULT : sharpsl_param.comadj;
|
||||
|
||||
ret = gpio_request(TOSA_GPIO_BL_C20MA, "backlight");
|
||||
ret = devm_gpio_request(&client->dev, TOSA_GPIO_BL_C20MA, "backlight");
|
||||
if (ret) {
|
||||
dev_dbg(&data->bl->dev, "Unable to request gpio!\n");
|
||||
return ret;
|
||||
}
|
||||
ret = gpio_direction_output(TOSA_GPIO_BL_C20MA, 0);
|
||||
if (ret)
|
||||
goto err_gpio_dir;
|
||||
return ret;
|
||||
|
||||
i2c_set_clientdata(client, data);
|
||||
data->i2c = client;
|
||||
@ -123,8 +123,6 @@ static int __devinit tosa_bl_probe(struct i2c_client *client,
|
||||
|
||||
err_reg:
|
||||
data->bl = NULL;
|
||||
err_gpio_dir:
|
||||
gpio_free(TOSA_GPIO_BL_C20MA);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -135,8 +133,6 @@ static int __devexit tosa_bl_remove(struct i2c_client *client)
|
||||
backlight_device_unregister(data->bl);
|
||||
data->bl = NULL;
|
||||
|
||||
gpio_free(TOSA_GPIO_BL_C20MA);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -193,7 +193,7 @@ static int __devinit tosa_lcd_probe(struct spi_device *spi)
|
||||
data->spi = spi;
|
||||
dev_set_drvdata(&spi->dev, data);
|
||||
|
||||
ret = gpio_request(TOSA_GPIO_TG_ON, "tg #pwr");
|
||||
ret = devm_gpio_request(&spi->dev, TOSA_GPIO_TG_ON, "tg #pwr");
|
||||
if (ret < 0)
|
||||
goto err_gpio_tg;
|
||||
|
||||
@ -201,7 +201,7 @@ static int __devinit tosa_lcd_probe(struct spi_device *spi)
|
||||
|
||||
ret = gpio_direction_output(TOSA_GPIO_TG_ON, 0);
|
||||
if (ret < 0)
|
||||
goto err_gpio_dir;
|
||||
goto err_gpio_tg;
|
||||
|
||||
mdelay(60);
|
||||
tosa_lcd_tg_init(data);
|
||||
@ -221,8 +221,6 @@ static int __devinit tosa_lcd_probe(struct spi_device *spi)
|
||||
|
||||
err_register:
|
||||
tosa_lcd_tg_off(data);
|
||||
err_gpio_dir:
|
||||
gpio_free(TOSA_GPIO_TG_ON);
|
||||
err_gpio_tg:
|
||||
dev_set_drvdata(&spi->dev, NULL);
|
||||
return ret;
|
||||
@ -239,7 +237,6 @@ static int __devexit tosa_lcd_remove(struct spi_device *spi)
|
||||
|
||||
tosa_lcd_tg_off(data);
|
||||
|
||||
gpio_free(TOSA_GPIO_TG_ON);
|
||||
dev_set_drvdata(&spi->dev, NULL);
|
||||
|
||||
return 0;
|
||||
|
@ -10,30 +10,6 @@
|
||||
#include <linux/slab.h>
|
||||
#include "affs.h"
|
||||
|
||||
/* This is, of course, shamelessly stolen from fs/minix */
|
||||
|
||||
static const int nibblemap[] = { 0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4 };
|
||||
|
||||
static u32
|
||||
affs_count_free_bits(u32 blocksize, const void *data)
|
||||
{
|
||||
const u32 *map;
|
||||
u32 free;
|
||||
u32 tmp;
|
||||
|
||||
map = data;
|
||||
free = 0;
|
||||
for (blocksize /= 4; blocksize > 0; blocksize--) {
|
||||
tmp = *map++;
|
||||
while (tmp) {
|
||||
free += nibblemap[tmp & 0xf];
|
||||
tmp >>= 4;
|
||||
}
|
||||
}
|
||||
|
||||
return free;
|
||||
}
|
||||
|
||||
u32
|
||||
affs_count_free_blocks(struct super_block *sb)
|
||||
{
|
||||
@ -317,7 +293,7 @@ int affs_init_bitmap(struct super_block *sb, int *flags)
|
||||
goto out;
|
||||
}
|
||||
pr_debug("AFFS: read bitmap block %d: %d\n", blk, bm->bm_key);
|
||||
bm->bm_free = affs_count_free_bits(sb->s_blocksize - 4, bh->b_data + 4);
|
||||
bm->bm_free = memweight(bh->b_data + 4, sb->s_blocksize - 4);
|
||||
|
||||
/* Don't try read the extension if this is the last block,
|
||||
* but we also need the right bm pointer below
|
||||
@ -367,7 +343,7 @@ int affs_init_bitmap(struct super_block *sb, int *flags)
|
||||
|
||||
/* recalculate bitmap count for last block */
|
||||
bm--;
|
||||
bm->bm_free = affs_count_free_bits(sb->s_blocksize - 4, bh->b_data + 4);
|
||||
bm->bm_free = memweight(bh->b_data + 4, sb->s_blocksize - 4);
|
||||
|
||||
out:
|
||||
affs_brelse(bh);
|
||||
|
@ -3342,10 +3342,22 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size);
|
||||
/* super.c */
|
||||
int btrfs_parse_options(struct btrfs_root *root, char *options);
|
||||
int btrfs_sync_fs(struct super_block *sb, int wait);
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
__printf(2, 3)
|
||||
void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...);
|
||||
#else
|
||||
static inline __printf(2, 3)
|
||||
void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
__printf(5, 6)
|
||||
void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
|
||||
unsigned int line, int errno, const char *fmt, ...);
|
||||
|
||||
|
||||
void __btrfs_abort_transaction(struct btrfs_trans_handle *trans,
|
||||
struct btrfs_root *root, const char *function,
|
||||
unsigned int line, int errno);
|
||||
@ -3386,6 +3398,7 @@ do { \
|
||||
(errno), fmt, ##args); \
|
||||
} while (0)
|
||||
|
||||
__printf(5, 6)
|
||||
void __btrfs_panic(struct btrfs_fs_info *fs_info, const char *function,
|
||||
unsigned int line, int errno, const char *fmt, ...);
|
||||
|
||||
|
@ -1114,7 +1114,7 @@ void clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root,
|
||||
spin_unlock(&root->fs_info->delalloc_lock);
|
||||
btrfs_panic(root->fs_info, -EOVERFLOW,
|
||||
"Can't clear %lu bytes from "
|
||||
" dirty_mdatadata_bytes (%lu)",
|
||||
" dirty_mdatadata_bytes (%llu)",
|
||||
buf->len,
|
||||
root->fs_info->dirty_metadata_bytes);
|
||||
}
|
||||
|
@ -1241,7 +1241,7 @@ static int __must_check __add_reloc_root(struct btrfs_root *root)
|
||||
if (rb_node) {
|
||||
btrfs_panic(root->fs_info, -EEXIST, "Duplicate root found "
|
||||
"for start=%llu while inserting into relocation "
|
||||
"tree\n");
|
||||
"tree\n", node->bytenr);
|
||||
kfree(node);
|
||||
return -EEXIST;
|
||||
}
|
||||
|
@ -125,6 +125,7 @@ static void btrfs_handle_error(struct btrfs_fs_info *fs_info)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PRINTK
|
||||
/*
|
||||
* __btrfs_std_error decodes expected errors from the caller and
|
||||
* invokes the approciate error response.
|
||||
@ -167,7 +168,7 @@ void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
const char *logtypes[] = {
|
||||
static const char * const logtypes[] = {
|
||||
"emergency",
|
||||
"alert",
|
||||
"critical",
|
||||
@ -185,22 +186,50 @@ void btrfs_printk(struct btrfs_fs_info *fs_info, const char *fmt, ...)
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
const char *type = logtypes[4];
|
||||
int kern_level;
|
||||
|
||||
va_start(args, fmt);
|
||||
|
||||
if (fmt[0] == '<' && isdigit(fmt[1]) && fmt[2] == '>') {
|
||||
memcpy(lvl, fmt, 3);
|
||||
lvl[3] = '\0';
|
||||
fmt += 3;
|
||||
type = logtypes[fmt[1] - '0'];
|
||||
kern_level = printk_get_level(fmt);
|
||||
if (kern_level) {
|
||||
size_t size = printk_skip_level(fmt) - fmt;
|
||||
memcpy(lvl, fmt, size);
|
||||
lvl[size] = '\0';
|
||||
fmt += size;
|
||||
type = logtypes[kern_level - '0'];
|
||||
} else
|
||||
*lvl = '\0';
|
||||
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
printk("%sBTRFS %s (device %s): %pV", lvl, type, sb->s_id, &vaf);
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void __btrfs_std_error(struct btrfs_fs_info *fs_info, const char *function,
|
||||
unsigned int line, int errno, const char *fmt, ...)
|
||||
{
|
||||
struct super_block *sb = fs_info->sb;
|
||||
|
||||
/*
|
||||
* Special case: if the error is EROFS, and we're already
|
||||
* under MS_RDONLY, then it is safe here.
|
||||
*/
|
||||
if (errno == -EROFS && (sb->s_flags & MS_RDONLY))
|
||||
return;
|
||||
|
||||
/* Don't go through full error handling during mount */
|
||||
if (sb->s_flags & MS_BORN) {
|
||||
save_error_info(fs_info);
|
||||
btrfs_handle_error(fs_info);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We only mark the transaction aborted and then set the file system read-only.
|
||||
* This will prevent new transactions from starting or trying to join this
|
||||
|
@ -919,7 +919,7 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
|
||||
* own time */
|
||||
path.mnt = cache->mnt;
|
||||
path.dentry = object->backer;
|
||||
file = dentry_open(&path, O_RDWR, cache->cache_cred);
|
||||
file = dentry_open(&path, O_RDWR | O_LARGEFILE, cache->cache_cred);
|
||||
if (IS_ERR(file)) {
|
||||
ret = PTR_ERR(file);
|
||||
} else {
|
||||
|
42
fs/exec.c
42
fs/exec.c
@ -2002,17 +2002,17 @@ static void coredump_finish(struct mm_struct *mm)
|
||||
void set_dumpable(struct mm_struct *mm, int value)
|
||||
{
|
||||
switch (value) {
|
||||
case 0:
|
||||
case SUID_DUMPABLE_DISABLED:
|
||||
clear_bit(MMF_DUMPABLE, &mm->flags);
|
||||
smp_wmb();
|
||||
clear_bit(MMF_DUMP_SECURELY, &mm->flags);
|
||||
break;
|
||||
case 1:
|
||||
case SUID_DUMPABLE_ENABLED:
|
||||
set_bit(MMF_DUMPABLE, &mm->flags);
|
||||
smp_wmb();
|
||||
clear_bit(MMF_DUMP_SECURELY, &mm->flags);
|
||||
break;
|
||||
case 2:
|
||||
case SUID_DUMPABLE_SAFE:
|
||||
set_bit(MMF_DUMP_SECURELY, &mm->flags);
|
||||
smp_wmb();
|
||||
set_bit(MMF_DUMPABLE, &mm->flags);
|
||||
@ -2025,7 +2025,7 @@ static int __get_dumpable(unsigned long mm_flags)
|
||||
int ret;
|
||||
|
||||
ret = mm_flags & MMF_DUMPABLE_MASK;
|
||||
return (ret >= 2) ? 2 : ret;
|
||||
return (ret > SUID_DUMPABLE_ENABLED) ? SUID_DUMPABLE_SAFE : ret;
|
||||
}
|
||||
|
||||
int get_dumpable(struct mm_struct *mm)
|
||||
@ -2111,6 +2111,7 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||
int retval = 0;
|
||||
int flag = 0;
|
||||
int ispipe;
|
||||
bool need_nonrelative = false;
|
||||
static atomic_t core_dump_count = ATOMIC_INIT(0);
|
||||
struct coredump_params cprm = {
|
||||
.signr = signr,
|
||||
@ -2136,14 +2137,16 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||
if (!cred)
|
||||
goto fail;
|
||||
/*
|
||||
* We cannot trust fsuid as being the "true" uid of the
|
||||
* process nor do we know its entire history. We only know it
|
||||
* was tainted so we dump it as root in mode 2.
|
||||
* We cannot trust fsuid as being the "true" uid of the process
|
||||
* nor do we know its entire history. We only know it was tainted
|
||||
* so we dump it as root in mode 2, and only into a controlled
|
||||
* environment (pipe handler or fully qualified path).
|
||||
*/
|
||||
if (__get_dumpable(cprm.mm_flags) == 2) {
|
||||
if (__get_dumpable(cprm.mm_flags) == SUID_DUMPABLE_SAFE) {
|
||||
/* Setuid core dump mode */
|
||||
flag = O_EXCL; /* Stop rewrite attacks */
|
||||
cred->fsuid = GLOBAL_ROOT_UID; /* Dump root private */
|
||||
need_nonrelative = true;
|
||||
}
|
||||
|
||||
retval = coredump_wait(exit_code, &core_state);
|
||||
@ -2171,15 +2174,16 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||
}
|
||||
|
||||
if (cprm.limit == 1) {
|
||||
/*
|
||||
/* See umh_pipe_setup() which sets RLIMIT_CORE = 1.
|
||||
*
|
||||
* Normally core limits are irrelevant to pipes, since
|
||||
* we're not writing to the file system, but we use
|
||||
* cprm.limit of 1 here as a speacial value. Any
|
||||
* non-1 limit gets set to RLIM_INFINITY below, but
|
||||
* a limit of 0 skips the dump. This is a consistent
|
||||
* way to catch recursive crashes. We can still crash
|
||||
* if the core_pattern binary sets RLIM_CORE = !1
|
||||
* but it runs as root, and can do lots of stupid things
|
||||
* cprm.limit of 1 here as a speacial value, this is a
|
||||
* consistent way to catch recursive crashes.
|
||||
* We can still crash if the core_pattern binary sets
|
||||
* RLIM_CORE = !1, but it runs as root, and can do
|
||||
* lots of stupid things.
|
||||
*
|
||||
* Note that we use task_tgid_vnr here to grab the pid
|
||||
* of the process group leader. That way we get the
|
||||
* right pid if a thread in a multi-threaded
|
||||
@ -2223,6 +2227,14 @@ void do_coredump(long signr, int exit_code, struct pt_regs *regs)
|
||||
if (cprm.limit < binfmt->min_coredump)
|
||||
goto fail_unlock;
|
||||
|
||||
if (need_nonrelative && cn.corename[0] != '/') {
|
||||
printk(KERN_WARNING "Pid %d(%s) can only dump core "\
|
||||
"to fully qualified path!\n",
|
||||
task_tgid_vnr(current), current->comm);
|
||||
printk(KERN_WARNING "Skipping core dump\n");
|
||||
goto fail_unlock;
|
||||
}
|
||||
|
||||
cprm.file = filp_open(cn.corename,
|
||||
O_CREAT | 2 | O_NOFOLLOW | O_LARGEFILE | flag,
|
||||
0600);
|
||||
|
@ -1444,19 +1444,9 @@ ext2_fsblk_t ext2_new_block(struct inode *inode, unsigned long goal, int *errp)
|
||||
|
||||
#ifdef EXT2FS_DEBUG
|
||||
|
||||
static const int nibblemap[] = {4, 3, 3, 2, 3, 2, 2, 1, 3, 2, 2, 1, 2, 1, 1, 0};
|
||||
|
||||
unsigned long ext2_count_free (struct buffer_head * map, unsigned int numchars)
|
||||
unsigned long ext2_count_free(struct buffer_head *map, unsigned int numchars)
|
||||
{
|
||||
unsigned int i;
|
||||
unsigned long sum = 0;
|
||||
|
||||
if (!map)
|
||||
return (0);
|
||||
for (i = 0; i < numchars; i++)
|
||||
sum += nibblemap[map->b_data[i] & 0xf] +
|
||||
nibblemap[(map->b_data[i] >> 4) & 0xf];
|
||||
return (sum);
|
||||
return numchars * BITS_PER_BYTE - memweight(map->b_data, numchars);
|
||||
}
|
||||
|
||||
#endif /* EXT2FS_DEBUG */
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user