Merge branch 'akpm' (patches from Andrew Morton)
Merge first patch-bomb from Andrew Morton: "Quite a lot of other stuff is banked up awaiting further next->mainline merging, but this batch contains: - Lots of random misc patches - OCFS2 - Most of MM - backlight updates - lib/ updates - printk updates - checkpatch updates - epoll tweaking - rtc updates - hfs - hfsplus - documentation - procfs - update gcov to gcc-4.7 format - IPC" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (269 commits) ipc, msg: fix message length check for negative values ipc/util.c: remove unnecessary work pending test devpts: plug the memory leak in kill_sb ./Makefile: export initial ramdisk compression config option init/Kconfig: add option to disable kernel compression drivers: w1: make w1_slave::flags long to avoid memory corruption drivers/w1/masters/ds1wm.cuse dev_get_platdata() drivers/memstick/core/ms_block.c: fix unreachable state in h_msb_read_page() drivers/memstick/core/mspro_block.c: fix attributes array allocation drivers/pps/clients/pps-gpio.c: remove redundant of_match_ptr kernel/panic.c: reduce 1 byte usage for print tainted buffer gcov: reuse kbasename helper kernel/gcov/fs.c: use pr_warn() kernel/module.c: use pr_foo() gcov: compile specific gcov implementation based on gcc version gcov: add support for gcc 4.7 gcov format gcov: move gcov structs definitions to a gcc version specific file kernel/taskstats.c: return -ENOMEM when alloc memory fails in add_del_listener() kernel/taskstats.c: add nla_nest_cancel() for failure processing between nla_nest_start() and nla_nest_end() kernel/sysctl_binary.c: use scnprintf() instead of snprintf() ...
This commit is contained in:
Коммит
5cbb3d216e
7
CREDITS
7
CREDITS
|
@ -2576,7 +2576,7 @@ S: Toronto, Ontario
|
|||
S: Canada
|
||||
|
||||
N: Zwane Mwaikambo
|
||||
E: zwane@arm.linux.org.uk
|
||||
E: zwanem@gmail.com
|
||||
D: Various driver hacking
|
||||
D: Lowlevel x86 kernel hacking
|
||||
D: General debugging
|
||||
|
@ -2895,6 +2895,11 @@ S: Framewood Road
|
|||
S: Wexham SL3 6PJ
|
||||
S: United Kingdom
|
||||
|
||||
N: Richard Purdie
|
||||
E: rpurdie@rpsys.net
|
||||
D: Backlight subsystem maintainer
|
||||
S: United Kingdom
|
||||
|
||||
N: Daniel Quinlan
|
||||
E: quinlan@pathname.com
|
||||
W: http://www.pathname.com/~quinlan/
|
||||
|
|
|
@ -72,3 +72,16 @@ kernel tree without going through the obsolete state first.
|
|||
|
||||
It's up to the developer to place their interfaces in the category they
|
||||
wish for it to start out in.
|
||||
|
||||
|
||||
Notable bits of non-ABI, which should not under any circumstances be considered
|
||||
stable:
|
||||
|
||||
- Kconfig. Userspace should not rely on the presence or absence of any
|
||||
particular Kconfig symbol, in /proc/config.gz, in the copy of .config
|
||||
commonly installed to /boot, or in any invocation of the kernel build
|
||||
process.
|
||||
|
||||
- Kernel-internal symbols. Do not rely on the presence, absence, location, or
|
||||
type of any kernel symbol, either in System.map files or the kernel binary
|
||||
itself. See Documentation/stable_api_nonsense.txt.
|
||||
|
|
|
@ -4,7 +4,8 @@ Kernel driver lp855x
|
|||
Backlight driver for LP855x ICs
|
||||
|
||||
Supported chips:
|
||||
Texas Instruments LP8550, LP8551, LP8552, LP8553, LP8556 and LP8557
|
||||
Texas Instruments LP8550, LP8551, LP8552, LP8553, LP8555, LP8556 and
|
||||
LP8557
|
||||
|
||||
Author: Milo(Woogyom) Kim <milo.kim@ti.com>
|
||||
|
||||
|
@ -24,7 +25,7 @@ Value : pwm based or register based
|
|||
|
||||
2) chip_id
|
||||
The lp855x chip id.
|
||||
Value : lp8550/lp8551/lp8552/lp8553/lp8556/lp8557
|
||||
Value : lp8550/lp8551/lp8552/lp8553/lp8555/lp8556/lp8557
|
||||
|
||||
Platform data for lp855x
|
||||
------------------------
|
||||
|
|
|
@ -573,15 +573,19 @@ an memcg since the pages are allowed to be allocated from any physical
|
|||
node. One of the use cases is evaluating application performance by
|
||||
combining this information with the application's CPU allocation.
|
||||
|
||||
We export "total", "file", "anon" and "unevictable" pages per-node for
|
||||
each memcg. The ouput format of memory.numa_stat is:
|
||||
Each memcg's numa_stat file includes "total", "file", "anon" and "unevictable"
|
||||
per-node page counts including "hierarchical_<counter>" which sums up all
|
||||
hierarchical children's values in addition to the memcg's own value.
|
||||
|
||||
The ouput format of memory.numa_stat is:
|
||||
|
||||
total=<total pages> N0=<node 0 pages> N1=<node 1 pages> ...
|
||||
file=<total file pages> N0=<node 0 pages> N1=<node 1 pages> ...
|
||||
anon=<total anon pages> N0=<node 0 pages> N1=<node 1 pages> ...
|
||||
unevictable=<total anon pages> N0=<node 0 pages> N1=<node 1 pages> ...
|
||||
hierarchical_<counter>=<counter pages> N0=<node 0 pages> N1=<node 1 pages> ...
|
||||
|
||||
And we have total = file + anon + unevictable.
|
||||
The "total" count is sum of file + anon + unevictable.
|
||||
|
||||
6. Hierarchy support
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Rusty Russell <rusty@rustcorp.com.au>
|
||||
Srivatsa Vaddagiri <vatsa@in.ibm.com>
|
||||
i386:
|
||||
Zwane Mwaikambo <zwane@arm.linux.org.uk>
|
||||
Zwane Mwaikambo <zwanem@gmail.com>
|
||||
ppc64:
|
||||
Nathan Lynch <nathanl@austin.ibm.com>
|
||||
Joel Schopp <jschopp@austin.ibm.com>
|
||||
|
|
|
@ -2,7 +2,7 @@ lp855x bindings
|
|||
|
||||
Required properties:
|
||||
- compatible: "ti,lp8550", "ti,lp8551", "ti,lp8552", "ti,lp8553",
|
||||
"ti,lp8556", "ti,lp8557"
|
||||
"ti,lp8555", "ti,lp8556", "ti,lp8557"
|
||||
- reg: I2C slave address (u8)
|
||||
- dev-ctrl: Value of DEVICE CONTROL register (u8). It depends on the device.
|
||||
|
||||
|
@ -15,6 +15,33 @@ Optional properties:
|
|||
|
||||
Example:
|
||||
|
||||
/* LP8555 */
|
||||
backlight@2c {
|
||||
compatible = "ti,lp8555";
|
||||
reg = <0x2c>;
|
||||
|
||||
dev-ctrl = /bits/ 8 <0x00>;
|
||||
pwm-period = <10000>;
|
||||
|
||||
/* 4V OV, 4 output LED0 string enabled */
|
||||
rom_14h {
|
||||
rom-addr = /bits/ 8 <0x14>;
|
||||
rom-val = /bits/ 8 <0xcf>;
|
||||
};
|
||||
|
||||
/* Heavy smoothing, 24ms ramp time step */
|
||||
rom_15h {
|
||||
rom-addr = /bits/ 8 <0x15>;
|
||||
rom-val = /bits/ 8 <0xc7>;
|
||||
};
|
||||
|
||||
/* 4 output LED1 string enabled */
|
||||
rom_19h {
|
||||
rom-addr = /bits/ 8 <0x19>;
|
||||
rom-val = /bits/ 8 <0x0f>;
|
||||
};
|
||||
};
|
||||
|
||||
/* LP8556 */
|
||||
backlight@2c {
|
||||
compatible = "ti,lp8556";
|
||||
|
|
|
@ -460,6 +460,7 @@ manner. The codes are the following:
|
|||
nl - non-linear mapping
|
||||
ar - architecture specific flag
|
||||
dd - do not include area into core dump
|
||||
sd - soft-dirty flag
|
||||
mm - mixed map area
|
||||
hg - huge page advise flag
|
||||
nh - no-huge page advise flag
|
||||
|
|
|
@ -307,7 +307,7 @@ the following:
|
|||
|
||||
<proceeding files...>
|
||||
<slot #3, id = 0x43, characters = "h is long">
|
||||
<slot #2, id = 0x02, characters = "xtension which">
|
||||
<slot #2, id = 0x02, characters = "xtension whic">
|
||||
<slot #1, id = 0x01, characters = "My Big File.E">
|
||||
<directory entry, name = "MYBIGFIL.EXT">
|
||||
|
||||
|
|
|
@ -50,6 +50,10 @@ Configure the kernel with:
|
|||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_GCOV_KERNEL=y
|
||||
|
||||
select the gcc's gcov format, default is autodetect based on gcc version:
|
||||
|
||||
CONFIG_GCOV_FORMAT_AUTODETECT=y
|
||||
|
||||
and to get coverage data for the entire kernel:
|
||||
|
||||
CONFIG_GCOV_PROFILE_ALL=y
|
||||
|
|
|
@ -1070,6 +1070,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
VIA, nVidia)
|
||||
verbose: show contents of HPET registers during setup
|
||||
|
||||
hpet_mmap= [X86, HPET_MMAP] Allow userspace to mmap HPET
|
||||
registers. Default set by CONFIG_HPET_MMAP_DEFAULT.
|
||||
|
||||
hugepages= [HW,X86-32,IA-64] HugeTLB pages to allocate at boot.
|
||||
hugepagesz= [HW,IA-64,PPC,X86-64] The size of the HugeTLB pages.
|
||||
On x86-64 and powerpc, this option can be specified
|
||||
|
@ -1775,6 +1778,9 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
that the amount of memory usable for all allocations
|
||||
is not too small.
|
||||
|
||||
movable_node [KNL,X86] Boot-time switch to enable the effects
|
||||
of CONFIG_MOVABLE_NODE=y. See mm/Kconfig for details.
|
||||
|
||||
MTD_Partition= [MTD]
|
||||
Format: <name>,<region-number>,<size>,<offset>
|
||||
|
||||
|
|
|
@ -290,13 +290,24 @@ Default value is "/sbin/hotplug".
|
|||
kptr_restrict:
|
||||
|
||||
This toggle indicates whether restrictions are placed on
|
||||
exposing kernel addresses via /proc and other interfaces. When
|
||||
kptr_restrict is set to (0), there are no restrictions. When
|
||||
kptr_restrict is set to (1), the default, kernel pointers
|
||||
printed using the %pK format specifier will be replaced with 0's
|
||||
unless the user has CAP_SYSLOG. When kptr_restrict is set to
|
||||
(2), kernel pointers printed using %pK will be replaced with 0's
|
||||
regardless of privileges.
|
||||
exposing kernel addresses via /proc and other interfaces.
|
||||
|
||||
When kptr_restrict is set to (0), the default, there are no restrictions.
|
||||
|
||||
When kptr_restrict is set to (1), kernel pointers printed using the %pK
|
||||
format specifier will be replaced with 0's unless the user has CAP_SYSLOG
|
||||
and effective user and group ids are equal to the real ids. This is
|
||||
because %pK checks are done at read() time rather than open() time, so
|
||||
if permissions are elevated between the open() and the read() (e.g via
|
||||
a setuid binary) then %pK will not leak kernel pointers to unprivileged
|
||||
users. Note, this is a temporary solution only. The correct long-term
|
||||
solution is to do the permission checks at open() time. Consider removing
|
||||
world read permissions from files that use %pK, and using dmesg_restrict
|
||||
to protect against uses of %pK in dmesg(8) if leaking kernel pointer
|
||||
values to unprivileged users is a concern.
|
||||
|
||||
When kptr_restrict is set to (2), kernel pointers printed using
|
||||
%pK will be replaced with 0's regardless of privileges.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
|
|
@ -119,8 +119,11 @@ other appears as 0 when read.
|
|||
|
||||
dirty_background_ratio
|
||||
|
||||
Contains, as a percentage of total system memory, the number of pages at which
|
||||
the background kernel flusher threads will start writing out dirty data.
|
||||
Contains, as a percentage of total available memory that contains free pages
|
||||
and reclaimable pages, the number of pages at which the background kernel
|
||||
flusher threads will start writing out dirty data.
|
||||
|
||||
The total avaiable memory is not equal to total system memory.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
@ -151,9 +154,11 @@ interval will be written out next time a flusher thread wakes up.
|
|||
|
||||
dirty_ratio
|
||||
|
||||
Contains, as a percentage of total system memory, the number of pages at which
|
||||
a process which is generating disk writes will itself start writing out dirty
|
||||
data.
|
||||
Contains, as a percentage of total available memory that contains free pages
|
||||
and reclaimable pages, the number of pages at which a process which is
|
||||
generating disk writes will itself start writing out dirty data.
|
||||
|
||||
The total avaiable memory is not equal to total system memory.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
|
|
@ -114,3 +114,8 @@ core kernel image or in modules.
|
|||
If the tracepoint has to be used in kernel modules, an
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL() or EXPORT_TRACEPOINT_SYMBOL() can be
|
||||
used to export the defined tracepoints.
|
||||
|
||||
Note: The convenience macro TRACE_EVENT provides an alternative way to
|
||||
define tracepoints. Check http://lwn.net/Articles/379903,
|
||||
http://lwn.net/Articles/381064 and http://lwn.net/Articles/383362
|
||||
for a series of articles with more details.
|
||||
|
|
|
@ -8,7 +8,7 @@ significant performance improvement if reads from the compressed cache are
|
|||
faster than reads from a swap device.
|
||||
|
||||
NOTE: Zswap is a new feature as of v3.11 and interacts heavily with memory
|
||||
reclaim. This interaction has not be fully explored on the large set of
|
||||
reclaim. This interaction has not been fully explored on the large set of
|
||||
potential configurations and workloads that exist. For this reason, zswap
|
||||
is a work in progress and should be considered experimental.
|
||||
|
||||
|
@ -23,7 +23,7 @@ Some potential benefits:
|
|||
drastically reducing life-shortening writes.
|
||||
|
||||
Zswap evicts pages from compressed cache on an LRU basis to the backing swap
|
||||
device when the compressed pool reaches it size limit. This requirement had
|
||||
device when the compressed pool reaches its size limit. This requirement had
|
||||
been identified in prior community discussions.
|
||||
|
||||
To enabled zswap, the "enabled" attribute must be set to 1 at boot time. e.g.
|
||||
|
@ -37,7 +37,7 @@ the backing swap device in the case that the compressed pool is full.
|
|||
|
||||
Zswap makes use of zbud for the managing the compressed memory pool. Each
|
||||
allocation in zbud is not directly accessible by address. Rather, a handle is
|
||||
return by the allocation routine and that handle must be mapped before being
|
||||
returned by the allocation routine and that handle must be mapped before being
|
||||
accessed. The compressed memory pool grows on demand and shrinks as compressed
|
||||
pages are freed. The pool is not preallocated.
|
||||
|
||||
|
@ -56,7 +56,7 @@ in the swap_map goes to 0) the swap code calls the zswap invalidate function,
|
|||
via frontswap, to free the compressed entry.
|
||||
|
||||
Zswap seeks to be simple in its policies. Sysfs attributes allow for one user
|
||||
controlled policies:
|
||||
controlled policy:
|
||||
* max_pool_percent - The maximum percentage of memory that the compressed
|
||||
pool can occupy.
|
||||
|
||||
|
|
|
@ -1661,7 +1661,6 @@ S: Maintained
|
|||
F: drivers/net/wireless/b43legacy/
|
||||
|
||||
BACKLIGHT CLASS/SUBSYSTEM
|
||||
M: Richard Purdie <rpurdie@rpsys.net>
|
||||
M: Jingoo Han <jg1.han@samsung.com>
|
||||
S: Maintained
|
||||
F: drivers/video/backlight/
|
||||
|
@ -2373,7 +2372,7 @@ F: kernel/cpuset.c
|
|||
|
||||
CRAMFS FILESYSTEM
|
||||
W: http://sourceforge.net/projects/cramfs/
|
||||
S: Orphan
|
||||
S: Orphan / Obsolete
|
||||
F: Documentation/filesystems/cramfs.txt
|
||||
F: fs/cramfs/
|
||||
|
||||
|
@ -7320,7 +7319,7 @@ S: Odd Fixes
|
|||
F: drivers/media/usb/tlg2300/
|
||||
|
||||
SC1200 WDT DRIVER
|
||||
M: Zwane Mwaikambo <zwane@arm.linux.org.uk>
|
||||
M: Zwane Mwaikambo <zwanem@gmail.com>
|
||||
S: Maintained
|
||||
F: drivers/watchdog/sc1200wdt.c
|
||||
|
||||
|
|
16
Makefile
16
Makefile
|
@ -720,6 +720,22 @@ mod_strip_cmd = true
|
|||
endif # INSTALL_MOD_STRIP
|
||||
export mod_strip_cmd
|
||||
|
||||
# Select initial ramdisk compression format, default is gzip(1).
|
||||
# This shall be used by the dracut(8) tool while creating an initramfs image.
|
||||
#
|
||||
INITRD_COMPRESS=gzip
|
||||
ifeq ($(CONFIG_RD_BZIP2), y)
|
||||
INITRD_COMPRESS=bzip2
|
||||
else ifeq ($(CONFIG_RD_LZMA), y)
|
||||
INITRD_COMPRESS=lzma
|
||||
else ifeq ($(CONFIG_RD_XZ), y)
|
||||
INITRD_COMPRESS=xz
|
||||
else ifeq ($(CONFIG_RD_LZO), y)
|
||||
INITRD_COMPRESS=lzo
|
||||
else ifeq ($(CONFIG_RD_LZ4), y)
|
||||
INITRD_COMPRESS=lz4
|
||||
endif
|
||||
export INITRD_COMPRESS
|
||||
|
||||
ifdef CONFIG_MODULE_SIG_ALL
|
||||
MODSECKEY = ./signing_key.priv
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
#define EUSERS 68 /* Too many users */
|
||||
#define EDQUOT 69 /* Quota exceeded */
|
||||
#define ESTALE 70 /* Stale NFS file handle */
|
||||
#define ESTALE 70 /* Stale file handle */
|
||||
#define EREMOTE 71 /* Object is remote */
|
||||
|
||||
#define ENOLCK 77 /* No record locks available */
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
void *module_alloc(unsigned long size)
|
||||
{
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL, PAGE_KERNEL_EXEC, -1,
|
||||
GFP_KERNEL, PAGE_KERNEL_EXEC, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -25,7 +25,6 @@ struct gen_pool *sram_get_gen_pool(void)
|
|||
|
||||
void *sram_alloc(size_t len, dma_addr_t *dma)
|
||||
{
|
||||
unsigned long vaddr;
|
||||
dma_addr_t dma_base = davinci_soc_info.sram_dma;
|
||||
|
||||
if (dma)
|
||||
|
@ -33,13 +32,7 @@ void *sram_alloc(size_t len, dma_addr_t *dma)
|
|||
if (!sram_pool || (dma && !dma_base))
|
||||
return NULL;
|
||||
|
||||
vaddr = gen_pool_alloc(sram_pool, len);
|
||||
if (!vaddr)
|
||||
return NULL;
|
||||
|
||||
if (dma)
|
||||
*dma = gen_pool_virt_to_phys(sram_pool, vaddr);
|
||||
return (void *)vaddr;
|
||||
return gen_pool_dma_alloc(sram_pool, len, dma);
|
||||
|
||||
}
|
||||
EXPORT_SYMBOL(sram_alloc);
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
void *module_alloc(unsigned long size)
|
||||
{
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL, PAGE_KERNEL_EXEC, -1,
|
||||
GFP_KERNEL, PAGE_KERNEL_EXEC, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <asm/page.h> /* for __va, __pa */
|
||||
#include <arch/io.h>
|
||||
#include <asm-generic/iomap.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
struct cris_io_operations
|
||||
|
|
|
@ -319,7 +319,7 @@ struct thread_struct {
|
|||
regs->loadrs = 0; \
|
||||
regs->r8 = get_dumpable(current->mm); /* set "don't zap registers" flag */ \
|
||||
regs->r12 = new_sp - 16; /* allocate 16 byte scratch area */ \
|
||||
if (unlikely(!get_dumpable(current->mm))) { \
|
||||
if (unlikely(get_dumpable(current->mm) != SUID_DUMP_USER)) { \
|
||||
/* \
|
||||
* Zap scratch regs to avoid leaking bits between processes with different \
|
||||
* uid/privileges. \
|
||||
|
|
|
@ -357,9 +357,7 @@ int vmemmap_find_next_valid_pfn(int node, int i)
|
|||
|
||||
end_address = (unsigned long) &vmem_map[pgdat->node_start_pfn + i];
|
||||
end_address = PAGE_ALIGN(end_address);
|
||||
|
||||
stop_address = (unsigned long) &vmem_map[
|
||||
pgdat->node_start_pfn + pgdat->node_spanned_pages];
|
||||
stop_address = (unsigned long) &vmem_map[pgdat_end_pfn(pgdat)];
|
||||
|
||||
do {
|
||||
pgd_t *pgd;
|
||||
|
|
|
@ -305,9 +305,7 @@ void dma_free_coherent(struct device *dev, size_t size,
|
|||
|
||||
if (pfn_valid(pfn)) {
|
||||
struct page *page = pfn_to_page(pfn);
|
||||
ClearPageReserved(page);
|
||||
|
||||
__free_page(page);
|
||||
__free_reserved_page(page);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -148,7 +148,7 @@ static void __init bootmem_init_one_node(unsigned int nid)
|
|||
if (!p->node_spanned_pages)
|
||||
return;
|
||||
|
||||
end_pfn = p->node_start_pfn + p->node_spanned_pages;
|
||||
end_pfn = pgdat_end_pfn(p);
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
if (end_pfn > max_low_pfn)
|
||||
end_pfn = max_low_pfn;
|
||||
|
|
|
@ -176,8 +176,7 @@ void consistent_free(size_t size, void *vaddr)
|
|||
page = virt_to_page(vaddr);
|
||||
|
||||
do {
|
||||
ClearPageReserved(page);
|
||||
__free_page(page);
|
||||
__free_reserved_page(page);
|
||||
page++;
|
||||
} while (size -= PAGE_SIZE);
|
||||
#else
|
||||
|
@ -194,9 +193,7 @@ void consistent_free(size_t size, void *vaddr)
|
|||
pte_clear(&init_mm, (unsigned int)vaddr, ptep);
|
||||
if (pfn_valid(pfn)) {
|
||||
page = pfn_to_page(pfn);
|
||||
|
||||
ClearPageReserved(page);
|
||||
__free_page(page);
|
||||
__free_reserved_page(page);
|
||||
}
|
||||
}
|
||||
vaddr += PAGE_SIZE;
|
||||
|
|
|
@ -102,7 +102,7 @@
|
|||
#define EWOULDBLOCK EAGAIN /* Operation would block */
|
||||
#define EALREADY 149 /* Operation already in progress */
|
||||
#define EINPROGRESS 150 /* Operation now in progress */
|
||||
#define ESTALE 151 /* Stale NFS file handle */
|
||||
#define ESTALE 151 /* Stale file handle */
|
||||
#define ECANCELED 158 /* AIO operation canceled */
|
||||
|
||||
/*
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#define EBADMSG 67 /* Not a data message */
|
||||
#define EUSERS 68 /* Too many users */
|
||||
#define EDQUOT 69 /* Quota exceeded */
|
||||
#define ESTALE 70 /* Stale NFS file handle */
|
||||
#define ESTALE 70 /* Stale file handle */
|
||||
#define EREMOTE 71 /* Object is remote */
|
||||
#define EOVERFLOW 72 /* Value too large for defined data type */
|
||||
|
||||
|
|
|
@ -219,7 +219,7 @@ void *module_alloc(unsigned long size)
|
|||
* init_data correctly */
|
||||
return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END,
|
||||
GFP_KERNEL | __GFP_HIGHMEM,
|
||||
PAGE_KERNEL_RWX, -1,
|
||||
PAGE_KERNEL_RWX, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
|
||||
|
|
|
@ -287,9 +287,7 @@ void __dma_free_coherent(size_t size, void *vaddr)
|
|||
pte_clear(&init_mm, addr, ptep);
|
||||
if (pfn_valid(pfn)) {
|
||||
struct page *page = pfn_to_page(pfn);
|
||||
|
||||
ClearPageReserved(page);
|
||||
__free_page(page);
|
||||
__free_reserved_page(page);
|
||||
}
|
||||
}
|
||||
addr += PAGE_SIZE;
|
||||
|
|
|
@ -633,8 +633,6 @@ static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
|
|||
|
||||
/*
|
||||
* This function frees user-level page tables of a process.
|
||||
*
|
||||
* Must be called with pagetable lock held.
|
||||
*/
|
||||
void hugetlb_free_pgd_range(struct mmu_gather *tlb,
|
||||
unsigned long addr, unsigned long end,
|
||||
|
|
|
@ -938,8 +938,7 @@ static void __init mark_reserved_regions_for_nid(int nid)
|
|||
unsigned long start_pfn = physbase >> PAGE_SHIFT;
|
||||
unsigned long end_pfn = PFN_UP(physbase + size);
|
||||
struct node_active_region node_ar;
|
||||
unsigned long node_end_pfn = node->node_start_pfn +
|
||||
node->node_spanned_pages;
|
||||
unsigned long node_end_pfn = pgdat_end_pfn(node);
|
||||
|
||||
/*
|
||||
* Check to make sure that this memblock.reserved area is
|
||||
|
|
|
@ -50,7 +50,7 @@ void *module_alloc(unsigned long size)
|
|||
if (PAGE_ALIGN(size) > MODULES_LEN)
|
||||
return NULL;
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL, PAGE_KERNEL, -1,
|
||||
GFP_KERNEL, PAGE_KERNEL, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -64,6 +64,11 @@ static unsigned long mmap_rnd(void)
|
|||
return (get_random_int() & 0x7ffUL) << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
static unsigned long mmap_base_legacy(void)
|
||||
{
|
||||
return TASK_UNMAPPED_BASE + mmap_rnd();
|
||||
}
|
||||
|
||||
static inline unsigned long mmap_base(void)
|
||||
{
|
||||
unsigned long gap = rlimit(RLIMIT_STACK);
|
||||
|
@ -89,7 +94,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
|
|||
* bit is set, or if the expected stack growth is unlimited:
|
||||
*/
|
||||
if (mmap_is_legacy()) {
|
||||
mm->mmap_base = TASK_UNMAPPED_BASE;
|
||||
mm->mmap_base = mmap_base_legacy();
|
||||
mm->get_unmapped_area = arch_get_unmapped_area;
|
||||
} else {
|
||||
mm->mmap_base = mmap_base();
|
||||
|
@ -164,7 +169,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
|
|||
* bit is set, or if the expected stack growth is unlimited:
|
||||
*/
|
||||
if (mmap_is_legacy()) {
|
||||
mm->mmap_base = TASK_UNMAPPED_BASE;
|
||||
mm->mmap_base = mmap_base_legacy();
|
||||
mm->get_unmapped_area = s390_get_unmapped_area;
|
||||
} else {
|
||||
mm->mmap_base = mmap_base();
|
||||
|
|
|
@ -46,7 +46,7 @@ static inline void __unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
|||
save_fpu(tsk);
|
||||
release_fpu(regs);
|
||||
} else
|
||||
tsk->fpu_counter = 0;
|
||||
tsk->thread.fpu_counter = 0;
|
||||
}
|
||||
|
||||
static inline void unlazy_fpu(struct task_struct *tsk, struct pt_regs *regs)
|
||||
|
|
|
@ -111,6 +111,16 @@ struct thread_struct {
|
|||
|
||||
/* Extended processor state */
|
||||
union thread_xstate *xstate;
|
||||
|
||||
/*
|
||||
* fpu_counter contains the number of consecutive context switches
|
||||
* that the FPU is used. If this is over a threshold, the lazy fpu
|
||||
* saving becomes unlazy to save the trap. This is an unsigned char
|
||||
* so that after 256 times the counter wraps and the behavior turns
|
||||
* lazy again; this to deal with bursty apps that only use FPU for
|
||||
* a short time
|
||||
*/
|
||||
unsigned char fpu_counter;
|
||||
};
|
||||
|
||||
#define INIT_THREAD { \
|
||||
|
|
|
@ -126,6 +126,16 @@ struct thread_struct {
|
|||
|
||||
/* floating point info */
|
||||
union thread_xstate *xstate;
|
||||
|
||||
/*
|
||||
* fpu_counter contains the number of consecutive context switches
|
||||
* that the FPU is used. If this is over a threshold, the lazy fpu
|
||||
* saving becomes unlazy to save the trap. This is an unsigned char
|
||||
* so that after 256 times the counter wraps and the behavior turns
|
||||
* lazy again; this to deal with bursty apps that only use FPU for
|
||||
* a short time
|
||||
*/
|
||||
unsigned char fpu_counter;
|
||||
};
|
||||
|
||||
#define INIT_MMAP \
|
||||
|
|
|
@ -44,7 +44,7 @@ void __fpu_state_restore(void)
|
|||
restore_fpu(tsk);
|
||||
|
||||
task_thread_info(tsk)->status |= TS_USEDFPU;
|
||||
tsk->fpu_counter++;
|
||||
tsk->thread.fpu_counter++;
|
||||
}
|
||||
|
||||
void fpu_state_restore(struct pt_regs *regs)
|
||||
|
|
|
@ -156,7 +156,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
#endif
|
||||
ti->addr_limit = KERNEL_DS;
|
||||
ti->status &= ~TS_USEDFPU;
|
||||
p->fpu_counter = 0;
|
||||
p->thread.fpu_counter = 0;
|
||||
return 0;
|
||||
}
|
||||
*childregs = *current_pt_regs();
|
||||
|
@ -189,7 +189,7 @@ __switch_to(struct task_struct *prev, struct task_struct *next)
|
|||
unlazy_fpu(prev, task_pt_regs(prev));
|
||||
|
||||
/* we're going to use this soon, after a few expensive things */
|
||||
if (next->fpu_counter > 5)
|
||||
if (next->thread.fpu_counter > 5)
|
||||
prefetch(next_t->xstate);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
|
@ -207,7 +207,7 @@ __switch_to(struct task_struct *prev, struct task_struct *next)
|
|||
* restore of the math state immediately to avoid the trap; the
|
||||
* chances of needing FPU soon are obviously high now
|
||||
*/
|
||||
if (next->fpu_counter > 5)
|
||||
if (next->thread.fpu_counter > 5)
|
||||
__fpu_state_restore();
|
||||
|
||||
return prev;
|
||||
|
|
|
@ -374,7 +374,7 @@ asmlinkage void ret_from_kernel_thread(void);
|
|||
int copy_thread(unsigned long clone_flags, unsigned long usp,
|
||||
unsigned long arg, struct task_struct *p)
|
||||
{
|
||||
struct pt_regs *childregs, *regs = current_pt_regs();
|
||||
struct pt_regs *childregs;
|
||||
|
||||
#ifdef CONFIG_SH_FPU
|
||||
/* can't happen for a kernel thread */
|
||||
|
@ -393,7 +393,7 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
if (unlikely(p->flags & PF_KTHREAD)) {
|
||||
memset(childregs, 0, sizeof(struct pt_regs));
|
||||
childregs->regs[2] = (unsigned long)arg;
|
||||
childregs->regs[3] = (unsigned long)fn;
|
||||
childregs->regs[3] = (unsigned long)usp;
|
||||
childregs->sr = (1 << 30); /* not user_mode */
|
||||
childregs->sr |= SR_FD; /* Invalidate FPU flag */
|
||||
p->thread.pc = (unsigned long) ret_from_kernel_thread;
|
||||
|
|
|
@ -231,7 +231,7 @@ static void __init bootmem_init_one_node(unsigned int nid)
|
|||
if (!p->node_spanned_pages)
|
||||
return;
|
||||
|
||||
end_pfn = p->node_start_pfn + p->node_spanned_pages;
|
||||
end_pfn = pgdat_end_pfn(p);
|
||||
|
||||
total_pages = bootmem_bootmap_pages(p->node_spanned_pages);
|
||||
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
#define EPROCLIM 67 /* SUNOS: Too many processes */
|
||||
#define EUSERS 68 /* Too many users */
|
||||
#define EDQUOT 69 /* Quota exceeded */
|
||||
#define ESTALE 70 /* Stale NFS file handle */
|
||||
#define ESTALE 70 /* Stale file handle */
|
||||
#define EREMOTE 71 /* Object is remote */
|
||||
#define ENOSTR 72 /* Device not a stream */
|
||||
#define ETIME 73 /* Timer expired */
|
||||
|
|
|
@ -29,7 +29,7 @@ static void *module_map(unsigned long size)
|
|||
if (PAGE_ALIGN(size) > MODULES_LEN)
|
||||
return NULL;
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL, PAGE_KERNEL, -1,
|
||||
GFP_KERNEL, PAGE_KERNEL, NUMA_NO_NODE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -365,7 +365,7 @@ static inline void drop_fpu(struct task_struct *tsk)
|
|||
* Forget coprocessor state..
|
||||
*/
|
||||
preempt_disable();
|
||||
tsk->fpu_counter = 0;
|
||||
tsk->thread.fpu_counter = 0;
|
||||
__drop_fpu(tsk);
|
||||
clear_used_math();
|
||||
preempt_enable();
|
||||
|
@ -424,7 +424,7 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta
|
|||
* or if the past 5 consecutive context-switches used math.
|
||||
*/
|
||||
fpu.preload = tsk_used_math(new) && (use_eager_fpu() ||
|
||||
new->fpu_counter > 5);
|
||||
new->thread.fpu_counter > 5);
|
||||
if (__thread_has_fpu(old)) {
|
||||
if (!__save_init_fpu(old))
|
||||
cpu = ~0;
|
||||
|
@ -433,16 +433,16 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta
|
|||
|
||||
/* Don't change CR0.TS if we just switch! */
|
||||
if (fpu.preload) {
|
||||
new->fpu_counter++;
|
||||
new->thread.fpu_counter++;
|
||||
__thread_set_has_fpu(new);
|
||||
prefetch(new->thread.fpu.state);
|
||||
} else if (!use_eager_fpu())
|
||||
stts();
|
||||
} else {
|
||||
old->fpu_counter = 0;
|
||||
old->thread.fpu_counter = 0;
|
||||
old->thread.fpu.last_cpu = ~0;
|
||||
if (fpu.preload) {
|
||||
new->fpu_counter++;
|
||||
new->thread.fpu_counter++;
|
||||
if (!use_eager_fpu() && fpu_lazy_restore(new, cpu))
|
||||
fpu.preload = 0;
|
||||
else
|
||||
|
|
|
@ -488,6 +488,15 @@ struct thread_struct {
|
|||
unsigned long iopl;
|
||||
/* Max allowed port in the bitmap, in bytes: */
|
||||
unsigned io_bitmap_max;
|
||||
/*
|
||||
* fpu_counter contains the number of consecutive context switches
|
||||
* that the FPU is used. If this is over a threshold, the lazy fpu
|
||||
* saving becomes unlazy to save the trap. This is an unsigned char
|
||||
* so that after 256 times the counter wraps and the behavior turns
|
||||
* lazy again; this to deal with bursty apps that only use FPU for
|
||||
* a short time
|
||||
*/
|
||||
unsigned char fpu_counter;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -100,7 +100,7 @@ void unlazy_fpu(struct task_struct *tsk)
|
|||
__save_init_fpu(tsk);
|
||||
__thread_fpu_end(tsk);
|
||||
} else
|
||||
tsk->fpu_counter = 0;
|
||||
tsk->thread.fpu_counter = 0;
|
||||
preempt_enable();
|
||||
}
|
||||
EXPORT_SYMBOL(unlazy_fpu);
|
||||
|
|
|
@ -49,7 +49,7 @@ void *module_alloc(unsigned long size)
|
|||
return NULL;
|
||||
return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,
|
||||
GFP_KERNEL | __GFP_HIGHMEM, PAGE_KERNEL_EXEC,
|
||||
-1, __builtin_return_address(0));
|
||||
NUMA_NO_NODE, __builtin_return_address(0));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
|
|
|
@ -153,7 +153,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
|||
childregs->orig_ax = -1;
|
||||
childregs->cs = __KERNEL_CS | get_kernel_rpl();
|
||||
childregs->flags = X86_EFLAGS_IF | X86_EFLAGS_FIXED;
|
||||
p->fpu_counter = 0;
|
||||
p->thread.fpu_counter = 0;
|
||||
p->thread.io_bitmap_ptr = NULL;
|
||||
memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));
|
||||
return 0;
|
||||
|
@ -166,7 +166,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
|||
p->thread.ip = (unsigned long) ret_from_fork;
|
||||
task_user_gs(p) = get_user_gs(current_pt_regs());
|
||||
|
||||
p->fpu_counter = 0;
|
||||
p->thread.fpu_counter = 0;
|
||||
p->thread.io_bitmap_ptr = NULL;
|
||||
tsk = current;
|
||||
err = -ENOMEM;
|
||||
|
|
|
@ -163,7 +163,7 @@ int copy_thread(unsigned long clone_flags, unsigned long sp,
|
|||
p->thread.sp = (unsigned long) childregs;
|
||||
p->thread.usersp = me->thread.usersp;
|
||||
set_tsk_thread_flag(p, TIF_FORK);
|
||||
p->fpu_counter = 0;
|
||||
p->thread.fpu_counter = 0;
|
||||
p->thread.io_bitmap_ptr = NULL;
|
||||
|
||||
savesegment(gs, p->thread.gsindex);
|
||||
|
|
|
@ -1121,8 +1121,6 @@ void __init setup_arch(char **cmdline_p)
|
|||
acpi_initrd_override((void *)initrd_start, initrd_end - initrd_start);
|
||||
#endif
|
||||
|
||||
reserve_crashkernel();
|
||||
|
||||
vsmp_init();
|
||||
|
||||
io_delay_init();
|
||||
|
@ -1135,6 +1133,13 @@ void __init setup_arch(char **cmdline_p)
|
|||
early_acpi_boot_init();
|
||||
|
||||
initmem_init();
|
||||
|
||||
/*
|
||||
* Reserve memory for crash kernel after SRAT is parsed so that it
|
||||
* won't consume hotpluggable memory.
|
||||
*/
|
||||
reserve_crashkernel();
|
||||
|
||||
memblock_find_dma_reserve();
|
||||
|
||||
#ifdef CONFIG_KVM_GUEST
|
||||
|
|
|
@ -653,7 +653,7 @@ void math_state_restore(void)
|
|||
return;
|
||||
}
|
||||
|
||||
tsk->fpu_counter++;
|
||||
tsk->thread.fpu_counter++;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(math_state_restore);
|
||||
|
||||
|
|
|
@ -53,12 +53,12 @@ __ref void *alloc_low_pages(unsigned int num)
|
|||
if ((pgt_buf_end + num) > pgt_buf_top || !can_use_brk_pgt) {
|
||||
unsigned long ret;
|
||||
if (min_pfn_mapped >= max_pfn_mapped)
|
||||
panic("alloc_low_page: ran out of memory");
|
||||
panic("alloc_low_pages: ran out of memory");
|
||||
ret = memblock_find_in_range(min_pfn_mapped << PAGE_SHIFT,
|
||||
max_pfn_mapped << PAGE_SHIFT,
|
||||
PAGE_SIZE * num , PAGE_SIZE);
|
||||
if (!ret)
|
||||
panic("alloc_low_page: can not alloc memory");
|
||||
panic("alloc_low_pages: can not alloc memory");
|
||||
memblock_reserve(ret, PAGE_SIZE * num);
|
||||
pfn = ret >> PAGE_SHIFT;
|
||||
} else {
|
||||
|
@ -418,27 +418,27 @@ static unsigned long __init get_new_step_size(unsigned long step_size)
|
|||
return step_size << 5;
|
||||
}
|
||||
|
||||
void __init init_mem_mapping(void)
|
||||
/**
|
||||
* memory_map_top_down - Map [map_start, map_end) top down
|
||||
* @map_start: start address of the target memory range
|
||||
* @map_end: end address of the target memory range
|
||||
*
|
||||
* This function will setup direct mapping for memory range
|
||||
* [map_start, map_end) in top-down. That said, the page tables
|
||||
* will be allocated at the end of the memory, and we map the
|
||||
* memory in top-down.
|
||||
*/
|
||||
static void __init memory_map_top_down(unsigned long map_start,
|
||||
unsigned long map_end)
|
||||
{
|
||||
unsigned long end, real_end, start, last_start;
|
||||
unsigned long real_end, start, last_start;
|
||||
unsigned long step_size;
|
||||
unsigned long addr;
|
||||
unsigned long mapped_ram_size = 0;
|
||||
unsigned long new_mapped_ram_size;
|
||||
|
||||
probe_page_size_mask();
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
end = max_pfn << PAGE_SHIFT;
|
||||
#else
|
||||
end = max_low_pfn << PAGE_SHIFT;
|
||||
#endif
|
||||
|
||||
/* the ISA range is always mapped regardless of memory holes */
|
||||
init_memory_mapping(0, ISA_END_ADDRESS);
|
||||
|
||||
/* xen has big range in reserved near end of ram, skip it at first.*/
|
||||
addr = memblock_find_in_range(ISA_END_ADDRESS, end, PMD_SIZE, PMD_SIZE);
|
||||
addr = memblock_find_in_range(map_start, map_end, PMD_SIZE, PMD_SIZE);
|
||||
real_end = addr + PMD_SIZE;
|
||||
|
||||
/* step_size need to be small so pgt_buf from BRK could cover it */
|
||||
|
@ -453,13 +453,13 @@ void __init init_mem_mapping(void)
|
|||
* end of RAM in [min_pfn_mapped, max_pfn_mapped) used as new pages
|
||||
* for page table.
|
||||
*/
|
||||
while (last_start > ISA_END_ADDRESS) {
|
||||
while (last_start > map_start) {
|
||||
if (last_start > step_size) {
|
||||
start = round_down(last_start - 1, step_size);
|
||||
if (start < ISA_END_ADDRESS)
|
||||
start = ISA_END_ADDRESS;
|
||||
if (start < map_start)
|
||||
start = map_start;
|
||||
} else
|
||||
start = ISA_END_ADDRESS;
|
||||
start = map_start;
|
||||
new_mapped_ram_size = init_range_memory_mapping(start,
|
||||
last_start);
|
||||
last_start = start;
|
||||
|
@ -470,8 +470,89 @@ void __init init_mem_mapping(void)
|
|||
mapped_ram_size += new_mapped_ram_size;
|
||||
}
|
||||
|
||||
if (real_end < end)
|
||||
init_range_memory_mapping(real_end, end);
|
||||
if (real_end < map_end)
|
||||
init_range_memory_mapping(real_end, map_end);
|
||||
}
|
||||
|
||||
/**
|
||||
* memory_map_bottom_up - Map [map_start, map_end) bottom up
|
||||
* @map_start: start address of the target memory range
|
||||
* @map_end: end address of the target memory range
|
||||
*
|
||||
* This function will setup direct mapping for memory range
|
||||
* [map_start, map_end) in bottom-up. Since we have limited the
|
||||
* bottom-up allocation above the kernel, the page tables will
|
||||
* be allocated just above the kernel and we map the memory
|
||||
* in [map_start, map_end) in bottom-up.
|
||||
*/
|
||||
static void __init memory_map_bottom_up(unsigned long map_start,
|
||||
unsigned long map_end)
|
||||
{
|
||||
unsigned long next, new_mapped_ram_size, start;
|
||||
unsigned long mapped_ram_size = 0;
|
||||
/* step_size need to be small so pgt_buf from BRK could cover it */
|
||||
unsigned long step_size = PMD_SIZE;
|
||||
|
||||
start = map_start;
|
||||
min_pfn_mapped = start >> PAGE_SHIFT;
|
||||
|
||||
/*
|
||||
* We start from the bottom (@map_start) and go to the top (@map_end).
|
||||
* The memblock_find_in_range() gets us a block of RAM from the
|
||||
* end of RAM in [min_pfn_mapped, max_pfn_mapped) used as new pages
|
||||
* for page table.
|
||||
*/
|
||||
while (start < map_end) {
|
||||
if (map_end - start > step_size) {
|
||||
next = round_up(start + 1, step_size);
|
||||
if (next > map_end)
|
||||
next = map_end;
|
||||
} else
|
||||
next = map_end;
|
||||
|
||||
new_mapped_ram_size = init_range_memory_mapping(start, next);
|
||||
start = next;
|
||||
|
||||
if (new_mapped_ram_size > mapped_ram_size)
|
||||
step_size = get_new_step_size(step_size);
|
||||
mapped_ram_size += new_mapped_ram_size;
|
||||
}
|
||||
}
|
||||
|
||||
void __init init_mem_mapping(void)
|
||||
{
|
||||
unsigned long end;
|
||||
|
||||
probe_page_size_mask();
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
end = max_pfn << PAGE_SHIFT;
|
||||
#else
|
||||
end = max_low_pfn << PAGE_SHIFT;
|
||||
#endif
|
||||
|
||||
/* the ISA range is always mapped regardless of memory holes */
|
||||
init_memory_mapping(0, ISA_END_ADDRESS);
|
||||
|
||||
/*
|
||||
* If the allocation is in bottom-up direction, we setup direct mapping
|
||||
* in bottom-up, otherwise we setup direct mapping in top-down.
|
||||
*/
|
||||
if (memblock_bottom_up()) {
|
||||
unsigned long kernel_end = __pa_symbol(_end);
|
||||
|
||||
/*
|
||||
* we need two separate calls here. This is because we want to
|
||||
* allocate page tables above the kernel. So we first map
|
||||
* [kernel_end, end) to make memory above the kernel be mapped
|
||||
* as soon as possible. And then use page tables allocated above
|
||||
* the kernel to map [ISA_END_ADDRESS, kernel_end).
|
||||
*/
|
||||
memory_map_bottom_up(kernel_end, end);
|
||||
memory_map_bottom_up(ISA_END_ADDRESS, kernel_end);
|
||||
} else {
|
||||
memory_map_top_down(ISA_END_ADDRESS, end);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
if (max_pfn > max_low_pfn) {
|
||||
|
|
|
@ -567,6 +567,17 @@ static int __init numa_init(int (*init_func)(void))
|
|||
ret = init_func();
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* We reset memblock back to the top-down direction
|
||||
* here because if we configured ACPI_NUMA, we have
|
||||
* parsed SRAT in init_func(). It is ok to have the
|
||||
* reset here even if we did't configure ACPI_NUMA
|
||||
* or acpi numa init fails and fallbacks to dummy
|
||||
* numa init.
|
||||
*/
|
||||
memblock_set_bottom_up(false);
|
||||
|
||||
ret = numa_cleanup_meminfo(&numa_meminfo);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -522,10 +522,16 @@ config HPET_MMAP
|
|||
If you say Y here, user applications will be able to mmap
|
||||
the HPET registers.
|
||||
|
||||
config HPET_MMAP_DEFAULT
|
||||
bool "Enable HPET MMAP access by default"
|
||||
default y
|
||||
depends on HPET_MMAP
|
||||
help
|
||||
In some hardware implementations, the page containing HPET
|
||||
registers may also contain other things that shouldn't be
|
||||
exposed to the user. If this applies to your hardware,
|
||||
say N here.
|
||||
exposed to the user. This option selects the default (if
|
||||
kernel parameter hpet_mmap is not set) user access to the
|
||||
registers for applications that require it.
|
||||
|
||||
config HANGCHECK_TIMER
|
||||
tristate "Hangcheck timer"
|
||||
|
|
|
@ -367,12 +367,29 @@ static unsigned int hpet_poll(struct file *file, poll_table * wait)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HPET_MMAP
|
||||
#ifdef CONFIG_HPET_MMAP_DEFAULT
|
||||
static int hpet_mmap_enabled = 1;
|
||||
#else
|
||||
static int hpet_mmap_enabled = 0;
|
||||
#endif
|
||||
|
||||
static __init int hpet_mmap_enable(char *str)
|
||||
{
|
||||
get_option(&str, &hpet_mmap_enabled);
|
||||
pr_info("HPET mmap %s\n", hpet_mmap_enabled ? "enabled" : "disabled");
|
||||
return 1;
|
||||
}
|
||||
__setup("hpet_mmap", hpet_mmap_enable);
|
||||
|
||||
static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
#ifdef CONFIG_HPET_MMAP
|
||||
struct hpet_dev *devp;
|
||||
unsigned long addr;
|
||||
|
||||
if (!hpet_mmap_enabled)
|
||||
return -EACCES;
|
||||
|
||||
devp = file->private_data;
|
||||
addr = devp->hd_hpets->hp_hpet_phys;
|
||||
|
||||
|
@ -381,10 +398,13 @@ static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
|
||||
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||
return vm_iomap_memory(vma, addr, PAGE_SIZE);
|
||||
#else
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
static int hpet_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int hpet_fasync(int fd, struct file *file, int on)
|
||||
{
|
||||
|
|
|
@ -350,12 +350,7 @@ struct mmp_tdma_desc *mmp_tdma_alloc_descriptor(struct mmp_tdma_chan *tdmac)
|
|||
if (!gpool)
|
||||
return NULL;
|
||||
|
||||
tdmac->desc_arr = (void *)gen_pool_alloc(gpool, size);
|
||||
if (!tdmac->desc_arr)
|
||||
return NULL;
|
||||
|
||||
tdmac->desc_arr_phys = gen_pool_virt_to_phys(gpool,
|
||||
(unsigned long)tdmac->desc_arr);
|
||||
tdmac->desc_arr = gen_pool_dma_alloc(gpool, size, &tdmac->desc_arr_phys);
|
||||
|
||||
return tdmac->desc_arr;
|
||||
}
|
||||
|
|
|
@ -95,4 +95,4 @@ static inline phys_addr_t omap_iommu_translate(u32 d, u32 va, u32 mask)
|
|||
#define iopte_offset(iopgd, da) (iopgd_page_vaddr(iopgd) + iopte_index(da))
|
||||
|
||||
#define to_iommu(dev) \
|
||||
((struct omap_iommu *)platform_get_drvdata(to_platform_device(dev)))
|
||||
(platform_get_drvdata(to_platform_device(dev)))
|
||||
|
|
|
@ -3232,13 +3232,12 @@ static int coda_probe(struct platform_device *pdev)
|
|||
dev->iram_size = CODA7_IRAM_SIZE;
|
||||
break;
|
||||
}
|
||||
dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, dev->iram_size);
|
||||
dev->iram_vaddr = (unsigned long)gen_pool_dma_alloc(dev->iram_pool,
|
||||
dev->iram_size, (dma_addr_t *)&dev->iram_paddr);
|
||||
if (!dev->iram_vaddr) {
|
||||
dev_err(&pdev->dev, "unable to alloc iram\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
dev->iram_paddr = gen_pool_virt_to_phys(dev->iram_pool,
|
||||
dev->iram_vaddr);
|
||||
|
||||
platform_set_drvdata(pdev, dev);
|
||||
|
||||
|
|
|
@ -401,7 +401,7 @@ again:
|
|||
sizeof(struct ms_status_register)))
|
||||
return 0;
|
||||
|
||||
msb->state = MSB_RP_RECEIVE_OOB_READ;
|
||||
msb->state = MSB_RP_RECIVE_STATUS_REG;
|
||||
return 0;
|
||||
|
||||
case MSB_RP_RECIVE_STATUS_REG:
|
||||
|
|
|
@ -1023,8 +1023,8 @@ static int mspro_block_read_attributes(struct memstick_dev *card)
|
|||
} else
|
||||
attr_count = attr->count;
|
||||
|
||||
msb->attr_group.attrs = kzalloc((attr_count + 1)
|
||||
* sizeof(struct attribute),
|
||||
msb->attr_group.attrs = kcalloc(attr_count + 1,
|
||||
sizeof(*msb->attr_group.attrs),
|
||||
GFP_KERNEL);
|
||||
if (!msb->attr_group.attrs) {
|
||||
rc = -ENOMEM;
|
||||
|
|
|
@ -105,7 +105,8 @@ int i2o_driver_register(struct i2o_driver *drv)
|
|||
osm_err("too many drivers registered, increase "
|
||||
"max_drivers\n");
|
||||
spin_unlock_irqrestore(&i2o_drivers_lock, flags);
|
||||
return -EFAULT;
|
||||
rc = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
drv->context = i;
|
||||
|
@ -124,12 +125,15 @@ int i2o_driver_register(struct i2o_driver *drv)
|
|||
}
|
||||
|
||||
rc = driver_register(&drv->driver);
|
||||
if (rc) {
|
||||
if (drv->event) {
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
return 0;
|
||||
out:
|
||||
if (drv->event_queue) {
|
||||
destroy_workqueue(drv->event_queue);
|
||||
drv->event_queue = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
};
|
||||
|
|
|
@ -1217,9 +1217,6 @@ static void bnx2x_set_one_vlan_mac_e1h(struct bnx2x *bp,
|
|||
ETH_VLAN_FILTER_CLASSIFY, config);
|
||||
}
|
||||
|
||||
#define list_next_entry(pos, member) \
|
||||
list_entry((pos)->member.next, typeof(*(pos)), member)
|
||||
|
||||
/**
|
||||
* bnx2x_vlan_mac_restore - reconfigure next MAC/VLAN/VLAN-MAC element
|
||||
*
|
||||
|
|
|
@ -201,7 +201,7 @@ static struct platform_driver pps_gpio_driver = {
|
|||
.driver = {
|
||||
.name = PPS_GPIO_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(pps_gpio_dt_ids),
|
||||
.of_match_table = pps_gpio_dt_ids,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -153,6 +153,16 @@ config RTC_DRV_88PM80X
|
|||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-88pm80x.
|
||||
|
||||
config RTC_DRV_AS3722
|
||||
tristate "ams AS3722 RTC driver"
|
||||
depends on MFD_AS3722
|
||||
help
|
||||
If you say yes here you get support for the RTC of ams AS3722 PMIC
|
||||
chips.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-as3722.
|
||||
|
||||
config RTC_DRV_DS1307
|
||||
tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025"
|
||||
help
|
||||
|
@ -497,6 +507,16 @@ config RTC_DRV_RV3029C2
|
|||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-rv3029c2.
|
||||
|
||||
config RTC_DRV_S5M
|
||||
tristate "Samsung S5M series"
|
||||
depends on MFD_SEC_CORE
|
||||
help
|
||||
If you say yes here you will get support for the
|
||||
RTC of Samsung S5M PMIC series.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-s5m.
|
||||
|
||||
endif # I2C
|
||||
|
||||
comment "SPI RTC drivers"
|
||||
|
|
|
@ -20,6 +20,7 @@ obj-$(CONFIG_RTC_DRV_88PM860X) += rtc-88pm860x.o
|
|||
obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o
|
||||
obj-$(CONFIG_RTC_DRV_AB3100) += rtc-ab3100.o
|
||||
obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o
|
||||
obj-$(CONFIG_RTC_DRV_AS3722) += rtc-as3722.o
|
||||
obj-$(CONFIG_RTC_DRV_AT32AP700X)+= rtc-at32ap700x.o
|
||||
obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o
|
||||
obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o
|
||||
|
@ -107,6 +108,7 @@ obj-$(CONFIG_RTC_DRV_RX8025) += rtc-rx8025.o
|
|||
obj-$(CONFIG_RTC_DRV_RX8581) += rtc-rx8581.o
|
||||
obj-$(CONFIG_RTC_DRV_S35390A) += rtc-s35390a.o
|
||||
obj-$(CONFIG_RTC_DRV_S3C) += rtc-s3c.o
|
||||
obj-$(CONFIG_RTC_DRV_S5M) += rtc-s5m.o
|
||||
obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o
|
||||
obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o
|
||||
obj-$(CONFIG_RTC_DRV_SNVS) += rtc-snvs.o
|
||||
|
|
|
@ -251,14 +251,15 @@ static SIMPLE_DEV_PM_OPS(pm80x_rtc_pm_ops, pm80x_rtc_suspend, pm80x_rtc_resume);
|
|||
static int pm80x_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pm80x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
struct pm80x_platform_data *pm80x_pdata;
|
||||
struct pm80x_platform_data *pm80x_pdata =
|
||||
dev_get_platdata(pdev->dev.parent);
|
||||
struct pm80x_rtc_pdata *pdata = NULL;
|
||||
struct pm80x_rtc_info *info;
|
||||
struct rtc_time tm;
|
||||
unsigned long ticks = 0;
|
||||
int ret;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
pdata = dev_get_platdata(&pdev->dev);
|
||||
if (pdata == NULL)
|
||||
dev_warn(&pdev->dev, "No platform data!\n");
|
||||
|
||||
|
@ -326,8 +327,7 @@ static int pm80x_rtc_probe(struct platform_device *pdev)
|
|||
regmap_update_bits(info->map, PM800_RTC_CONTROL, PM800_RTC1_USE_XO,
|
||||
PM800_RTC1_USE_XO);
|
||||
|
||||
if (pdev->dev.parent->platform_data) {
|
||||
pm80x_pdata = pdev->dev.parent->platform_data;
|
||||
if (pm80x_pdata) {
|
||||
pdata = pm80x_pdata->rtc;
|
||||
if (pdata)
|
||||
info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup;
|
||||
|
|
|
@ -316,7 +316,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
|
|||
unsigned long ticks = 0;
|
||||
int ret;
|
||||
|
||||
pdata = pdev->dev.platform_data;
|
||||
pdata = dev_get_platdata(&pdev->dev);
|
||||
|
||||
info = devm_kzalloc(&pdev->dev, sizeof(struct pm860x_rtc_info),
|
||||
GFP_KERNEL);
|
||||
|
|
|
@ -0,0 +1,275 @@
|
|||
/*
|
||||
* rtc-as3722.c - Real Time Clock driver for ams AS3722 PMICs
|
||||
*
|
||||
* Copyright (C) 2013 ams AG
|
||||
* Copyright (c) 2013, NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* Author: Florian Lobmaier <florian.lobmaier@ams.com>
|
||||
* Author: Laxman Dewangan <ldewangan@nvidia.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioctl.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mfd/as3722.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
#define AS3722_RTC_START_YEAR 2000
|
||||
struct as3722_rtc {
|
||||
struct rtc_device *rtc;
|
||||
struct device *dev;
|
||||
struct as3722 *as3722;
|
||||
int alarm_irq;
|
||||
bool irq_enable;
|
||||
};
|
||||
|
||||
static void as3722_time_to_reg(u8 *rbuff, struct rtc_time *tm)
|
||||
{
|
||||
rbuff[0] = bin2bcd(tm->tm_sec);
|
||||
rbuff[1] = bin2bcd(tm->tm_min);
|
||||
rbuff[2] = bin2bcd(tm->tm_hour);
|
||||
rbuff[3] = bin2bcd(tm->tm_mday);
|
||||
rbuff[4] = bin2bcd(tm->tm_mon);
|
||||
rbuff[5] = bin2bcd(tm->tm_year - (AS3722_RTC_START_YEAR - 1900));
|
||||
}
|
||||
|
||||
static void as3722_reg_to_time(u8 *rbuff, struct rtc_time *tm)
|
||||
{
|
||||
tm->tm_sec = bcd2bin(rbuff[0] & 0x7F);
|
||||
tm->tm_min = bcd2bin(rbuff[1] & 0x7F);
|
||||
tm->tm_hour = bcd2bin(rbuff[2] & 0x3F);
|
||||
tm->tm_mday = bcd2bin(rbuff[3] & 0x3F);
|
||||
tm->tm_mon = bcd2bin(rbuff[4] & 0x1F);
|
||||
tm->tm_year = (AS3722_RTC_START_YEAR - 1900) + bcd2bin(rbuff[5] & 0x7F);
|
||||
return;
|
||||
}
|
||||
|
||||
static int as3722_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
struct as3722 *as3722 = as3722_rtc->as3722;
|
||||
u8 as_time_array[6];
|
||||
int ret;
|
||||
|
||||
ret = as3722_block_read(as3722, AS3722_RTC_SECOND_REG,
|
||||
6, as_time_array);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "RTC_SECOND reg block read failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
as3722_reg_to_time(as_time_array, tm);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int as3722_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
struct as3722 *as3722 = as3722_rtc->as3722;
|
||||
u8 as_time_array[6];
|
||||
int ret;
|
||||
|
||||
if (tm->tm_year < (AS3722_RTC_START_YEAR - 1900))
|
||||
return -EINVAL;
|
||||
|
||||
as3722_time_to_reg(as_time_array, tm);
|
||||
ret = as3722_block_write(as3722, AS3722_RTC_SECOND_REG, 6,
|
||||
as_time_array);
|
||||
if (ret < 0)
|
||||
dev_err(dev, "RTC_SECOND reg block write failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int as3722_rtc_alarm_irq_enable(struct device *dev,
|
||||
unsigned int enabled)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
|
||||
if (enabled && !as3722_rtc->irq_enable) {
|
||||
enable_irq(as3722_rtc->alarm_irq);
|
||||
as3722_rtc->irq_enable = true;
|
||||
} else if (!enabled && as3722_rtc->irq_enable) {
|
||||
disable_irq(as3722_rtc->alarm_irq);
|
||||
as3722_rtc->irq_enable = false;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int as3722_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
struct as3722 *as3722 = as3722_rtc->as3722;
|
||||
u8 as_time_array[6];
|
||||
int ret;
|
||||
|
||||
ret = as3722_block_read(as3722, AS3722_RTC_ALARM_SECOND_REG, 6,
|
||||
as_time_array);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "RTC_ALARM_SECOND block read failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
as3722_reg_to_time(as_time_array, &alrm->time);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int as3722_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
struct as3722 *as3722 = as3722_rtc->as3722;
|
||||
u8 as_time_array[6];
|
||||
int ret;
|
||||
|
||||
if (alrm->time.tm_year < (AS3722_RTC_START_YEAR - 1900))
|
||||
return -EINVAL;
|
||||
|
||||
ret = as3722_rtc_alarm_irq_enable(dev, 0);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "Disable RTC alarm failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
as3722_time_to_reg(as_time_array, &alrm->time);
|
||||
ret = as3722_block_write(as3722, AS3722_RTC_ALARM_SECOND_REG, 6,
|
||||
as_time_array);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "RTC_ALARM_SECOND block write failed %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (alrm->enabled)
|
||||
ret = as3722_rtc_alarm_irq_enable(dev, alrm->enabled);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static irqreturn_t as3722_alarm_irq(int irq, void *data)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = data;
|
||||
|
||||
rtc_update_irq(as3722_rtc->rtc, 1, RTC_IRQF | RTC_AF);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops as3722_rtc_ops = {
|
||||
.read_time = as3722_rtc_read_time,
|
||||
.set_time = as3722_rtc_set_time,
|
||||
.read_alarm = as3722_rtc_read_alarm,
|
||||
.set_alarm = as3722_rtc_set_alarm,
|
||||
.alarm_irq_enable = as3722_rtc_alarm_irq_enable,
|
||||
};
|
||||
|
||||
static int as3722_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct as3722 *as3722 = dev_get_drvdata(pdev->dev.parent);
|
||||
struct as3722_rtc *as3722_rtc;
|
||||
int ret;
|
||||
|
||||
as3722_rtc = devm_kzalloc(&pdev->dev, sizeof(*as3722_rtc), GFP_KERNEL);
|
||||
if (!as3722_rtc)
|
||||
return -ENOMEM;
|
||||
|
||||
as3722_rtc->as3722 = as3722;
|
||||
as3722_rtc->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, as3722_rtc);
|
||||
|
||||
/* Enable the RTC to make sure it is running. */
|
||||
ret = as3722_update_bits(as3722, AS3722_RTC_CONTROL_REG,
|
||||
AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN,
|
||||
AS3722_RTC_ON | AS3722_RTC_ALARM_WAKEUP_EN);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "RTC_CONTROL reg write failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
as3722_rtc->rtc = rtc_device_register("as3722", &pdev->dev,
|
||||
&as3722_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(as3722_rtc->rtc)) {
|
||||
ret = PTR_ERR(as3722_rtc->rtc);
|
||||
dev_err(&pdev->dev, "RTC register failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
as3722_rtc->alarm_irq = platform_get_irq(pdev, 0);
|
||||
dev_info(&pdev->dev, "RTC interrupt %d\n", as3722_rtc->alarm_irq);
|
||||
|
||||
ret = request_threaded_irq(as3722_rtc->alarm_irq, NULL,
|
||||
as3722_alarm_irq, IRQF_ONESHOT | IRQF_EARLY_RESUME,
|
||||
"rtc-alarm", as3722_rtc);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to request alarm IRQ %d: %d\n",
|
||||
as3722_rtc->alarm_irq, ret);
|
||||
goto scrub;
|
||||
}
|
||||
disable_irq(as3722_rtc->alarm_irq);
|
||||
return 0;
|
||||
scrub:
|
||||
rtc_device_unregister(as3722_rtc->rtc);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int as3722_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = platform_get_drvdata(pdev);
|
||||
|
||||
free_irq(as3722_rtc->alarm_irq, as3722_rtc);
|
||||
rtc_device_unregister(as3722_rtc->rtc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int as3722_rtc_suspend(struct device *dev)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
|
||||
if (device_may_wakeup(dev))
|
||||
enable_irq_wake(as3722_rtc->alarm_irq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int as3722_rtc_resume(struct device *dev)
|
||||
{
|
||||
struct as3722_rtc *as3722_rtc = dev_get_drvdata(dev);
|
||||
|
||||
if (device_may_wakeup(dev))
|
||||
disable_irq_wake(as3722_rtc->alarm_irq);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops as3722_rtc_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(as3722_rtc_suspend, as3722_rtc_resume)
|
||||
};
|
||||
|
||||
static struct platform_driver as3722_rtc_driver = {
|
||||
.probe = as3722_rtc_probe,
|
||||
.remove = as3722_rtc_remove,
|
||||
.driver = {
|
||||
.name = "as3722-rtc",
|
||||
.pm = &as3722_rtc_pm_ops,
|
||||
},
|
||||
};
|
||||
module_platform_driver(as3722_rtc_driver);
|
||||
|
||||
MODULE_DESCRIPTION("RTC driver for AS3722 PMICs");
|
||||
MODULE_ALIAS("platform:as3722-rtc");
|
||||
MODULE_AUTHOR("Florian Lobmaier <florian.lobmaier@ams.com>");
|
||||
MODULE_AUTHOR("Laxman Dewangan <ldewangan@nvidia.com>");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -376,7 +376,8 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
return -ENXIO;
|
||||
}
|
||||
|
||||
at91_rtc_regs = ioremap(regs->start, resource_size(regs));
|
||||
at91_rtc_regs = devm_ioremap(&pdev->dev, regs->start,
|
||||
resource_size(regs));
|
||||
if (!at91_rtc_regs) {
|
||||
dev_err(&pdev->dev, "failed to map registers, aborting.\n");
|
||||
return -ENOMEM;
|
||||
|
@ -390,12 +391,12 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
AT91_RTC_SECEV | AT91_RTC_TIMEV |
|
||||
AT91_RTC_CALEV);
|
||||
|
||||
ret = request_irq(irq, at91_rtc_interrupt,
|
||||
ret = devm_request_irq(&pdev->dev, irq, at91_rtc_interrupt,
|
||||
IRQF_SHARED,
|
||||
"at91_rtc", pdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "IRQ %d already in use.\n", irq);
|
||||
goto err_unmap;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* cpu init code should really have flagged this device as
|
||||
|
@ -404,23 +405,14 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
if (!device_can_wakeup(&pdev->dev))
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
rtc = rtc_device_register(pdev->name, &pdev->dev,
|
||||
rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&at91_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(rtc)) {
|
||||
ret = PTR_ERR(rtc);
|
||||
goto err_free_irq;
|
||||
}
|
||||
if (IS_ERR(rtc))
|
||||
return PTR_ERR(rtc);
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
dev_info(&pdev->dev, "AT91 Real Time Clock driver.\n");
|
||||
return 0;
|
||||
|
||||
err_free_irq:
|
||||
free_irq(irq, pdev);
|
||||
err_unmap:
|
||||
iounmap(at91_rtc_regs);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -428,16 +420,10 @@ err_unmap:
|
|||
*/
|
||||
static int __exit at91_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct rtc_device *rtc = platform_get_drvdata(pdev);
|
||||
|
||||
/* Disable all interrupts */
|
||||
at91_rtc_write_idr(AT91_RTC_ACKUPD | AT91_RTC_ALARM |
|
||||
AT91_RTC_SECEV | AT91_RTC_TIMEV |
|
||||
AT91_RTC_CALEV);
|
||||
free_irq(irq, pdev);
|
||||
|
||||
rtc_device_unregister(rtc);
|
||||
iounmap(at91_rtc_regs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -595,7 +595,7 @@ static irqreturn_t cmos_interrupt(int irq, void *p)
|
|||
static int INITSECTION
|
||||
cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq)
|
||||
{
|
||||
struct cmos_rtc_board_info *info = dev->platform_data;
|
||||
struct cmos_rtc_board_info *info = dev_get_platdata(dev);
|
||||
int retval = 0;
|
||||
unsigned char rtc_control;
|
||||
unsigned address_space;
|
||||
|
@ -789,7 +789,6 @@ static void __exit cmos_do_remove(struct device *dev)
|
|||
cmos->iomem = NULL;
|
||||
|
||||
cmos->dev = NULL;
|
||||
dev_set_drvdata(dev, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
|
@ -278,7 +278,7 @@ static int da9055_rtc_probe(struct platform_device *pdev)
|
|||
return -ENOMEM;
|
||||
|
||||
rtc->da9055 = dev_get_drvdata(pdev->dev.parent);
|
||||
pdata = rtc->da9055->dev->platform_data;
|
||||
pdata = dev_get_platdata(rtc->da9055->dev);
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
ret = da9055_rtc_device_init(rtc->da9055, pdata);
|
||||
|
|
|
@ -606,7 +606,7 @@ static int ds1305_probe(struct spi_device *spi)
|
|||
struct ds1305 *ds1305;
|
||||
int status;
|
||||
u8 addr, value;
|
||||
struct ds1305_platform_data *pdata = spi->dev.platform_data;
|
||||
struct ds1305_platform_data *pdata = dev_get_platdata(&spi->dev);
|
||||
bool write_ctrl = false;
|
||||
|
||||
/* Sanity check board setup data. This may be hooked up
|
||||
|
|
|
@ -670,9 +670,9 @@ static int ds1307_probe(struct i2c_client *client,
|
|||
int tmp;
|
||||
const struct chip_desc *chip = &chips[id->driver_data];
|
||||
struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
|
||||
int want_irq = false;
|
||||
bool want_irq = false;
|
||||
unsigned char *buf;
|
||||
struct ds1307_platform_data *pdata = client->dev.platform_data;
|
||||
struct ds1307_platform_data *pdata = dev_get_platdata(&client->dev);
|
||||
static const int bbsqi_bitpos[] = {
|
||||
[ds_1337] = 0,
|
||||
[ds_1339] = DS1339_BIT_BBSQI,
|
||||
|
@ -956,7 +956,7 @@ read_rtc:
|
|||
GFP_KERNEL);
|
||||
if (!ds1307->nvram) {
|
||||
err = -ENOMEM;
|
||||
goto exit;
|
||||
goto err_irq;
|
||||
}
|
||||
ds1307->nvram->attr.name = "nvram";
|
||||
ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR;
|
||||
|
@ -967,13 +967,15 @@ read_rtc:
|
|||
ds1307->nvram_offset = chip->nvram_offset;
|
||||
err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram);
|
||||
if (err)
|
||||
goto exit;
|
||||
goto err_irq;
|
||||
set_bit(HAS_NVRAM, &ds1307->flags);
|
||||
dev_info(&client->dev, "%zu bytes nvram\n", ds1307->nvram->size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_irq:
|
||||
free_irq(client->irq, client);
|
||||
exit:
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -224,7 +224,7 @@ static const struct rtc_class_ops ds2404_rtc_ops = {
|
|||
|
||||
static int rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct ds2404_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct ds2404_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct ds2404 *chip;
|
||||
int retval = -EBUSY;
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ struct ep93xx_rtc {
|
|||
static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload,
|
||||
unsigned short *delete)
|
||||
{
|
||||
struct ep93xx_rtc *ep93xx_rtc = dev->platform_data;
|
||||
struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev);
|
||||
unsigned long comp;
|
||||
|
||||
comp = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_SWCOMP);
|
||||
|
@ -60,7 +60,7 @@ static int ep93xx_rtc_get_swcomp(struct device *dev, unsigned short *preload,
|
|||
|
||||
static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct ep93xx_rtc *ep93xx_rtc = dev->platform_data;
|
||||
struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev);
|
||||
unsigned long time;
|
||||
|
||||
time = __raw_readl(ep93xx_rtc->mmio_base + EP93XX_RTC_DATA);
|
||||
|
@ -71,7 +71,7 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
|||
|
||||
static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs)
|
||||
{
|
||||
struct ep93xx_rtc *ep93xx_rtc = dev->platform_data;
|
||||
struct ep93xx_rtc *ep93xx_rtc = dev_get_platdata(dev);
|
||||
|
||||
__raw_writel(secs + 1, ep93xx_rtc->mmio_base + EP93XX_RTC_LOAD);
|
||||
return 0;
|
||||
|
|
|
@ -144,11 +144,7 @@ isl1208_i2c_validate_client(struct i2c_client *client)
|
|||
static int
|
||||
isl1208_i2c_get_sr(struct i2c_client *client)
|
||||
{
|
||||
int sr = i2c_smbus_read_byte_data(client, ISL1208_REG_SR);
|
||||
if (sr < 0)
|
||||
return -EIO;
|
||||
|
||||
return sr;
|
||||
return i2c_smbus_read_byte_data(client, ISL1208_REG_SR);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -647,10 +643,11 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
"chip found, driver version " DRV_VERSION "\n");
|
||||
|
||||
if (client->irq > 0) {
|
||||
rc = request_threaded_irq(client->irq, NULL,
|
||||
rc = devm_request_threaded_irq(&client->dev, client->irq, NULL,
|
||||
isl1208_rtc_interrupt,
|
||||
IRQF_SHARED,
|
||||
isl1208_driver.driver.name, client);
|
||||
isl1208_driver.driver.name,
|
||||
client);
|
||||
if (!rc) {
|
||||
device_init_wakeup(&client->dev, 1);
|
||||
enable_irq_wake(client->irq);
|
||||
|
@ -662,20 +659,18 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
}
|
||||
}
|
||||
|
||||
rtc = rtc_device_register(isl1208_driver.driver.name,
|
||||
&client->dev, &isl1208_rtc_ops,
|
||||
rtc = devm_rtc_device_register(&client->dev, isl1208_driver.driver.name,
|
||||
&isl1208_rtc_ops,
|
||||
THIS_MODULE);
|
||||
if (IS_ERR(rtc)) {
|
||||
rc = PTR_ERR(rtc);
|
||||
goto exit_free_irq;
|
||||
}
|
||||
if (IS_ERR(rtc))
|
||||
return PTR_ERR(rtc);
|
||||
|
||||
i2c_set_clientdata(client, rtc);
|
||||
|
||||
rc = isl1208_i2c_get_sr(client);
|
||||
if (rc < 0) {
|
||||
dev_err(&client->dev, "reading status failed\n");
|
||||
goto exit_unregister;
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (rc & ISL1208_REG_SR_RTCF)
|
||||
|
@ -684,28 +679,15 @@ isl1208_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
|
||||
rc = sysfs_create_group(&client->dev.kobj, &isl1208_rtc_sysfs_files);
|
||||
if (rc)
|
||||
goto exit_unregister;
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
|
||||
exit_unregister:
|
||||
rtc_device_unregister(rtc);
|
||||
exit_free_irq:
|
||||
if (client->irq)
|
||||
free_irq(client->irq, client);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int
|
||||
isl1208_remove(struct i2c_client *client)
|
||||
{
|
||||
struct rtc_device *rtc = i2c_get_clientdata(client);
|
||||
|
||||
sysfs_remove_group(&client->dev.kobj, &isl1208_rtc_sysfs_files);
|
||||
rtc_device_unregister(rtc);
|
||||
if (client->irq)
|
||||
free_irq(client->irq, client);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -68,7 +68,7 @@ m48t59_mem_readb(struct device *dev, u32 ofs)
|
|||
static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
u8 val;
|
||||
|
@ -111,7 +111,7 @@ static int m48t59_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
|||
static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
u8 val = 0;
|
||||
|
@ -158,7 +158,7 @@ static int m48t59_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
|||
static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
struct rtc_time *tm = &alrm->time;
|
||||
unsigned long flags;
|
||||
|
@ -205,7 +205,7 @@ static int m48t59_rtc_readalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|||
static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
struct rtc_time *tm = &alrm->time;
|
||||
u8 mday, hour, min, sec;
|
||||
|
@ -266,7 +266,7 @@ static int m48t59_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|||
static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -283,7 +283,7 @@ static int m48t59_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
|||
static int m48t59_rtc_proc(struct device *dev, struct seq_file *seq)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
unsigned long flags;
|
||||
u8 val;
|
||||
|
@ -304,7 +304,7 @@ static irqreturn_t m48t59_rtc_interrupt(int irq, void *dev_id)
|
|||
{
|
||||
struct device *dev = (struct device *)dev_id;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
u8 event;
|
||||
|
||||
|
@ -340,7 +340,7 @@ static ssize_t m48t59_nvram_read(struct file *filp, struct kobject *kobj,
|
|||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
ssize_t cnt = 0;
|
||||
unsigned long flags;
|
||||
|
@ -360,7 +360,7 @@ static ssize_t m48t59_nvram_write(struct file *filp, struct kobject *kobj,
|
|||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = platform_get_drvdata(pdev);
|
||||
ssize_t cnt = 0;
|
||||
unsigned long flags;
|
||||
|
@ -385,7 +385,7 @@ static struct bin_attribute m48t59_nvram_attr = {
|
|||
|
||||
static int m48t59_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct m48t59_plat_data *pdata = pdev->dev.platform_data;
|
||||
struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct m48t59_private *m48t59 = NULL;
|
||||
struct resource *res;
|
||||
int ret = -ENOMEM;
|
||||
|
|
|
@ -46,7 +46,7 @@ static int m48t86_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
|||
{
|
||||
unsigned char reg;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t86_ops *ops = pdev->dev.platform_data;
|
||||
struct m48t86_ops *ops = dev_get_platdata(&pdev->dev);
|
||||
|
||||
reg = ops->readbyte(M48T86_REG_B);
|
||||
|
||||
|
@ -84,7 +84,7 @@ static int m48t86_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
|||
{
|
||||
unsigned char reg;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t86_ops *ops = pdev->dev.platform_data;
|
||||
struct m48t86_ops *ops = dev_get_platdata(&pdev->dev);
|
||||
|
||||
reg = ops->readbyte(M48T86_REG_B);
|
||||
|
||||
|
@ -123,7 +123,7 @@ static int m48t86_rtc_proc(struct device *dev, struct seq_file *seq)
|
|||
{
|
||||
unsigned char reg;
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct m48t86_ops *ops = pdev->dev.platform_data;
|
||||
struct m48t86_ops *ops = dev_get_platdata(&pdev->dev);
|
||||
|
||||
reg = ops->readbyte(M48T86_REG_B);
|
||||
|
||||
|
@ -147,7 +147,7 @@ static const struct rtc_class_ops m48t86_rtc_ops = {
|
|||
static int m48t86_rtc_probe(struct platform_device *dev)
|
||||
{
|
||||
unsigned char reg;
|
||||
struct m48t86_ops *ops = dev->dev.platform_data;
|
||||
struct m48t86_ops *ops = dev_get_platdata(&dev->dev);
|
||||
struct rtc_device *rtc;
|
||||
|
||||
rtc = devm_rtc_device_register(&dev->dev, "m48t86",
|
||||
|
|
|
@ -164,14 +164,7 @@ static int max6900_i2c_read_time(struct i2c_client *client, struct rtc_time *tm)
|
|||
|
||||
static int max6900_i2c_clear_write_protect(struct i2c_client *client)
|
||||
{
|
||||
int rc;
|
||||
rc = i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0);
|
||||
if (rc < 0) {
|
||||
dev_err(&client->dev, "%s: control register write failed\n",
|
||||
__func__);
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
return i2c_smbus_write_byte_data(client, MAX6900_REG_CONTROL_WRITE, 0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
|
|
@ -380,7 +380,6 @@ static int vrtc_mrst_do_probe(struct device *dev, struct resource *iomem,
|
|||
cleanup1:
|
||||
rtc_device_unregister(mrst_rtc.rtc);
|
||||
cleanup0:
|
||||
dev_set_drvdata(dev, NULL);
|
||||
mrst_rtc.dev = NULL;
|
||||
release_mem_region(iomem->start, resource_size(iomem));
|
||||
dev_err(dev, "rtc-mrst: unable to initialise\n");
|
||||
|
@ -412,7 +411,6 @@ static void rtc_mrst_do_remove(struct device *dev)
|
|||
mrst->iomem = NULL;
|
||||
|
||||
mrst->dev = NULL;
|
||||
dev_set_drvdata(dev, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
|
@ -553,7 +553,7 @@ static struct platform_driver omap_rtc_driver = {
|
|||
.name = DRIVER_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &omap_rtc_pm_ops,
|
||||
.of_match_table = of_match_ptr(omap_rtc_of_match),
|
||||
.of_match_table = omap_rtc_of_match,
|
||||
},
|
||||
.id_table = omap_rtc_devtype,
|
||||
};
|
||||
|
|
|
@ -327,7 +327,7 @@ kfree_exit:
|
|||
|
||||
static int pcf2123_remove(struct spi_device *spi)
|
||||
{
|
||||
struct pcf2123_plat_data *pdata = spi->dev.platform_data;
|
||||
struct pcf2123_plat_data *pdata = dev_get_platdata(&spi->dev);
|
||||
int i;
|
||||
|
||||
if (pdata) {
|
||||
|
|
|
@ -106,7 +106,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id)
|
|||
if (ret)
|
||||
goto err_req;
|
||||
|
||||
rtc = kmalloc(sizeof(*rtc), GFP_KERNEL);
|
||||
rtc = devm_kzalloc(&dev->dev, sizeof(*rtc), GFP_KERNEL);
|
||||
if (!rtc) {
|
||||
ret = -ENOMEM;
|
||||
goto err_rtc;
|
||||
|
@ -115,7 +115,7 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id)
|
|||
rtc->base = ioremap(dev->res.start, resource_size(&dev->res));
|
||||
if (!rtc->base) {
|
||||
ret = -ENOMEM;
|
||||
goto err_map;
|
||||
goto err_rtc;
|
||||
}
|
||||
|
||||
__raw_writel(0, rtc->base + RTC_CR);
|
||||
|
@ -141,8 +141,6 @@ static int pl030_probe(struct amba_device *dev, const struct amba_id *id)
|
|||
free_irq(dev->irq[0], rtc);
|
||||
err_irq:
|
||||
iounmap(rtc->base);
|
||||
err_map:
|
||||
kfree(rtc);
|
||||
err_rtc:
|
||||
amba_release_regions(dev);
|
||||
err_req:
|
||||
|
@ -153,14 +151,11 @@ static int pl030_remove(struct amba_device *dev)
|
|||
{
|
||||
struct pl030_rtc *rtc = amba_get_drvdata(dev);
|
||||
|
||||
amba_set_drvdata(dev, NULL);
|
||||
|
||||
writel(0, rtc->base + RTC_CR);
|
||||
|
||||
free_irq(dev->irq[0], rtc);
|
||||
rtc_device_unregister(rtc->rtc);
|
||||
iounmap(rtc->base);
|
||||
kfree(rtc);
|
||||
amba_release_regions(dev);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -305,7 +305,6 @@ static int pl031_remove(struct amba_device *adev)
|
|||
{
|
||||
struct pl031_local *ldata = dev_get_drvdata(&adev->dev);
|
||||
|
||||
amba_set_drvdata(adev, NULL);
|
||||
free_irq(adev->irq[0], ldata);
|
||||
rtc_device_unregister(ldata->rtc);
|
||||
iounmap(ldata->base);
|
||||
|
@ -391,7 +390,6 @@ out_no_irq:
|
|||
rtc_device_unregister(ldata->rtc);
|
||||
out_no_rtc:
|
||||
iounmap(ldata->base);
|
||||
amba_set_drvdata(adev, NULL);
|
||||
out_no_remap:
|
||||
kfree(ldata);
|
||||
out:
|
||||
|
|
|
@ -53,11 +53,11 @@ static irqreturn_t puv3_rtc_tickirq(int irq, void *id)
|
|||
}
|
||||
|
||||
/* Update control registers */
|
||||
static void puv3_rtc_setaie(int to)
|
||||
static void puv3_rtc_setaie(struct device *dev, int to)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
pr_debug("%s: aie=%d\n", __func__, to);
|
||||
dev_dbg(dev, "%s: aie=%d\n", __func__, to);
|
||||
|
||||
tmp = readl(RTC_RTSR) & ~RTC_RTSR_ALE;
|
||||
|
||||
|
@ -71,7 +71,7 @@ static int puv3_rtc_setpie(struct device *dev, int enabled)
|
|||
{
|
||||
unsigned int tmp;
|
||||
|
||||
pr_debug("%s: pie=%d\n", __func__, enabled);
|
||||
dev_debug(dev, "%s: pie=%d\n", __func__, enabled);
|
||||
|
||||
spin_lock_irq(&puv3_rtc_pie_lock);
|
||||
tmp = readl(RTC_RTSR) & ~RTC_RTSR_HZE;
|
||||
|
@ -90,7 +90,7 @@ static int puv3_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
|
|||
{
|
||||
rtc_time_to_tm(readl(RTC_RCNR), rtc_tm);
|
||||
|
||||
pr_debug("read time %02x.%02x.%02x %02x/%02x/%02x\n",
|
||||
dev_dbg(dev, "read time %02x.%02x.%02x %02x/%02x/%02x\n",
|
||||
rtc_tm->tm_year, rtc_tm->tm_mon, rtc_tm->tm_mday,
|
||||
rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec);
|
||||
|
||||
|
@ -101,7 +101,7 @@ static int puv3_rtc_settime(struct device *dev, struct rtc_time *tm)
|
|||
{
|
||||
unsigned long rtc_count = 0;
|
||||
|
||||
pr_debug("set time %02d.%02d.%02d %02d/%02d/%02d\n",
|
||||
dev_dbg(dev, "set time %02d.%02d.%02d %02d/%02d/%02d\n",
|
||||
tm->tm_year, tm->tm_mon, tm->tm_mday,
|
||||
tm->tm_hour, tm->tm_min, tm->tm_sec);
|
||||
|
||||
|
@ -119,7 +119,7 @@ static int puv3_rtc_getalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|||
|
||||
alrm->enabled = readl(RTC_RTSR) & RTC_RTSR_ALE;
|
||||
|
||||
pr_debug("read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n",
|
||||
dev_dbg(dev, "read alarm %02x %02x.%02x.%02x %02x/%02x/%02x\n",
|
||||
alrm->enabled,
|
||||
alm_tm->tm_year, alm_tm->tm_mon, alm_tm->tm_mday,
|
||||
alm_tm->tm_hour, alm_tm->tm_min, alm_tm->tm_sec);
|
||||
|
@ -132,7 +132,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|||
struct rtc_time *tm = &alrm->time;
|
||||
unsigned long rtcalarm_count = 0;
|
||||
|
||||
pr_debug("puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n",
|
||||
dev_dbg(dev, "puv3_rtc_setalarm: %d, %02x/%02x/%02x %02x.%02x.%02x\n",
|
||||
alrm->enabled,
|
||||
tm->tm_mday & 0xff, tm->tm_mon & 0xff, tm->tm_year & 0xff,
|
||||
tm->tm_hour & 0xff, tm->tm_min & 0xff, tm->tm_sec);
|
||||
|
@ -140,7 +140,7 @@ static int puv3_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
|
|||
rtc_tm_to_time(tm, &rtcalarm_count);
|
||||
writel(rtcalarm_count, RTC_RTAR);
|
||||
|
||||
puv3_rtc_setaie(alrm->enabled);
|
||||
puv3_rtc_setaie(&dev->dev, alrm->enabled);
|
||||
|
||||
if (alrm->enabled)
|
||||
enable_irq_wake(puv3_rtc_alarmno);
|
||||
|
@ -227,7 +227,7 @@ static int puv3_rtc_remove(struct platform_device *dev)
|
|||
rtc_device_unregister(rtc);
|
||||
|
||||
puv3_rtc_setpie(&dev->dev, 0);
|
||||
puv3_rtc_setaie(0);
|
||||
puv3_rtc_setaie(&dev->dev, 0);
|
||||
|
||||
release_resource(puv3_rtc_mem);
|
||||
kfree(puv3_rtc_mem);
|
||||
|
@ -241,7 +241,7 @@ static int puv3_rtc_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
pr_debug("%s: probe=%p\n", __func__, pdev);
|
||||
dev_dbg(&pdev->dev, "%s: probe=%p\n", __func__, pdev);
|
||||
|
||||
/* find the IRQs */
|
||||
puv3_rtc_tickno = platform_get_irq(pdev, 1);
|
||||
|
@ -256,7 +256,7 @@ static int puv3_rtc_probe(struct platform_device *pdev)
|
|||
return -ENOENT;
|
||||
}
|
||||
|
||||
pr_debug("PKUnity_rtc: tick irq %d, alarm irq %d\n",
|
||||
dev_dbg(&pdev->dev, "PKUnity_rtc: tick irq %d, alarm irq %d\n",
|
||||
puv3_rtc_tickno, puv3_rtc_alarmno);
|
||||
|
||||
/* get the memory region */
|
||||
|
|
|
@ -64,7 +64,7 @@ static int
|
|||
rs5c348_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
struct rs5c348_plat_data *pdata = spi->dev.platform_data;
|
||||
struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev);
|
||||
u8 txbuf[5+7], *txp;
|
||||
int ret;
|
||||
|
||||
|
@ -100,7 +100,7 @@ static int
|
|||
rs5c348_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
struct rs5c348_plat_data *pdata = spi->dev.platform_data;
|
||||
struct rs5c348_plat_data *pdata = dev_get_platdata(&spi->dev);
|
||||
u8 txbuf[5], rxbuf[7];
|
||||
int ret;
|
||||
|
||||
|
|
|
@ -0,0 +1,635 @@
|
|||
/*
|
||||
* Copyright (c) 2013 Samsung Electronics Co., Ltd
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* Copyright (C) 2013 Google, Inc
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mfd/samsung/core.h>
|
||||
#include <linux/mfd/samsung/irq.h>
|
||||
#include <linux/mfd/samsung/rtc.h>
|
||||
|
||||
struct s5m_rtc_info {
|
||||
struct device *dev;
|
||||
struct sec_pmic_dev *s5m87xx;
|
||||
struct regmap *rtc;
|
||||
struct rtc_device *rtc_dev;
|
||||
int irq;
|
||||
int device_type;
|
||||
int rtc_24hr_mode;
|
||||
bool wtsr_smpl;
|
||||
};
|
||||
|
||||
static void s5m8767_data_to_tm(u8 *data, struct rtc_time *tm,
|
||||
int rtc_24hr_mode)
|
||||
{
|
||||
tm->tm_sec = data[RTC_SEC] & 0x7f;
|
||||
tm->tm_min = data[RTC_MIN] & 0x7f;
|
||||
if (rtc_24hr_mode) {
|
||||
tm->tm_hour = data[RTC_HOUR] & 0x1f;
|
||||
} else {
|
||||
tm->tm_hour = data[RTC_HOUR] & 0x0f;
|
||||
if (data[RTC_HOUR] & HOUR_PM_MASK)
|
||||
tm->tm_hour += 12;
|
||||
}
|
||||
|
||||
tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f);
|
||||
tm->tm_mday = data[RTC_DATE] & 0x1f;
|
||||
tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
|
||||
tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100;
|
||||
tm->tm_yday = 0;
|
||||
tm->tm_isdst = 0;
|
||||
}
|
||||
|
||||
static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data)
|
||||
{
|
||||
data[RTC_SEC] = tm->tm_sec;
|
||||
data[RTC_MIN] = tm->tm_min;
|
||||
|
||||
if (tm->tm_hour >= 12)
|
||||
data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK;
|
||||
else
|
||||
data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK;
|
||||
|
||||
data[RTC_WEEKDAY] = 1 << tm->tm_wday;
|
||||
data[RTC_DATE] = tm->tm_mday;
|
||||
data[RTC_MONTH] = tm->tm_mon + 1;
|
||||
data[RTC_YEAR1] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0;
|
||||
|
||||
if (tm->tm_year < 100) {
|
||||
pr_err("s5m8767 RTC cannot handle the year %d.\n",
|
||||
1900 + tm->tm_year);
|
||||
return -EINVAL;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
|
||||
{
|
||||
int ret;
|
||||
unsigned int data;
|
||||
|
||||
ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data);
|
||||
if (ret < 0) {
|
||||
dev_err(info->dev, "failed to read update reg(%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
data |= RTC_TIME_EN_MASK;
|
||||
data |= RTC_UDR_MASK;
|
||||
|
||||
ret = regmap_write(info->rtc, SEC_RTC_UDR_CON, data);
|
||||
if (ret < 0) {
|
||||
dev_err(info->dev, "failed to write update reg(%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
do {
|
||||
ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data);
|
||||
} while ((data & RTC_UDR_MASK) && !ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
|
||||
{
|
||||
int ret;
|
||||
unsigned int data;
|
||||
|
||||
ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data);
|
||||
if (ret < 0) {
|
||||
dev_err(info->dev, "%s: fail to read update reg(%d)\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
data &= ~RTC_TIME_EN_MASK;
|
||||
data |= RTC_UDR_MASK;
|
||||
|
||||
ret = regmap_write(info->rtc, SEC_RTC_UDR_CON, data);
|
||||
if (ret < 0) {
|
||||
dev_err(info->dev, "%s: fail to write update reg(%d)\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
do {
|
||||
ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &data);
|
||||
} while ((data & RTC_UDR_MASK) && !ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void s5m8763_data_to_tm(u8 *data, struct rtc_time *tm)
|
||||
{
|
||||
tm->tm_sec = bcd2bin(data[RTC_SEC]);
|
||||
tm->tm_min = bcd2bin(data[RTC_MIN]);
|
||||
|
||||
if (data[RTC_HOUR] & HOUR_12) {
|
||||
tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f);
|
||||
if (data[RTC_HOUR] & HOUR_PM)
|
||||
tm->tm_hour += 12;
|
||||
} else {
|
||||
tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f);
|
||||
}
|
||||
|
||||
tm->tm_wday = data[RTC_WEEKDAY] & 0x07;
|
||||
tm->tm_mday = bcd2bin(data[RTC_DATE]);
|
||||
tm->tm_mon = bcd2bin(data[RTC_MONTH]);
|
||||
tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100;
|
||||
tm->tm_year -= 1900;
|
||||
}
|
||||
|
||||
static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data)
|
||||
{
|
||||
data[RTC_SEC] = bin2bcd(tm->tm_sec);
|
||||
data[RTC_MIN] = bin2bcd(tm->tm_min);
|
||||
data[RTC_HOUR] = bin2bcd(tm->tm_hour);
|
||||
data[RTC_WEEKDAY] = tm->tm_wday;
|
||||
data[RTC_DATE] = bin2bcd(tm->tm_mday);
|
||||
data[RTC_MONTH] = bin2bcd(tm->tm_mon);
|
||||
data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100);
|
||||
data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100);
|
||||
}
|
||||
|
||||
static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct s5m_rtc_info *info = dev_get_drvdata(dev);
|
||||
u8 data[8];
|
||||
int ret;
|
||||
|
||||
ret = regmap_bulk_read(info->rtc, SEC_RTC_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (info->device_type) {
|
||||
case S5M8763X:
|
||||
s5m8763_data_to_tm(data, tm);
|
||||
break;
|
||||
|
||||
case S5M8767X:
|
||||
s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
|
||||
1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
|
||||
tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
|
||||
|
||||
return rtc_valid_tm(tm);
|
||||
}
|
||||
|
||||
static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct s5m_rtc_info *info = dev_get_drvdata(dev);
|
||||
u8 data[8];
|
||||
int ret = 0;
|
||||
|
||||
switch (info->device_type) {
|
||||
case S5M8763X:
|
||||
s5m8763_tm_to_data(tm, data);
|
||||
break;
|
||||
case S5M8767X:
|
||||
ret = s5m8767_tm_to_data(tm, data);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
|
||||
1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
|
||||
tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
|
||||
|
||||
ret = regmap_raw_write(info->rtc, SEC_RTC_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = s5m8767_rtc_set_time_reg(info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
{
|
||||
struct s5m_rtc_info *info = dev_get_drvdata(dev);
|
||||
u8 data[8];
|
||||
unsigned int val;
|
||||
int ret, i;
|
||||
|
||||
ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
switch (info->device_type) {
|
||||
case S5M8763X:
|
||||
s5m8763_data_to_tm(data, &alrm->time);
|
||||
ret = regmap_read(info->rtc, SEC_ALARM0_CONF, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
alrm->enabled = !!val;
|
||||
|
||||
ret = regmap_read(info->rtc, SEC_RTC_STATUS, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
break;
|
||||
|
||||
case S5M8767X:
|
||||
s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
|
||||
dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
|
||||
1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
|
||||
alrm->time.tm_mday, alrm->time.tm_hour,
|
||||
alrm->time.tm_min, alrm->time.tm_sec,
|
||||
alrm->time.tm_wday);
|
||||
|
||||
alrm->enabled = 0;
|
||||
for (i = 0; i < 7; i++) {
|
||||
if (data[i] & ALARM_ENABLE_MASK) {
|
||||
alrm->enabled = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
alrm->pending = 0;
|
||||
ret = regmap_read(info->rtc, SEC_RTC_STATUS, &val);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (val & ALARM0_STATUS)
|
||||
alrm->pending = 1;
|
||||
else
|
||||
alrm->pending = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
|
||||
{
|
||||
u8 data[8];
|
||||
int ret, i;
|
||||
struct rtc_time tm;
|
||||
|
||||
ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
|
||||
dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
|
||||
1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
|
||||
|
||||
switch (info->device_type) {
|
||||
case S5M8763X:
|
||||
ret = regmap_write(info->rtc, SEC_ALARM0_CONF, 0);
|
||||
break;
|
||||
|
||||
case S5M8767X:
|
||||
for (i = 0; i < 7; i++)
|
||||
data[i] &= ~ALARM_ENABLE_MASK;
|
||||
|
||||
ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = s5m8767_rtc_set_alarm_reg(info);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
|
||||
{
|
||||
int ret;
|
||||
u8 data[8];
|
||||
u8 alarm0_conf;
|
||||
struct rtc_time tm;
|
||||
|
||||
ret = regmap_bulk_read(info->rtc, SEC_ALARM0_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
|
||||
dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
|
||||
1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
|
||||
tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
|
||||
|
||||
switch (info->device_type) {
|
||||
case S5M8763X:
|
||||
alarm0_conf = 0x77;
|
||||
ret = regmap_write(info->rtc, SEC_ALARM0_CONF, alarm0_conf);
|
||||
break;
|
||||
|
||||
case S5M8767X:
|
||||
data[RTC_SEC] |= ALARM_ENABLE_MASK;
|
||||
data[RTC_MIN] |= ALARM_ENABLE_MASK;
|
||||
data[RTC_HOUR] |= ALARM_ENABLE_MASK;
|
||||
data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
|
||||
if (data[RTC_DATE] & 0x1f)
|
||||
data[RTC_DATE] |= ALARM_ENABLE_MASK;
|
||||
if (data[RTC_MONTH] & 0xf)
|
||||
data[RTC_MONTH] |= ALARM_ENABLE_MASK;
|
||||
if (data[RTC_YEAR1] & 0x7f)
|
||||
data[RTC_YEAR1] |= ALARM_ENABLE_MASK;
|
||||
|
||||
ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = s5m8767_rtc_set_alarm_reg(info);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
|
||||
{
|
||||
struct s5m_rtc_info *info = dev_get_drvdata(dev);
|
||||
u8 data[8];
|
||||
int ret;
|
||||
|
||||
switch (info->device_type) {
|
||||
case S5M8763X:
|
||||
s5m8763_tm_to_data(&alrm->time, data);
|
||||
break;
|
||||
|
||||
case S5M8767X:
|
||||
s5m8767_tm_to_data(&alrm->time, data);
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
|
||||
1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
|
||||
alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min,
|
||||
alrm->time.tm_sec, alrm->time.tm_wday);
|
||||
|
||||
ret = s5m_rtc_stop_alarm(info);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = regmap_raw_write(info->rtc, SEC_ALARM0_SEC, data, 8);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = s5m8767_rtc_set_alarm_reg(info);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (alrm->enabled)
|
||||
ret = s5m_rtc_start_alarm(info);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int s5m_rtc_alarm_irq_enable(struct device *dev,
|
||||
unsigned int enabled)
|
||||
{
|
||||
struct s5m_rtc_info *info = dev_get_drvdata(dev);
|
||||
|
||||
if (enabled)
|
||||
return s5m_rtc_start_alarm(info);
|
||||
else
|
||||
return s5m_rtc_stop_alarm(info);
|
||||
}
|
||||
|
||||
static irqreturn_t s5m_rtc_alarm_irq(int irq, void *data)
|
||||
{
|
||||
struct s5m_rtc_info *info = data;
|
||||
|
||||
rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops s5m_rtc_ops = {
|
||||
.read_time = s5m_rtc_read_time,
|
||||
.set_time = s5m_rtc_set_time,
|
||||
.read_alarm = s5m_rtc_read_alarm,
|
||||
.set_alarm = s5m_rtc_set_alarm,
|
||||
.alarm_irq_enable = s5m_rtc_alarm_irq_enable,
|
||||
};
|
||||
|
||||
static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable)
|
||||
{
|
||||
int ret;
|
||||
ret = regmap_update_bits(info->rtc, SEC_WTSR_SMPL_CNTL,
|
||||
WTSR_ENABLE_MASK,
|
||||
enable ? WTSR_ENABLE_MASK : 0);
|
||||
if (ret < 0)
|
||||
dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable)
|
||||
{
|
||||
int ret;
|
||||
ret = regmap_update_bits(info->rtc, SEC_WTSR_SMPL_CNTL,
|
||||
SMPL_ENABLE_MASK,
|
||||
enable ? SMPL_ENABLE_MASK : 0);
|
||||
if (ret < 0)
|
||||
dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n",
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
|
||||
{
|
||||
u8 data[2];
|
||||
unsigned int tp_read;
|
||||
int ret;
|
||||
struct rtc_time tm;
|
||||
|
||||
ret = regmap_read(info->rtc, SEC_RTC_UDR_CON, &tp_read);
|
||||
if (ret < 0) {
|
||||
dev_err(info->dev, "%s: fail to read control reg(%d)\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Set RTC control register : Binary mode, 24hour mode */
|
||||
data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
|
||||
data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
|
||||
|
||||
info->rtc_24hr_mode = 1;
|
||||
ret = regmap_raw_write(info->rtc, SEC_ALARM0_CONF, data, 2);
|
||||
if (ret < 0) {
|
||||
dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* In first boot time, Set rtc time to 1/1/2012 00:00:00(SUN) */
|
||||
if ((tp_read & RTC_TCON_MASK) == 0) {
|
||||
dev_dbg(info->dev, "rtc init\n");
|
||||
tm.tm_sec = 0;
|
||||
tm.tm_min = 0;
|
||||
tm.tm_hour = 0;
|
||||
tm.tm_wday = 0;
|
||||
tm.tm_mday = 1;
|
||||
tm.tm_mon = 0;
|
||||
tm.tm_year = 112;
|
||||
tm.tm_yday = 0;
|
||||
tm.tm_isdst = 0;
|
||||
ret = s5m_rtc_set_time(info->dev, &tm);
|
||||
}
|
||||
|
||||
ret = regmap_update_bits(info->rtc, SEC_RTC_UDR_CON,
|
||||
RTC_TCON_MASK, tp_read | RTC_TCON_MASK);
|
||||
if (ret < 0)
|
||||
dev_err(info->dev, "%s: fail to update TCON reg(%d)\n",
|
||||
__func__, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int s5m_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
|
||||
struct sec_platform_data *pdata = s5m87xx->pdata;
|
||||
struct s5m_rtc_info *info;
|
||||
int ret;
|
||||
|
||||
if (!pdata) {
|
||||
dev_err(pdev->dev.parent, "Platform data not supplied\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
info->dev = &pdev->dev;
|
||||
info->s5m87xx = s5m87xx;
|
||||
info->rtc = s5m87xx->rtc;
|
||||
info->device_type = s5m87xx->device_type;
|
||||
info->wtsr_smpl = s5m87xx->wtsr_smpl;
|
||||
|
||||
switch (pdata->device_type) {
|
||||
case S5M8763X:
|
||||
info->irq = s5m87xx->irq_base + S5M8763_IRQ_ALARM0;
|
||||
break;
|
||||
|
||||
case S5M8767X:
|
||||
info->irq = s5m87xx->irq_base + S5M8767_IRQ_RTCA1;
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
dev_err(&pdev->dev, "Unsupported device type: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
|
||||
ret = s5m8767_rtc_init_reg(info);
|
||||
|
||||
if (info->wtsr_smpl) {
|
||||
s5m_rtc_enable_wtsr(info, true);
|
||||
s5m_rtc_enable_smpl(info, true);
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc",
|
||||
&s5m_rtc_ops, THIS_MODULE);
|
||||
|
||||
if (IS_ERR(info->rtc_dev))
|
||||
return PTR_ERR(info->rtc_dev);
|
||||
|
||||
ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
|
||||
s5m_rtc_alarm_irq, 0, "rtc-alarm0",
|
||||
info);
|
||||
if (ret < 0)
|
||||
dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
|
||||
info->irq, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void s5m_rtc_shutdown(struct platform_device *pdev)
|
||||
{
|
||||
struct s5m_rtc_info *info = platform_get_drvdata(pdev);
|
||||
int i;
|
||||
unsigned int val = 0;
|
||||
if (info->wtsr_smpl) {
|
||||
for (i = 0; i < 3; i++) {
|
||||
s5m_rtc_enable_wtsr(info, false);
|
||||
regmap_read(info->rtc, SEC_WTSR_SMPL_CNTL, &val);
|
||||
pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val);
|
||||
if (val & WTSR_ENABLE_MASK)
|
||||
pr_emerg("%s: fail to disable WTSR\n",
|
||||
__func__);
|
||||
else {
|
||||
pr_info("%s: success to disable WTSR\n",
|
||||
__func__);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Disable SMPL when power off */
|
||||
s5m_rtc_enable_smpl(info, false);
|
||||
}
|
||||
|
||||
static const struct platform_device_id s5m_rtc_id[] = {
|
||||
{ "s5m-rtc", 0 },
|
||||
};
|
||||
|
||||
static struct platform_driver s5m_rtc_driver = {
|
||||
.driver = {
|
||||
.name = "s5m-rtc",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = s5m_rtc_probe,
|
||||
.shutdown = s5m_rtc_shutdown,
|
||||
.id_table = s5m_rtc_id,
|
||||
};
|
||||
|
||||
module_platform_driver(s5m_rtc_driver);
|
||||
|
||||
/* Module information */
|
||||
MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
|
||||
MODULE_DESCRIPTION("Samsung S5M RTC driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_ALIAS("platform:s5m-rtc");
|
|
@ -649,8 +649,9 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
|
|||
clk_enable(rtc->clk);
|
||||
|
||||
rtc->capabilities = RTC_DEF_CAPABILITIES;
|
||||
if (pdev->dev.platform_data) {
|
||||
struct sh_rtc_platform_info *pinfo = pdev->dev.platform_data;
|
||||
if (dev_get_platdata(&pdev->dev)) {
|
||||
struct sh_rtc_platform_info *pinfo =
|
||||
dev_get_platdata(&pdev->dev);
|
||||
|
||||
/*
|
||||
* Some CPUs have special capabilities in addition to the
|
||||
|
|
|
@ -59,7 +59,7 @@ static int sirfsoc_rtc_read_alarm(struct device *dev,
|
|||
unsigned long rtc_alarm, rtc_count;
|
||||
struct sirfsoc_rtc_drv *rtcdrv;
|
||||
|
||||
rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev);
|
||||
rtcdrv = dev_get_drvdata(dev);
|
||||
|
||||
local_irq_disable();
|
||||
|
||||
|
@ -94,7 +94,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev,
|
|||
{
|
||||
unsigned long rtc_status_reg, rtc_alarm;
|
||||
struct sirfsoc_rtc_drv *rtcdrv;
|
||||
rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev);
|
||||
rtcdrv = dev_get_drvdata(dev);
|
||||
|
||||
if (alrm->enabled) {
|
||||
rtc_tm_to_time(&(alrm->time), &rtc_alarm);
|
||||
|
@ -157,7 +157,7 @@ static int sirfsoc_rtc_read_time(struct device *dev,
|
|||
{
|
||||
unsigned long tmp_rtc = 0;
|
||||
struct sirfsoc_rtc_drv *rtcdrv;
|
||||
rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev);
|
||||
rtcdrv = dev_get_drvdata(dev);
|
||||
/*
|
||||
* This patch is taken from WinCE - Need to validate this for
|
||||
* correctness. To work around sirfsoc RTC counter double sync logic
|
||||
|
@ -178,7 +178,7 @@ static int sirfsoc_rtc_set_time(struct device *dev,
|
|||
{
|
||||
unsigned long rtc_time;
|
||||
struct sirfsoc_rtc_drv *rtcdrv;
|
||||
rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev);
|
||||
rtcdrv = dev_get_drvdata(dev);
|
||||
|
||||
rtc_tm_to_time(tm, &rtc_time);
|
||||
|
||||
|
@ -274,7 +274,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)
|
|||
err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n");
|
||||
goto error;
|
||||
return err;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, rtcdrv);
|
||||
|
@ -290,7 +290,7 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)
|
|||
rtc_div = ((32768 / RTC_HZ) / 2) - 1;
|
||||
sirfsoc_rtc_iobrg_writel(rtc_div, rtcdrv->rtc_base + RTC_DIV);
|
||||
|
||||
rtcdrv->rtc = rtc_device_register(pdev->name, &(pdev->dev),
|
||||
rtcdrv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&sirfsoc_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(rtcdrv->rtc)) {
|
||||
err = PTR_ERR(rtcdrv->rtc);
|
||||
|
@ -322,24 +322,15 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)
|
|||
rtcdrv);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Unable to register for the SiRF SOC RTC IRQ\n");
|
||||
goto error;
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
if (rtcdrv->rtc)
|
||||
rtc_device_unregister(rtcdrv->rtc);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int sirfsoc_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
rtc_device_unregister(rtcdrv->rtc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -373,7 +364,7 @@ static int sirfsoc_rtc_thaw(struct device *dev)
|
|||
{
|
||||
u32 tmp;
|
||||
struct sirfsoc_rtc_drv *rtcdrv;
|
||||
rtcdrv = (struct sirfsoc_rtc_drv *)dev_get_drvdata(dev);
|
||||
rtcdrv = dev_get_drvdata(dev);
|
||||
|
||||
/*
|
||||
* if resume from snapshot and the rtc power is losed,
|
||||
|
@ -467,7 +458,7 @@ static struct platform_driver sirfsoc_rtc_driver = {
|
|||
#ifdef CONFIG_PM
|
||||
.pm = &sirfsoc_rtc_pm_ops,
|
||||
#endif
|
||||
.of_match_table = of_match_ptr(sirfsoc_rtc_of_match),
|
||||
.of_match_table = sirfsoc_rtc_of_match,
|
||||
},
|
||||
.probe = sirfsoc_rtc_probe,
|
||||
.remove = sirfsoc_rtc_remove,
|
||||
|
|
|
@ -329,7 +329,7 @@ static struct platform_driver snvs_rtc_driver = {
|
|||
.name = "snvs_rtc",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &snvs_rtc_pm_ops,
|
||||
.of_match_table = of_match_ptr(snvs_dt_ids),
|
||||
.of_match_table = snvs_dt_ids,
|
||||
},
|
||||
.probe = snvs_rtc_probe,
|
||||
};
|
||||
|
|
|
@ -343,7 +343,7 @@ static struct platform_driver stmp3xxx_rtcdrv = {
|
|||
.name = "stmp3xxx-rtc",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &stmp3xxx_rtc_pm_ops,
|
||||
.of_match_table = of_match_ptr(rtc_dt_ids),
|
||||
.of_match_table = rtc_dt_ids,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/rtc.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mfd/tps65910.h>
|
||||
|
||||
|
|
|
@ -303,7 +303,7 @@ static const struct rtc_class_ops v3020_rtc_ops = {
|
|||
|
||||
static int rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct v3020_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct v3020_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct v3020 *chip;
|
||||
int retval = -EBUSY;
|
||||
int i;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -27,11 +28,10 @@
|
|||
#include <linux/rtc.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/log2.h>
|
||||
|
||||
#include <asm/div64.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
MODULE_AUTHOR("Yoichi Yuasa <yuasa@linux-mips.org>");
|
||||
MODULE_DESCRIPTION("NEC VR4100 series RTC driver");
|
||||
|
|
|
@ -228,7 +228,7 @@ static int vt8500_rtc_probe(struct platform_device *pdev)
|
|||
vt8500_rtc->irq_alarm = platform_get_irq(pdev, 0);
|
||||
if (vt8500_rtc->irq_alarm < 0) {
|
||||
dev_err(&pdev->dev, "No alarm IRQ resource defined\n");
|
||||
return -ENXIO;
|
||||
return vt8500_rtc->irq_alarm;
|
||||
}
|
||||
|
||||
vt8500_rtc->res = devm_request_mem_region(&pdev->dev,
|
||||
|
@ -296,7 +296,7 @@ static struct platform_driver vt8500_rtc_driver = {
|
|||
.driver = {
|
||||
.name = "vt8500-rtc",
|
||||
.owner = THIS_MODULE,
|
||||
.of_match_table = of_match_ptr(wmt_dt_ids),
|
||||
.of_match_table = wmt_dt_ids,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -165,7 +165,7 @@
|
|||
#define LUSTRE_EHOSTUNREACH 113 /* No route to host */
|
||||
#define LUSTRE_EALREADY 114 /* Operation already in progress */
|
||||
#define LUSTRE_EINPROGRESS 115 /* Operation now in progress */
|
||||
#define LUSTRE_ESTALE 116 /* Stale NFS file handle */
|
||||
#define LUSTRE_ESTALE 116 /* Stale file handle */
|
||||
#define LUSTRE_EUCLEAN 117 /* Structure needs cleaning */
|
||||
#define LUSTRE_ENOTNAM 118 /* Not a XENIX named type file */
|
||||
#define LUSTRE_ENAVAIL 119 /* No XENIX semaphores available */
|
||||
|
|
|
@ -158,14 +158,12 @@ static int pruss_probe(struct platform_device *dev)
|
|||
if (pdata->sram_pool) {
|
||||
gdev->sram_pool = pdata->sram_pool;
|
||||
gdev->sram_vaddr =
|
||||
gen_pool_alloc(gdev->sram_pool, sram_pool_sz);
|
||||
(unsigned long)gen_pool_dma_alloc(gdev->sram_pool,
|
||||
sram_pool_sz, &gdev->sram_paddr);
|
||||
if (!gdev->sram_vaddr) {
|
||||
dev_err(&dev->dev, "Could not allocate SRAM pool\n");
|
||||
goto out_free;
|
||||
}
|
||||
gdev->sram_paddr =
|
||||
gen_pool_virt_to_phys(gdev->sram_pool,
|
||||
gdev->sram_vaddr);
|
||||
}
|
||||
|
||||
gdev->ddr_vaddr = dma_alloc_coherent(&dev->dev, extram_pool_sz,
|
||||
|
|
|
@ -949,9 +949,7 @@ free_unused_pages(unsigned int virtual_start, unsigned int virtual_end)
|
|||
* the page.
|
||||
*/
|
||||
page = virt_to_page(virtual_start);
|
||||
ClearPageReserved(page);
|
||||
init_page_count(page);
|
||||
free_page(virtual_start);
|
||||
__free_reserved_page(page);
|
||||
|
||||
virtual_start += PAGE_SIZE;
|
||||
mb_freed += PAGE_SIZE / 1024;
|
||||
|
|
|
@ -196,7 +196,7 @@ static int pm860x_backlight_dt_init(struct platform_device *pdev,
|
|||
static int pm860x_backlight_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
|
||||
struct pm860x_backlight_pdata *pdata = pdev->dev.platform_data;
|
||||
struct pm860x_backlight_pdata *pdata = dev_get_platdata(&pdev->dev);
|
||||
struct pm860x_backlight_data *data;
|
||||
struct backlight_device *bl;
|
||||
struct resource *res;
|
||||
|
@ -243,7 +243,7 @@ static int pm860x_backlight_probe(struct platform_device *pdev)
|
|||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = MAX_BRIGHTNESS;
|
||||
bl = backlight_device_register(name, &pdev->dev, data,
|
||||
bl = devm_backlight_device_register(&pdev->dev, name, &pdev->dev, data,
|
||||
&pm860x_backlight_ops, &props);
|
||||
if (IS_ERR(bl)) {
|
||||
dev_err(&pdev->dev, "failed to register backlight\n");
|
||||
|
@ -256,21 +256,10 @@ static int pm860x_backlight_probe(struct platform_device *pdev)
|
|||
/* read current backlight */
|
||||
ret = pm860x_backlight_get_brightness(bl);
|
||||
if (ret < 0)
|
||||
goto out_brt;
|
||||
return ret;
|
||||
|
||||
backlight_update_status(bl);
|
||||
return 0;
|
||||
out_brt:
|
||||
backlight_device_unregister(bl);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int pm860x_backlight_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct backlight_device *bl = platform_get_drvdata(pdev);
|
||||
|
||||
backlight_device_unregister(bl);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver pm860x_backlight_driver = {
|
||||
|
@ -279,7 +268,6 @@ static struct platform_driver pm860x_backlight_driver = {
|
|||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = pm860x_backlight_probe,
|
||||
.remove = pm860x_backlight_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(pm860x_backlight_driver);
|
||||
|
|
|
@ -368,12 +368,12 @@ config BACKLIGHT_AAT2870
|
|||
If you have a AnalogicTech AAT2870 say Y to enable the
|
||||
backlight driver.
|
||||
|
||||
config BACKLIGHT_LM3630
|
||||
tristate "Backlight Driver for LM3630"
|
||||
config BACKLIGHT_LM3630A
|
||||
tristate "Backlight Driver for LM3630A"
|
||||
depends on BACKLIGHT_CLASS_DEVICE && I2C
|
||||
select REGMAP_I2C
|
||||
help
|
||||
This supports TI LM3630 Backlight Driver
|
||||
This supports TI LM3630A Backlight Driver
|
||||
|
||||
config BACKLIGHT_LM3639
|
||||
tristate "Backlight Driver for LM3639"
|
||||
|
@ -388,8 +388,8 @@ config BACKLIGHT_LP855X
|
|||
tristate "Backlight driver for TI LP855X"
|
||||
depends on BACKLIGHT_CLASS_DEVICE && I2C
|
||||
help
|
||||
This supports TI LP8550, LP8551, LP8552, LP8553, LP8556 and LP8557
|
||||
backlight driver.
|
||||
This supports TI LP8550, LP8551, LP8552, LP8553, LP8555, LP8556 and
|
||||
LP8557 backlight driver.
|
||||
|
||||
config BACKLIGHT_LP8788
|
||||
tristate "Backlight driver for TI LP8788 MFD"
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче