Merge branch 'akpm' (incoming from Andrew)
Merge first patch-bomb from Andrew Morton: - Various misc bits - kmemleak fixes - small befs, codafs, cifs, efs, freexxfs, hfsplus, minixfs, reiserfs things - fanotify - I appear to have become SuperH maintainer - ocfs2 updates - direct-io tweaks - a bit of the MM queue - printk updates - MAINTAINERS maintenance - some backlight things - lib/ updates - checkpatch updates - the rtc queue - nilfs2 updates - Small Documentation/ updates * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (237 commits) Documentation/SubmittingPatches: remove references to patch-scripts Documentation/SubmittingPatches: update some dead URLs Documentation/filesystems/ntfs.txt: remove changelog reference Documentation/kmemleak.txt: updates fs/reiserfs/super.c: add __init to init_inodecache fs/reiserfs: move prototype declaration to header file fs/hfsplus/attributes.c: add __init to hfsplus_create_attr_tree_cache() fs/hfsplus/extents.c: fix concurrent acess of alloc_blocks fs/hfsplus/extents.c: remove unused variable in hfsplus_get_block nilfs2: update project's web site in nilfs2.txt nilfs2: update MAINTAINERS file entries fix nilfs2: verify metadata sizes read from disk nilfs2: add FITRIM ioctl support for nilfs2 nilfs2: add nilfs_sufile_trim_fs to trim clean segs nilfs2: implementation of NILFS_IOCTL_SET_SUINFO ioctl nilfs2: add nilfs_sufile_set_suinfo to update segment usage nilfs2: add struct nilfs_suinfo_update and flags nilfs2: update MAINTAINERS file entries fs/coda/inode.c: add __init to init_inodecache() BEFS: logging cleanup ...
This commit is contained in:
commit
76ca7d1cca
7
CREDITS
7
CREDITS
@ -2564,6 +2564,10 @@ N: Wolfgang Muees
|
||||
E: wolfgang@iksw-muees.de
|
||||
D: Auerswald USB driver
|
||||
|
||||
N: Paul Mundt
|
||||
E: paul.mundt@gmail.com
|
||||
D: SuperH maintainer
|
||||
|
||||
N: Ian A. Murdock
|
||||
E: imurdock@gnu.ai.mit.edu
|
||||
D: Creator of Debian distribution
|
||||
@ -2707,6 +2711,9 @@ N: Greg Page
|
||||
E: gpage@sovereign.org
|
||||
D: IPX development and support
|
||||
|
||||
N: Venkatesh Pallipadi (Venki)
|
||||
D: x86/HPET
|
||||
|
||||
N: David Parsons
|
||||
E: orc@pell.chi.il.us
|
||||
D: improved memory detection code.
|
||||
|
@ -14,7 +14,10 @@ Read Documentation/SubmitChecklist for a list of items to check
|
||||
before submitting code. If you are submitting a driver, also read
|
||||
Documentation/SubmittingDrivers.
|
||||
|
||||
|
||||
Many of these steps describe the default behavior of the git version
|
||||
control system; if you use git to prepare your patches, you'll find much
|
||||
of the mechanical work done for you, though you'll still need to prepare
|
||||
and document a sensible set of patches.
|
||||
|
||||
--------------------------------------------
|
||||
SECTION 1 - CREATING AND SENDING YOUR CHANGE
|
||||
@ -25,7 +28,9 @@ SECTION 1 - CREATING AND SENDING YOUR CHANGE
|
||||
1) "diff -up"
|
||||
------------
|
||||
|
||||
Use "diff -up" or "diff -uprN" to create patches.
|
||||
Use "diff -up" or "diff -uprN" to create patches. git generates patches
|
||||
in this form by default; if you're using git, you can skip this section
|
||||
entirely.
|
||||
|
||||
All changes to the Linux kernel occur in the form of patches, as
|
||||
generated by diff(1). When creating your patch, make sure to create it
|
||||
@ -66,19 +71,14 @@ Make sure your patch does not include any extra files which do not
|
||||
belong in a patch submission. Make sure to review your patch -after-
|
||||
generated it with diff(1), to ensure accuracy.
|
||||
|
||||
If your changes produce a lot of deltas, you may want to look into
|
||||
splitting them into individual patches which modify things in
|
||||
logical stages. This will facilitate easier reviewing by other
|
||||
kernel developers, very important if you want your patch accepted.
|
||||
There are a number of scripts which can aid in this:
|
||||
If your changes produce a lot of deltas, you need to split them into
|
||||
individual patches which modify things in logical stages; see section
|
||||
#3. This will facilitate easier reviewing by other kernel developers,
|
||||
very important if you want your patch accepted.
|
||||
|
||||
Quilt:
|
||||
http://savannah.nongnu.org/projects/quilt
|
||||
|
||||
Andrew Morton's patch scripts:
|
||||
http://userweb.kernel.org/~akpm/stuff/patch-scripts.tar.gz
|
||||
Instead of these scripts, quilt is the recommended patch management
|
||||
tool (see above).
|
||||
If you're using git, "git rebase -i" can help you with this process. If
|
||||
you're not using git, quilt <http://savannah.nongnu.org/projects/quilt>
|
||||
is another popular alternative.
|
||||
|
||||
|
||||
|
||||
@ -106,8 +106,21 @@ I.e., the patch (series) and its description should be self-contained.
|
||||
This benefits both the patch merger(s) and reviewers. Some reviewers
|
||||
probably didn't even receive earlier versions of the patch.
|
||||
|
||||
Describe your changes in imperative mood, e.g. "make xyzzy do frotz"
|
||||
instead of "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy
|
||||
to do frotz", as if you are giving orders to the codebase to change
|
||||
its behaviour.
|
||||
|
||||
If the patch fixes a logged bug entry, refer to that bug entry by
|
||||
number and URL.
|
||||
number and URL. If the patch follows from a mailing list discussion,
|
||||
give a URL to the mailing list archive; use the https://lkml.kernel.org/
|
||||
redirector with a Message-Id, to ensure that the links cannot become
|
||||
stale.
|
||||
|
||||
However, try to make your explanation understandable without external
|
||||
resources. In addition to giving a URL to a mailing list archive or
|
||||
bug, summarize the relevant points of the discussion that led to the
|
||||
patch as submitted.
|
||||
|
||||
If you want to refer to a specific commit, don't just refer to the
|
||||
SHA-1 ID of the commit. Please also include the oneline summary of
|
||||
@ -594,7 +607,8 @@ patch.
|
||||
If you are going to include a diffstat after the "---" marker, please
|
||||
use diffstat options "-p 1 -w 70" so that filenames are listed from
|
||||
the top of the kernel source tree and don't use too much horizontal
|
||||
space (easily fit in 80 columns, maybe with some indentation).
|
||||
space (easily fit in 80 columns, maybe with some indentation). (git
|
||||
generates appropriate diffstats by default.)
|
||||
|
||||
See more details on the proper patch format in the following
|
||||
references.
|
||||
@ -725,7 +739,7 @@ SECTION 3 - REFERENCES
|
||||
----------------------
|
||||
|
||||
Andrew Morton, "The perfect patch" (tpp).
|
||||
<http://userweb.kernel.org/~akpm/stuff/tpp.txt>
|
||||
<http://www.ozlabs.org/~akpm/stuff/tpp.txt>
|
||||
|
||||
Jeff Garzik, "Linux kernel patch submission format".
|
||||
<http://linux.yyz.us/patch-format.html>
|
||||
@ -738,7 +752,7 @@ Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer".
|
||||
<http://www.kroah.com/log/linux/maintainer-05.html>
|
||||
|
||||
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
|
||||
<http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
|
||||
<https://lkml.org/lkml/2005/7/11/336>
|
||||
|
||||
Kernel Documentation/CodingStyle:
|
||||
<http://users.sosdg.org/~qiyong/lxr/source/Documentation/CodingStyle>
|
||||
|
@ -3,7 +3,7 @@
|
||||
RTC controller for the Allwinner A10/A20
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "allwinner,sun4i-rtc" or "allwinner,sun7i-a20-rtc"
|
||||
- compatible : Should be "allwinner,sun4i-a10-rtc" or "allwinner,sun7i-a20-rtc"
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: IRQ line for the RTC.
|
||||
@ -11,7 +11,7 @@ Required properties:
|
||||
Example:
|
||||
|
||||
rtc: rtc@01c20d00 {
|
||||
compatible = "allwinner,sun4i-rtc";
|
||||
compatible = "allwinner,sun4i-a10-rtc";
|
||||
reg = <0x01c20d00 0x20>;
|
||||
interrupts = <24>;
|
||||
};
|
||||
|
@ -25,9 +25,8 @@ available from the following download page. At least "mkfs.nilfs2",
|
||||
cleaner or garbage collector) are required. Details on the tools are
|
||||
described in the man pages included in the package.
|
||||
|
||||
Project web page: http://www.nilfs.org/en/
|
||||
Download page: http://www.nilfs.org/en/download.html
|
||||
Git tree web page: http://www.nilfs.org/git/
|
||||
Project web page: http://nilfs.sourceforge.net/
|
||||
Download page: http://nilfs.sourceforge.net/en/download.html
|
||||
List info: http://vger.kernel.org/vger-lists.html#linux-nilfs
|
||||
|
||||
Caveats
|
||||
@ -111,6 +110,13 @@ Table of NILFS2 specific ioctls
|
||||
nilfs_resize utilities and by nilfs_cleanerd
|
||||
daemon.
|
||||
|
||||
NILFS_IOCTL_SET_SUINFO Modify segment usage info of requested
|
||||
segments. This ioctl is used by
|
||||
nilfs_cleanerd daemon to skip unnecessary
|
||||
cleaning operation of segments and reduce
|
||||
performance penalty or wear of flash device
|
||||
due to redundant move of in-use blocks.
|
||||
|
||||
NILFS_IOCTL_GET_SUSTAT Return segment usage statistics. This ioctl
|
||||
is used in lssu, nilfs_resize utilities and
|
||||
by nilfs_cleanerd daemon.
|
||||
|
@ -455,8 +455,6 @@ not have this problem with odd numbers of sectors.
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
|
||||
|
||||
2.1.30:
|
||||
- Fix writev() (it kept writing the first segment over and over again
|
||||
instead of moving onto subsequent segments).
|
||||
|
@ -295,9 +295,9 @@ in the beginning of ->setattr unconditionally.
|
||||
->clear_inode() and ->delete_inode() are gone; ->evict_inode() should
|
||||
be used instead. It gets called whenever the inode is evicted, whether it has
|
||||
remaining links or not. Caller does *not* evict the pagecache or inode-associated
|
||||
metadata buffers; getting rid of those is responsibility of method, as it had
|
||||
been for ->delete_inode(). Caller makes sure async writeback cannot be running
|
||||
for the inode while (or after) ->evict_inode() is called.
|
||||
metadata buffers; the method has to use truncate_inode_pages_final() to get rid
|
||||
of those. Caller makes sure async writeback cannot be running for the inode while
|
||||
(or after) ->evict_inode() is called.
|
||||
|
||||
->drop_inode() returns int now; it's called on final iput() with
|
||||
inode->i_lock held and it returns true if filesystems wants the inode to be
|
||||
|
@ -98,11 +98,6 @@ dontdiff ファイルには Linux カーネルのビルドプロセスの過程
|
||||
Quilt:
|
||||
http://savannah.nongnu.org/projects/quilt
|
||||
|
||||
Andrew Morton's patch scripts:
|
||||
http://userweb.kernel.org/~akpm/stuff/patch-scripts.tar.gz
|
||||
このリンクの先のスクリプトの代わりとして、quilt がパッチマネジメント
|
||||
ツールとして推奨されています(上のリンクを見てください)。
|
||||
|
||||
2) パッチに対する説明
|
||||
|
||||
パッチの中の変更点に対する技術的な詳細について説明してください。
|
||||
@ -695,7 +690,7 @@ gcc においては、マクロと同じくらい軽いです。
|
||||
----------------------
|
||||
|
||||
Andrew Morton, "The perfect patch" (tpp).
|
||||
<http://userweb.kernel.org/~akpm/stuff/tpp.txt>
|
||||
<http://www.ozlabs.org/~akpm/stuff/tpp.txt>
|
||||
|
||||
Jeff Garzik, "Linux kernel patch submission format".
|
||||
<http://linux.yyz.us/patch-format.html>
|
||||
@ -707,7 +702,7 @@ Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer".
|
||||
<http://www.kroah.com/log/2006/01/11/>
|
||||
|
||||
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
|
||||
<http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
|
||||
<https://lkml.org/lkml/2005/7/11/336>
|
||||
|
||||
Kernel Documentation/CodingStyle:
|
||||
<http://users.sosdg.org/~qiyong/lxr/source/Documentation/CodingStyle>
|
||||
|
@ -11,9 +11,7 @@ with the difference that the orphan objects are not freed but only
|
||||
reported via /sys/kernel/debug/kmemleak. A similar method is used by the
|
||||
Valgrind tool (memcheck --leak-check) to detect the memory leaks in
|
||||
user-space applications.
|
||||
|
||||
Please check DEBUG_KMEMLEAK dependencies in lib/Kconfig.debug for supported
|
||||
architectures.
|
||||
Kmemleak is supported on x86, arm, powerpc, sparc, sh, microblaze, ppc, mips, s390, metag and tile.
|
||||
|
||||
Usage
|
||||
-----
|
||||
@ -53,7 +51,8 @@ Memory scanning parameters can be modified at run-time by writing to the
|
||||
(default 600, 0 to stop the automatic scanning)
|
||||
scan - trigger a memory scan
|
||||
clear - clear list of current memory leak suspects, done by
|
||||
marking all current reported unreferenced objects grey
|
||||
marking all current reported unreferenced objects grey,
|
||||
or free all kmemleak objects if kmemleak has been disabled.
|
||||
dump=<addr> - dump information about the object found at <addr>
|
||||
|
||||
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
|
||||
@ -68,7 +67,7 @@ Basic Algorithm
|
||||
|
||||
The memory allocations via kmalloc, vmalloc, kmem_cache_alloc and
|
||||
friends are traced and the pointers, together with additional
|
||||
information like size and stack trace, are stored in a prio search tree.
|
||||
information like size and stack trace, are stored in a rbtree.
|
||||
The corresponding freeing function calls are tracked and the pointers
|
||||
removed from the kmemleak data structures.
|
||||
|
||||
@ -84,7 +83,7 @@ The scanning algorithm steps:
|
||||
1. mark all objects as white (remaining white objects will later be
|
||||
considered orphan)
|
||||
2. scan the memory starting with the data section and stacks, checking
|
||||
the values against the addresses stored in the prio search tree. If
|
||||
the values against the addresses stored in the rbtree. If
|
||||
a pointer to a white object is found, the object is added to the
|
||||
gray list
|
||||
3. scan the gray objects for matching addresses (some white objects
|
||||
@ -120,6 +119,18 @@ Then as usual to get your report with:
|
||||
|
||||
# cat /sys/kernel/debug/kmemleak
|
||||
|
||||
Freeing kmemleak internal objects
|
||||
---------------------------------
|
||||
|
||||
To allow access to previosuly found memory leaks after kmemleak has been
|
||||
disabled by the user or due to an fatal error, internal kmemleak objects
|
||||
won't be freed when kmemleak is disabled, and those objects may occupy
|
||||
a large part of physical memory.
|
||||
|
||||
In this situation, you may reclaim memory with:
|
||||
|
||||
# echo clear > /sys/kernel/debug/kmemleak
|
||||
|
||||
Kmemleak API
|
||||
------------
|
||||
|
||||
|
@ -175,18 +175,39 @@ Setting this to zero disables periodic writeback altogether.
|
||||
|
||||
drop_caches
|
||||
|
||||
Writing to this will cause the kernel to drop clean caches, dentries and
|
||||
inodes from memory, causing that memory to become free.
|
||||
Writing to this will cause the kernel to drop clean caches, as well as
|
||||
reclaimable slab objects like dentries and inodes. Once dropped, their
|
||||
memory becomes free.
|
||||
|
||||
To free pagecache:
|
||||
echo 1 > /proc/sys/vm/drop_caches
|
||||
To free dentries and inodes:
|
||||
To free reclaimable slab objects (includes dentries and inodes):
|
||||
echo 2 > /proc/sys/vm/drop_caches
|
||||
To free pagecache, dentries and inodes:
|
||||
To free slab objects and pagecache:
|
||||
echo 3 > /proc/sys/vm/drop_caches
|
||||
|
||||
As this is a non-destructive operation and dirty objects are not freeable, the
|
||||
user should run `sync' first.
|
||||
This is a non-destructive operation and will not free any dirty objects.
|
||||
To increase the number of objects freed by this operation, the user may run
|
||||
`sync' prior to writing to /proc/sys/vm/drop_caches. This will minimize the
|
||||
number of dirty objects on the system and create more candidates to be
|
||||
dropped.
|
||||
|
||||
This file is not a means to control the growth of the various kernel caches
|
||||
(inodes, dentries, pagecache, etc...) These objects are automatically
|
||||
reclaimed by the kernel when memory is needed elsewhere on the system.
|
||||
|
||||
Use of this file can cause performance problems. Since it discards cached
|
||||
objects, it may cost a significant amount of I/O and CPU to recreate the
|
||||
dropped objects, especially if they were under heavy use. Because of this,
|
||||
use outside of a testing or debugging environment is not recommended.
|
||||
|
||||
You may see informational messages in your kernel log when this file is
|
||||
used:
|
||||
|
||||
cat (1234): drop_caches: 3
|
||||
|
||||
These are informational only. They do not mean that anything is wrong
|
||||
with your system. To disable them, echo 4 (bit 3) into drop_caches.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
@ -82,10 +82,6 @@ Documentation/SubmittingDrivers 。
|
||||
Quilt:
|
||||
http://savannah.nongnu.org/projects/quilt
|
||||
|
||||
Andrew Morton 的补丁脚本:
|
||||
http://userweb.kernel.org/~akpm/stuff/patch-scripts.tar.gz
|
||||
作为这些脚本的替代,quilt 是值得推荐的补丁管理工具(看上面的链接)。
|
||||
|
||||
2)描述你的改动。
|
||||
描述你的改动包含的技术细节。
|
||||
|
||||
@ -394,7 +390,7 @@ Static inline 函数相比宏来说,是好得多的选择。Static inline 函
|
||||
----------------
|
||||
|
||||
Andrew Morton, "The perfect patch" (tpp).
|
||||
<http://userweb.kernel.org/~akpm/stuff/tpp.txt>
|
||||
<http://www.ozlabs.org/~akpm/stuff/tpp.txt>
|
||||
|
||||
Jeff Garzik, "Linux kernel patch submission format".
|
||||
<http://linux.yyz.us/patch-format.html>
|
||||
@ -406,7 +402,7 @@ Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer".
|
||||
<http://www.kroah.com/log/2006/01/11/>
|
||||
|
||||
NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
|
||||
<http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
|
||||
<https://lkml.org/lkml/2005/7/11/336>
|
||||
|
||||
Kernel Documentation/CodingStyle:
|
||||
<http://sosdg.org/~coywolf/lxr/source/Documentation/CodingStyle>
|
||||
|
46
MAINTAINERS
46
MAINTAINERS
@ -1704,6 +1704,8 @@ F: drivers/net/wireless/b43legacy/
|
||||
|
||||
BACKLIGHT CLASS/SUBSYSTEM
|
||||
M: Jingoo Han <jg1.han@samsung.com>
|
||||
M: Bryan Wu <cooloney@gmail.com>
|
||||
M: Lee Jones <lee.jones@linaro.org>
|
||||
S: Maintained
|
||||
F: drivers/video/backlight/
|
||||
F: include/linux/backlight.h
|
||||
@ -2728,6 +2730,31 @@ F: include/linux/device-mapper.h
|
||||
F: include/linux/dm-*.h
|
||||
F: include/uapi/linux/dm-*.h
|
||||
|
||||
DIALOG SEMICONDUCTOR DRIVERS
|
||||
M: Support Opensource <support.opensource@diasemi.com>
|
||||
W: http://www.dialog-semiconductor.com/products
|
||||
S: Supported
|
||||
F: Documentation/hwmon/da90??
|
||||
F: drivers/gpio/gpio-da90??.c
|
||||
F: drivers/hwmon/da90??-hwmon.c
|
||||
F: drivers/input/misc/da90??_onkey.c
|
||||
F: drivers/input/touchscreen/da9052_tsi.c
|
||||
F: drivers/leds/leds-da90??.c
|
||||
F: drivers/mfd/da903x.c
|
||||
F: drivers/mfd/da90??-*.c
|
||||
F: drivers/power/da9052-battery.c
|
||||
F: drivers/regulator/da903x.c
|
||||
F: drivers/regulator/da9???-regulator.[ch]
|
||||
F: drivers/rtc/rtc-da90??.c
|
||||
F: drivers/video/backlight/da90??_bl.c
|
||||
F: drivers/watchdog/da90??_wdt.c
|
||||
F: include/linux/mfd/da903x.h
|
||||
F: include/linux/mfd/da9052/
|
||||
F: include/linux/mfd/da9055/
|
||||
F: include/linux/mfd/da9063/
|
||||
F: include/sound/da[79]*.h
|
||||
F: sound/soc/codecs/da[79]*.[ch]
|
||||
|
||||
DIGI NEO AND CLASSIC PCI PRODUCTS
|
||||
M: Lidza Louina <lidza.louina@gmail.com>
|
||||
L: driverdev-devel@linuxdriverproject.org
|
||||
@ -4128,8 +4155,7 @@ F: include/linux/hpet.h
|
||||
F: include/uapi/linux/hpet.h
|
||||
|
||||
HPET: x86
|
||||
M: "Venkatesh Pallipadi (Venki)" <venki@google.com>
|
||||
S: Maintained
|
||||
S: Orphan
|
||||
F: arch/x86/kernel/hpet.c
|
||||
F: arch/x86/include/asm/hpet.h
|
||||
|
||||
@ -4620,7 +4646,7 @@ F: arch/x86/kernel/tboot.c
|
||||
INTEL WIRELESS WIMAX CONNECTION 2400
|
||||
M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
|
||||
M: linux-wimax@intel.com
|
||||
L: wimax@linuxwimax.org
|
||||
L: wimax@linuxwimax.org (subscribers-only)
|
||||
S: Supported
|
||||
W: http://linuxwimax.org
|
||||
F: Documentation/wimax/README.i2400m
|
||||
@ -5734,7 +5760,6 @@ F: fs/imgdafs/
|
||||
|
||||
MICROBLAZE ARCHITECTURE
|
||||
M: Michal Simek <monstr@monstr.eu>
|
||||
L: microblaze-uclinux@itee.uq.edu.au (moderated for non-subscribers)
|
||||
W: http://www.monstr.eu/fdt/
|
||||
T: git git://git.monstr.eu/linux-2.6-microblaze.git
|
||||
S: Supported
|
||||
@ -6156,10 +6181,10 @@ F: include/uapi/linux/nfs*
|
||||
F: include/uapi/linux/sunrpc/
|
||||
|
||||
NILFS2 FILESYSTEM
|
||||
M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
|
||||
M: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
|
||||
L: linux-nilfs@vger.kernel.org
|
||||
W: http://www.nilfs.org/en/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2.git
|
||||
W: http://nilfs.sourceforge.net/
|
||||
T: git git://github.com/konis/nilfs2.git
|
||||
S: Supported
|
||||
F: Documentation/filesystems/nilfs2.txt
|
||||
F: fs/nilfs2/
|
||||
@ -8476,12 +8501,10 @@ S: Maintained
|
||||
F: drivers/net/ethernet/dlink/sundance.c
|
||||
|
||||
SUPERH
|
||||
M: Paul Mundt <lethal@linux-sh.org>
|
||||
L: linux-sh@vger.kernel.org
|
||||
W: http://www.linux-sh.org
|
||||
Q: http://patchwork.kernel.org/project/linux-sh/list/
|
||||
T: git git://github.com/pmundt/linux-sh.git sh-latest
|
||||
S: Supported
|
||||
S: Orphan
|
||||
F: Documentation/sh/
|
||||
F: arch/sh/
|
||||
F: drivers/sh/
|
||||
@ -8765,6 +8788,7 @@ M: Max Filippov <jcmvbkbc@gmail.com>
|
||||
L: linux-xtensa@linux-xtensa.org
|
||||
S: Maintained
|
||||
F: arch/xtensa/
|
||||
F: drivers/irqchip/irq-xtensa-*
|
||||
|
||||
THANKO'S RAREMONO AM/FM/SW RADIO RECEIVER USB DRIVER
|
||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
||||
@ -9656,7 +9680,7 @@ F: drivers/media/rc/winbond-cir.c
|
||||
WIMAX STACK
|
||||
M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
|
||||
M: linux-wimax@intel.com
|
||||
L: wimax@linuxwimax.org
|
||||
L: wimax@linuxwimax.org (subscribers-only)
|
||||
S: Supported
|
||||
W: http://linuxwimax.org
|
||||
F: Documentation/wimax/README.wimax
|
||||
|
@ -415,7 +415,7 @@
|
||||
};
|
||||
|
||||
rtc: rtc@01c20d00 {
|
||||
compatible = "allwinner,sun4i-rtc";
|
||||
compatible = "allwinner,sun4i-a10-rtc";
|
||||
reg = <0x01c20d00 0x20>;
|
||||
interrupts = <24>;
|
||||
};
|
||||
|
@ -22,27 +22,21 @@ choice
|
||||
config ARCH_SCORE7
|
||||
bool "SCORE7 processor"
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SCORE7
|
||||
select GENERIC_HAS_IOMAP
|
||||
|
||||
config MACH_SPCT6600
|
||||
bool "SPCT6600 series based machines"
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SCORE7
|
||||
select GENERIC_HAS_IOMAP
|
||||
|
||||
config SCORE_SIM
|
||||
bool "Score simulator"
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select CPU_SCORE7
|
||||
select GENERIC_HAS_IOMAP
|
||||
endchoice
|
||||
|
||||
endmenu
|
||||
|
||||
config CPU_SCORE7
|
||||
bool
|
||||
|
||||
config NO_DMA
|
||||
bool
|
||||
default y
|
||||
|
@ -252,7 +252,7 @@ static struct sh_mobile_sdhi_info sdhi_info = {
|
||||
static struct resource sdhi_resources[] = {
|
||||
[0] = {
|
||||
.start = 0xffe50000,
|
||||
.end = 0xffe501ff,
|
||||
.end = 0xffe500ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
|
@ -145,9 +145,6 @@
|
||||
/* PCIERMSGIER */
|
||||
#define SH4A_PCIERMSGIER (0x004040) /* R/W - 0x0000 0000 32 */
|
||||
|
||||
/* PCIEPHYCTLR */
|
||||
#define SH4A_PCIEPHYCTLR (0x010000) /* R/W - 0x0000 0000 32 */
|
||||
|
||||
/* PCIEPHYADRR */
|
||||
#define SH4A_PCIEPHYADRR (0x010004) /* R/W - 0x0000 0000 32 */
|
||||
#define BITS_ACK (24) // Rev1.171
|
||||
|
@ -9,15 +9,9 @@
|
||||
|
||||
struct pt_regs;
|
||||
|
||||
asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage int sys_sigreturn(void);
|
||||
asmlinkage int sys_rt_sigreturn(void);
|
||||
asmlinkage int sys_sh_pipe(void);
|
||||
asmlinkage ssize_t sys_pread_wrapper(unsigned int fd, char __user *buf,
|
||||
size_t count, long dummy, loff_t pos);
|
||||
asmlinkage ssize_t sys_pwrite_wrapper(unsigned int fd, const char __user *buf,
|
||||
|
@ -42,18 +42,10 @@ static inline void trigger_address_error(void)
|
||||
asmlinkage void do_address_error(struct pt_regs *regs,
|
||||
unsigned long writeaccess,
|
||||
unsigned long address);
|
||||
asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs);
|
||||
asmlinkage void do_divide_error(unsigned long r4);
|
||||
asmlinkage void do_reserved_inst(void);
|
||||
asmlinkage void do_illegal_slot_inst(void);
|
||||
asmlinkage void do_exception_error(void);
|
||||
|
||||
#define BUILD_TRAP_HANDLER(name) \
|
||||
asmlinkage void name##_trap_handler(unsigned long r4, unsigned long r5, \
|
||||
|
@ -132,7 +132,7 @@ static struct clk_lookup lookups[] = {
|
||||
CLKDEV_CON_ID("usb_fck", &mstp_clks[MSTP103]),
|
||||
CLKDEV_DEV_ID("renesas_usbhs.0", &mstp_clks[MSTP102]),
|
||||
CLKDEV_CON_ID("mmc0", &mstp_clks[MSTP220]),
|
||||
CLKDEV_CON_ID("rspi2", &mstp_clks[MSTP127]),
|
||||
CLKDEV_DEV_ID("rspi.2", &mstp_clks[MSTP127]),
|
||||
};
|
||||
|
||||
int __init arch_clk_init(void)
|
||||
|
@ -115,7 +115,7 @@ static int print_trace_stack(void *data, char *name)
|
||||
*/
|
||||
static void print_trace_address(void *data, unsigned long addr, int reliable)
|
||||
{
|
||||
printk(data);
|
||||
printk("%s", (char *)data);
|
||||
printk_address(addr, reliable);
|
||||
}
|
||||
|
||||
|
@ -193,10 +193,10 @@ syscall_trace_entry:
|
||||
! Reload R0-R4 from kernel stack, where the
|
||||
! parent may have modified them using
|
||||
! ptrace(POKEUSR). (Note that R0-R2 are
|
||||
! used by the system call handler directly
|
||||
! from the kernel stack anyway, so don't need
|
||||
! to be reloaded here.) This allows the parent
|
||||
! to rewrite system calls and args on the fly.
|
||||
! reloaded from the kernel stack by syscall_call
|
||||
! below, so don't need to be reloaded here.)
|
||||
! This allows the parent to rewrite system calls
|
||||
! and args on the fly.
|
||||
mov.l @(OFF_R4,r15), r4 ! arg0
|
||||
mov.l @(OFF_R5,r15), r5
|
||||
mov.l @(OFF_R6,r15), r6
|
||||
@ -357,8 +357,15 @@ syscall_call:
|
||||
mov.l 3f, r8 ! Load the address of sys_call_table
|
||||
add r8, r3
|
||||
mov.l @r3, r8
|
||||
mov.l @(OFF_R2,r15), r2
|
||||
mov.l @(OFF_R1,r15), r1
|
||||
mov.l @(OFF_R0,r15), r0
|
||||
mov.l r2, @-r15
|
||||
mov.l r1, @-r15
|
||||
mov.l r0, @-r15
|
||||
jsr @r8 ! jump to specific syscall handler
|
||||
nop
|
||||
add #12, r15
|
||||
mov.l @(OFF_R0,r15), r12 ! save r0
|
||||
mov.l r0, @(OFF_R0,r15) ! save the return value
|
||||
!
|
||||
|
@ -148,11 +148,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *r0_p
|
||||
return err;
|
||||
}
|
||||
|
||||
asmlinkage int sys_sigreturn(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage int sys_sigreturn(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
struct sigframe __user *frame = (struct sigframe __user *)regs->regs[15];
|
||||
sigset_t set;
|
||||
int r0;
|
||||
@ -180,11 +178,9 @@ badframe:
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage int sys_rt_sigreturn(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage int sys_rt_sigreturn(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
struct rt_sigframe __user *frame = (struct rt_sigframe __user *)regs->regs[15];
|
||||
sigset_t set;
|
||||
int r0;
|
||||
|
@ -21,17 +21,14 @@
|
||||
* sys_pipe() is the normal C calling standard for creating
|
||||
* a pipe. It's not the way Unix traditionally does this, though.
|
||||
*/
|
||||
asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage int sys_sh_pipe(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
int fd[2];
|
||||
int error;
|
||||
|
||||
error = do_pipe_flags(fd, 0);
|
||||
if (!error) {
|
||||
regs->regs[1] = fd[1];
|
||||
current_pt_regs()->regs[1] = fd[1];
|
||||
return fd[0];
|
||||
}
|
||||
return error;
|
||||
|
@ -594,9 +594,7 @@ int is_dsp_inst(struct pt_regs *regs)
|
||||
#endif /* CONFIG_SH_DSP */
|
||||
|
||||
#ifdef CONFIG_CPU_SH2A
|
||||
asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_divide_error(unsigned long r4)
|
||||
{
|
||||
siginfo_t info;
|
||||
|
||||
@ -613,11 +611,9 @@ asmlinkage void do_divide_error(unsigned long r4, unsigned long r5,
|
||||
}
|
||||
#endif
|
||||
|
||||
asmlinkage void do_reserved_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_reserved_inst(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
unsigned long error_code;
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
@ -701,11 +697,9 @@ static int emulate_branch(unsigned short inst, struct pt_regs *regs)
|
||||
}
|
||||
#endif
|
||||
|
||||
asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_illegal_slot_inst(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
struct pt_regs *regs = current_pt_regs();
|
||||
unsigned long inst;
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
@ -730,15 +724,12 @@ asmlinkage void do_illegal_slot_inst(unsigned long r4, unsigned long r5,
|
||||
die_if_no_fixup("illegal slot instruction", regs, inst);
|
||||
}
|
||||
|
||||
asmlinkage void do_exception_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs __regs)
|
||||
asmlinkage void do_exception_error(void)
|
||||
{
|
||||
struct pt_regs *regs = RELOC_HIDE(&__regs, 0);
|
||||
long ex;
|
||||
|
||||
ex = lookup_exception_vector();
|
||||
die_if_kernel("exception", regs, ex);
|
||||
die_if_kernel("exception", current_pt_regs(), ex);
|
||||
}
|
||||
|
||||
void per_cpu_trap_init(void)
|
||||
|
@ -574,24 +574,6 @@ static int ieee_fpe_handler(struct pt_regs *regs)
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage void do_fpu_error(unsigned long r4, unsigned long r5,
|
||||
unsigned long r6, unsigned long r7,
|
||||
struct pt_regs regs)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
siginfo_t info;
|
||||
|
||||
if (ieee_fpe_handler (®s))
|
||||
return;
|
||||
|
||||
regs.pc += 2;
|
||||
info.si_signo = SIGFPE;
|
||||
info.si_errno = 0;
|
||||
info.si_code = FPE_FLTINV;
|
||||
info.si_addr = (void __user *)regs.pc;
|
||||
force_sig_info(SIGFPE, &info, tsk);
|
||||
}
|
||||
|
||||
/**
|
||||
* fpu_init - Initialize FPU registers
|
||||
* @fpu: Pointer to software emulated FPU registers.
|
||||
|
@ -573,6 +573,18 @@ config RTC_DRV_DS1305
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-ds1305.
|
||||
|
||||
config RTC_DRV_DS1347
|
||||
tristate "Dallas/Maxim DS1347"
|
||||
help
|
||||
If you say yes here you get support for the
|
||||
Dallas/Maxim DS1347 chips.
|
||||
|
||||
This driver only supports the RTC feature, and not other chip
|
||||
features such as alarms.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called rtc-ds1347.
|
||||
|
||||
config RTC_DRV_DS1390
|
||||
tristate "Dallas/Maxim DS1390/93/94"
|
||||
help
|
||||
|
@ -40,6 +40,7 @@ obj-$(CONFIG_RTC_DRV_DS1286) += rtc-ds1286.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1302) += rtc-ds1302.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1305) += rtc-ds1305.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1307) += rtc-ds1307.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1347) += rtc-ds1347.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1374) += rtc-ds1374.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1390) += rtc-ds1390.o
|
||||
obj-$(CONFIG_RTC_DRV_DS1511) += rtc-ds1511.o
|
||||
|
@ -584,6 +584,9 @@ enum hrtimer_restart rtc_pie_update_irq(struct hrtimer *timer)
|
||||
void rtc_update_irq(struct rtc_device *rtc,
|
||||
unsigned long num, unsigned long events)
|
||||
{
|
||||
if (unlikely(IS_ERR_OR_NULL(rtc)))
|
||||
return;
|
||||
|
||||
pm_stay_awake(rtc->dev.parent);
|
||||
schedule_work(&rtc->irqwork);
|
||||
}
|
||||
|
@ -242,9 +242,8 @@ static int as3722_rtc_resume(struct device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops as3722_rtc_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(as3722_rtc_suspend, as3722_rtc_resume)
|
||||
};
|
||||
static SIMPLE_DEV_PM_OPS(as3722_rtc_pm_ops, as3722_rtc_suspend,
|
||||
as3722_rtc_resume);
|
||||
|
||||
static struct platform_driver as3722_rtc_driver = {
|
||||
.probe = as3722_rtc_probe,
|
||||
|
@ -204,10 +204,8 @@ static int __init at32_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
rtc = devm_kzalloc(&pdev->dev, sizeof(struct rtc_at32ap700x),
|
||||
GFP_KERNEL);
|
||||
if (!rtc) {
|
||||
dev_dbg(&pdev->dev, "out of memory\n");
|
||||
if (!rtc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!regs) {
|
||||
|
@ -837,7 +837,7 @@ static void __exit cmos_do_remove(struct device *dev)
|
||||
cmos->dev = NULL;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
static int cmos_suspend(struct device *dev)
|
||||
{
|
||||
@ -935,8 +935,6 @@ static int cmos_resume(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(cmos_pm_ops, cmos_suspend, cmos_resume);
|
||||
|
||||
#else
|
||||
|
||||
static inline int cmos_poweroff(struct device *dev)
|
||||
@ -946,6 +944,8 @@ static inline int cmos_poweroff(struct device *dev)
|
||||
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(cmos_pm_ops, cmos_suspend, cmos_resume);
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
/* On non-x86 systems, a "CMOS" RTC lives most naturally on platform_bus.
|
||||
@ -1088,11 +1088,9 @@ static struct pnp_driver cmos_pnp_driver = {
|
||||
|
||||
/* flag ensures resume() gets called, and stops syslog spam */
|
||||
.flags = PNP_DRIVER_RES_DO_NOT_CHANGE,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.driver = {
|
||||
.pm = &cmos_pm_ops,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
#endif /* CONFIG_PNP */
|
||||
|
@ -43,8 +43,6 @@
|
||||
struct coh901331_port {
|
||||
struct rtc_device *rtc;
|
||||
struct clk *clk;
|
||||
u32 phybase;
|
||||
u32 physize;
|
||||
void __iomem *virtbase;
|
||||
int irq;
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -173,19 +171,9 @@ static int __init coh901331_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res)
|
||||
return -ENOENT;
|
||||
|
||||
rtap->phybase = res->start;
|
||||
rtap->physize = resource_size(res);
|
||||
|
||||
if (devm_request_mem_region(&pdev->dev, rtap->phybase, rtap->physize,
|
||||
"rtc-coh901331") == NULL)
|
||||
return -EBUSY;
|
||||
|
||||
rtap->virtbase = devm_ioremap(&pdev->dev, rtap->phybase, rtap->physize);
|
||||
if (!rtap->virtbase)
|
||||
return -ENOMEM;
|
||||
rtap->virtbase = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(rtap->virtbase))
|
||||
return PTR_ERR(rtap->virtbase);
|
||||
|
||||
rtap->irq = platform_get_irq(pdev, 0);
|
||||
if (devm_request_irq(&pdev->dev, rtap->irq, coh901331_interrupt, 0,
|
||||
|
@ -26,7 +26,6 @@
|
||||
struct da9052_rtc {
|
||||
struct rtc_device *rtc;
|
||||
struct da9052 *da9052;
|
||||
int irq;
|
||||
};
|
||||
|
||||
static int da9052_rtc_enable_alarm(struct da9052 *da9052, bool enable)
|
||||
@ -240,8 +239,7 @@ static int da9052_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
rtc->da9052 = dev_get_drvdata(pdev->dev.parent);
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
rtc->irq = DA9052_IRQ_ALARM;
|
||||
ret = da9052_request_irq(rtc->da9052, rtc->irq, "ALM",
|
||||
ret = da9052_request_irq(rtc->da9052, DA9052_IRQ_ALARM, "ALM",
|
||||
da9052_rtc_irq, rtc);
|
||||
if (ret != 0) {
|
||||
rtc_err(rtc->da9052, "irq registration failed: %d\n", ret);
|
||||
|
@ -302,7 +302,9 @@ static int da9055_rtc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
alm_irq = platform_get_irq_byname(pdev, "ALM");
|
||||
alm_irq = regmap_irq_get_virq(rtc->da9055->irq_data, alm_irq);
|
||||
if (alm_irq < 0)
|
||||
return alm_irq;
|
||||
|
||||
ret = devm_request_threaded_irq(&pdev->dev, alm_irq, NULL,
|
||||
da9055_rtc_alm_irq,
|
||||
IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
|
||||
|
@ -119,8 +119,6 @@ static DEFINE_SPINLOCK(davinci_rtc_lock);
|
||||
struct davinci_rtc {
|
||||
struct rtc_device *rtc;
|
||||
void __iomem *base;
|
||||
resource_size_t pbase;
|
||||
size_t base_size;
|
||||
int irq;
|
||||
};
|
||||
|
||||
@ -482,14 +480,12 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct davinci_rtc *davinci_rtc;
|
||||
struct resource *res, *mem;
|
||||
struct resource *res;
|
||||
int ret = 0;
|
||||
|
||||
davinci_rtc = devm_kzalloc(&pdev->dev, sizeof(struct davinci_rtc), GFP_KERNEL);
|
||||
if (!davinci_rtc) {
|
||||
dev_dbg(dev, "could not allocate memory for private data\n");
|
||||
if (!davinci_rtc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
davinci_rtc->irq = platform_get_irq(pdev, 0);
|
||||
if (davinci_rtc->irq < 0) {
|
||||
@ -498,28 +494,9 @@ static int __init davinci_rtc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(dev, "no mem resource\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
davinci_rtc->pbase = res->start;
|
||||
davinci_rtc->base_size = resource_size(res);
|
||||
|
||||
mem = devm_request_mem_region(dev, davinci_rtc->pbase,
|
||||
davinci_rtc->base_size, pdev->name);
|
||||
if (!mem) {
|
||||
dev_err(dev, "RTC registers at %08x are not free\n",
|
||||
davinci_rtc->pbase);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
davinci_rtc->base = devm_ioremap(dev, davinci_rtc->pbase,
|
||||
davinci_rtc->base_size);
|
||||
if (!davinci_rtc->base) {
|
||||
dev_err(dev, "unable to ioremap MEM resource\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
davinci_rtc->base = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(davinci_rtc->base))
|
||||
return PTR_ERR(davinci_rtc->base);
|
||||
|
||||
platform_set_drvdata(pdev, davinci_rtc);
|
||||
|
||||
|
@ -756,19 +756,17 @@ static int ds1305_probe(struct spi_device *spi)
|
||||
status = devm_request_irq(&spi->dev, spi->irq, ds1305_irq,
|
||||
0, dev_name(&ds1305->rtc->dev), ds1305);
|
||||
if (status < 0) {
|
||||
dev_dbg(&spi->dev, "request_irq %d --> %d\n",
|
||||
dev_err(&spi->dev, "request_irq %d --> %d\n",
|
||||
spi->irq, status);
|
||||
return status;
|
||||
} else {
|
||||
device_set_wakeup_capable(&spi->dev, 1);
|
||||
}
|
||||
|
||||
device_set_wakeup_capable(&spi->dev, 1);
|
||||
}
|
||||
|
||||
/* export NVRAM */
|
||||
status = sysfs_create_bin_file(&spi->dev.kobj, &nvram);
|
||||
if (status < 0) {
|
||||
dev_dbg(&spi->dev, "register nvram --> %d\n", status);
|
||||
return status;
|
||||
dev_err(&spi->dev, "register nvram --> %d\n", status);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -154,6 +154,7 @@ static const struct chip_desc chips[last_ds_type] = {
|
||||
.alarm = 1,
|
||||
},
|
||||
[mcp7941x] = {
|
||||
.alarm = 1,
|
||||
/* this is battery backed SRAM */
|
||||
.nvram_offset = 0x20,
|
||||
.nvram_size = 0x40,
|
||||
@ -606,6 +607,178 @@ static const struct rtc_class_ops ds13xx_rtc_ops = {
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Alarm support for mcp7941x devices.
|
||||
*/
|
||||
|
||||
#define MCP7941X_REG_CONTROL 0x07
|
||||
# define MCP7941X_BIT_ALM0_EN 0x10
|
||||
# define MCP7941X_BIT_ALM1_EN 0x20
|
||||
#define MCP7941X_REG_ALARM0_BASE 0x0a
|
||||
#define MCP7941X_REG_ALARM0_CTRL 0x0d
|
||||
#define MCP7941X_REG_ALARM1_BASE 0x11
|
||||
#define MCP7941X_REG_ALARM1_CTRL 0x14
|
||||
# define MCP7941X_BIT_ALMX_IF (1 << 3)
|
||||
# define MCP7941X_BIT_ALMX_C0 (1 << 4)
|
||||
# define MCP7941X_BIT_ALMX_C1 (1 << 5)
|
||||
# define MCP7941X_BIT_ALMX_C2 (1 << 6)
|
||||
# define MCP7941X_BIT_ALMX_POL (1 << 7)
|
||||
# define MCP7941X_MSK_ALMX_MATCH (MCP7941X_BIT_ALMX_C0 | \
|
||||
MCP7941X_BIT_ALMX_C1 | \
|
||||
MCP7941X_BIT_ALMX_C2)
|
||||
|
||||
static void mcp7941x_work(struct work_struct *work)
|
||||
{
|
||||
struct ds1307 *ds1307 = container_of(work, struct ds1307, work);
|
||||
struct i2c_client *client = ds1307->client;
|
||||
int reg, ret;
|
||||
|
||||
mutex_lock(&ds1307->rtc->ops_lock);
|
||||
|
||||
/* Check and clear alarm 0 interrupt flag. */
|
||||
reg = i2c_smbus_read_byte_data(client, MCP7941X_REG_ALARM0_CTRL);
|
||||
if (reg < 0)
|
||||
goto out;
|
||||
if (!(reg & MCP7941X_BIT_ALMX_IF))
|
||||
goto out;
|
||||
reg &= ~MCP7941X_BIT_ALMX_IF;
|
||||
ret = i2c_smbus_write_byte_data(client, MCP7941X_REG_ALARM0_CTRL, reg);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
/* Disable alarm 0. */
|
||||
reg = i2c_smbus_read_byte_data(client, MCP7941X_REG_CONTROL);
|
||||
if (reg < 0)
|
||||
goto out;
|
||||
reg &= ~MCP7941X_BIT_ALM0_EN;
|
||||
ret = i2c_smbus_write_byte_data(client, MCP7941X_REG_CONTROL, reg);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
rtc_update_irq(ds1307->rtc, 1, RTC_AF | RTC_IRQF);
|
||||
|
||||
out:
|
||||
if (test_bit(HAS_ALARM, &ds1307->flags))
|
||||
enable_irq(client->irq);
|
||||
mutex_unlock(&ds1307->rtc->ops_lock);
|
||||
}
|
||||
|
||||
static int mcp7941x_read_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct ds1307 *ds1307 = i2c_get_clientdata(client);
|
||||
u8 *regs = ds1307->regs;
|
||||
int ret;
|
||||
|
||||
if (!test_bit(HAS_ALARM, &ds1307->flags))
|
||||
return -EINVAL;
|
||||
|
||||
/* Read control and alarm 0 registers. */
|
||||
ret = ds1307->read_block_data(client, MCP7941X_REG_CONTROL, 10, regs);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
t->enabled = !!(regs[0] & MCP7941X_BIT_ALM0_EN);
|
||||
|
||||
/* Report alarm 0 time assuming 24-hour and day-of-month modes. */
|
||||
t->time.tm_sec = bcd2bin(ds1307->regs[3] & 0x7f);
|
||||
t->time.tm_min = bcd2bin(ds1307->regs[4] & 0x7f);
|
||||
t->time.tm_hour = bcd2bin(ds1307->regs[5] & 0x3f);
|
||||
t->time.tm_wday = bcd2bin(ds1307->regs[6] & 0x7) - 1;
|
||||
t->time.tm_mday = bcd2bin(ds1307->regs[7] & 0x3f);
|
||||
t->time.tm_mon = bcd2bin(ds1307->regs[8] & 0x1f) - 1;
|
||||
t->time.tm_year = -1;
|
||||
t->time.tm_yday = -1;
|
||||
t->time.tm_isdst = -1;
|
||||
|
||||
dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
|
||||
"enabled=%d polarity=%d irq=%d match=%d\n", __func__,
|
||||
t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
|
||||
t->time.tm_wday, t->time.tm_mday, t->time.tm_mon, t->enabled,
|
||||
!!(ds1307->regs[6] & MCP7941X_BIT_ALMX_POL),
|
||||
!!(ds1307->regs[6] & MCP7941X_BIT_ALMX_IF),
|
||||
(ds1307->regs[6] & MCP7941X_MSK_ALMX_MATCH) >> 4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mcp7941x_set_alarm(struct device *dev, struct rtc_wkalrm *t)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct ds1307 *ds1307 = i2c_get_clientdata(client);
|
||||
unsigned char *regs = ds1307->regs;
|
||||
int ret;
|
||||
|
||||
if (!test_bit(HAS_ALARM, &ds1307->flags))
|
||||
return -EINVAL;
|
||||
|
||||
dev_dbg(dev, "%s, sec=%d min=%d hour=%d wday=%d mday=%d mon=%d "
|
||||
"enabled=%d pending=%d\n", __func__,
|
||||
t->time.tm_sec, t->time.tm_min, t->time.tm_hour,
|
||||
t->time.tm_wday, t->time.tm_mday, t->time.tm_mon,
|
||||
t->enabled, t->pending);
|
||||
|
||||
/* Read control and alarm 0 registers. */
|
||||
ret = ds1307->read_block_data(client, MCP7941X_REG_CONTROL, 10, regs);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Set alarm 0, using 24-hour and day-of-month modes. */
|
||||
regs[3] = bin2bcd(t->time.tm_sec);
|
||||
regs[4] = bin2bcd(t->time.tm_min);
|
||||
regs[5] = bin2bcd(t->time.tm_hour);
|
||||
regs[6] = bin2bcd(t->time.tm_wday) + 1;
|
||||
regs[7] = bin2bcd(t->time.tm_mday);
|
||||
regs[8] = bin2bcd(t->time.tm_mon) + 1;
|
||||
|
||||
/* Clear the alarm 0 interrupt flag. */
|
||||
regs[6] &= ~MCP7941X_BIT_ALMX_IF;
|
||||
/* Set alarm match: second, minute, hour, day, date, month. */
|
||||
regs[6] |= MCP7941X_MSK_ALMX_MATCH;
|
||||
|
||||
if (t->enabled)
|
||||
regs[0] |= MCP7941X_BIT_ALM0_EN;
|
||||
else
|
||||
regs[0] &= ~MCP7941X_BIT_ALM0_EN;
|
||||
|
||||
ret = ds1307->write_block_data(client, MCP7941X_REG_CONTROL, 10, regs);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mcp7941x_alarm_irq_enable(struct device *dev, unsigned int enabled)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
struct ds1307 *ds1307 = i2c_get_clientdata(client);
|
||||
int reg;
|
||||
|
||||
if (!test_bit(HAS_ALARM, &ds1307->flags))
|
||||
return -EINVAL;
|
||||
|
||||
reg = i2c_smbus_read_byte_data(client, MCP7941X_REG_CONTROL);
|
||||
if (reg < 0)
|
||||
return reg;
|
||||
|
||||
if (enabled)
|
||||
reg |= MCP7941X_BIT_ALM0_EN;
|
||||
else
|
||||
reg &= ~MCP7941X_BIT_ALM0_EN;
|
||||
|
||||
return i2c_smbus_write_byte_data(client, MCP7941X_REG_CONTROL, reg);
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops mcp7941x_rtc_ops = {
|
||||
.read_time = ds1307_get_time,
|
||||
.set_time = ds1307_set_time,
|
||||
.read_alarm = mcp7941x_read_alarm,
|
||||
.set_alarm = mcp7941x_set_alarm,
|
||||
.alarm_irq_enable = mcp7941x_alarm_irq_enable,
|
||||
};
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
static ssize_t
|
||||
ds1307_nvram_read(struct file *filp, struct kobject *kobj,
|
||||
struct bin_attribute *attr,
|
||||
@ -678,6 +851,7 @@ static int ds1307_probe(struct i2c_client *client,
|
||||
[ds_1339] = DS1339_BIT_BBSQI,
|
||||
[ds_3231] = DS3231_BIT_BBSQW,
|
||||
};
|
||||
const struct rtc_class_ops *rtc_ops = &ds13xx_rtc_ops;
|
||||
|
||||
if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)
|
||||
&& !i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK))
|
||||
@ -816,6 +990,13 @@ static int ds1307_probe(struct i2c_client *client,
|
||||
case ds_1388:
|
||||
ds1307->offset = 1; /* Seconds starts at 1 */
|
||||
break;
|
||||
case mcp7941x:
|
||||
rtc_ops = &mcp7941x_rtc_ops;
|
||||
if (ds1307->client->irq > 0 && chip->alarm) {
|
||||
INIT_WORK(&ds1307->work, mcp7941x_work);
|
||||
want_irq = true;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -927,55 +1108,61 @@ read_rtc:
|
||||
bin2bcd(tmp));
|
||||
}
|
||||
|
||||
device_set_wakeup_capable(&client->dev, want_irq);
|
||||
ds1307->rtc = devm_rtc_device_register(&client->dev, client->name,
|
||||
&ds13xx_rtc_ops, THIS_MODULE);
|
||||
rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(ds1307->rtc)) {
|
||||
err = PTR_ERR(ds1307->rtc);
|
||||
dev_err(&client->dev,
|
||||
"unable to register the class device\n");
|
||||
goto exit;
|
||||
return PTR_ERR(ds1307->rtc);
|
||||
}
|
||||
|
||||
if (want_irq) {
|
||||
err = request_irq(client->irq, ds1307_irq, IRQF_SHARED,
|
||||
ds1307->rtc->name, client);
|
||||
if (err) {
|
||||
dev_err(&client->dev,
|
||||
"unable to request IRQ!\n");
|
||||
goto exit;
|
||||
}
|
||||
client->irq = 0;
|
||||
dev_err(&client->dev, "unable to request IRQ!\n");
|
||||
} else {
|
||||
|
||||
device_set_wakeup_capable(&client->dev, 1);
|
||||
set_bit(HAS_ALARM, &ds1307->flags);
|
||||
dev_dbg(&client->dev, "got IRQ %d\n", client->irq);
|
||||
set_bit(HAS_ALARM, &ds1307->flags);
|
||||
dev_dbg(&client->dev, "got IRQ %d\n", client->irq);
|
||||
}
|
||||
}
|
||||
|
||||
if (chip->nvram_size) {
|
||||
|
||||
ds1307->nvram = devm_kzalloc(&client->dev,
|
||||
sizeof(struct bin_attribute),
|
||||
GFP_KERNEL);
|
||||
if (!ds1307->nvram) {
|
||||
err = -ENOMEM;
|
||||
goto err_irq;
|
||||
dev_err(&client->dev, "cannot allocate memory for nvram sysfs\n");
|
||||
} else {
|
||||
|
||||
ds1307->nvram->attr.name = "nvram";
|
||||
ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR;
|
||||
|
||||
sysfs_bin_attr_init(ds1307->nvram);
|
||||
|
||||
ds1307->nvram->read = ds1307_nvram_read;
|
||||
ds1307->nvram->write = ds1307_nvram_write;
|
||||
ds1307->nvram->size = chip->nvram_size;
|
||||
ds1307->nvram_offset = chip->nvram_offset;
|
||||
|
||||
err = sysfs_create_bin_file(&client->dev.kobj,
|
||||
ds1307->nvram);
|
||||
if (err) {
|
||||
dev_err(&client->dev,
|
||||
"unable to create sysfs file: %s\n",
|
||||
ds1307->nvram->attr.name);
|
||||
} else {
|
||||
set_bit(HAS_NVRAM, &ds1307->flags);
|
||||
dev_info(&client->dev, "%zu bytes nvram\n",
|
||||
ds1307->nvram->size);
|
||||
}
|
||||
}
|
||||
ds1307->nvram->attr.name = "nvram";
|
||||
ds1307->nvram->attr.mode = S_IRUGO | S_IWUSR;
|
||||
sysfs_bin_attr_init(ds1307->nvram);
|
||||
ds1307->nvram->read = ds1307_nvram_read;
|
||||
ds1307->nvram->write = ds1307_nvram_write;
|
||||
ds1307->nvram->size = chip->nvram_size;
|
||||
ds1307->nvram_offset = chip->nvram_offset;
|
||||
err = sysfs_create_bin_file(&client->dev.kobj, ds1307->nvram);
|
||||
if (err)
|
||||
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;
|
||||
}
|
||||
|
166
drivers/rtc/rtc-ds1347.c
Normal file
166
drivers/rtc/rtc-ds1347.c
Normal file
@ -0,0 +1,166 @@
|
||||
/* rtc-ds1347.c
|
||||
*
|
||||
* Driver for Dallas Semiconductor DS1347 Low Current, SPI Compatible
|
||||
* Real Time Clock
|
||||
*
|
||||
* Author : Raghavendra Chandra Ganiga <ravi23ganiga@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/bcd.h>
|
||||
|
||||
/* Registers in ds1347 rtc */
|
||||
|
||||
#define DS1347_SECONDS_REG 0x01
|
||||
#define DS1347_MINUTES_REG 0x03
|
||||
#define DS1347_HOURS_REG 0x05
|
||||
#define DS1347_DATE_REG 0x07
|
||||
#define DS1347_MONTH_REG 0x09
|
||||
#define DS1347_DAY_REG 0x0B
|
||||
#define DS1347_YEAR_REG 0x0D
|
||||
#define DS1347_CONTROL_REG 0x0F
|
||||
#define DS1347_STATUS_REG 0x17
|
||||
#define DS1347_CLOCK_BURST 0x3F
|
||||
|
||||
static int ds1347_read_reg(struct device *dev, unsigned char address,
|
||||
unsigned char *data)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
|
||||
*data = address | 0x80;
|
||||
|
||||
return spi_write_then_read(spi, data, 1, data, 1);
|
||||
}
|
||||
|
||||
static int ds1347_write_reg(struct device *dev, unsigned char address,
|
||||
unsigned char data)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
unsigned char buf[2];
|
||||
|
||||
buf[0] = address & 0x7F;
|
||||
buf[1] = data;
|
||||
|
||||
return spi_write_then_read(spi, buf, 2, NULL, 0);
|
||||
}
|
||||
|
||||
static int ds1347_read_time(struct device *dev, struct rtc_time *dt)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
int err;
|
||||
unsigned char buf[8];
|
||||
|
||||
buf[0] = DS1347_CLOCK_BURST | 0x80;
|
||||
|
||||
err = spi_write_then_read(spi, buf, 1, buf, 8);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
dt->tm_sec = bcd2bin(buf[0]);
|
||||
dt->tm_min = bcd2bin(buf[1]);
|
||||
dt->tm_hour = bcd2bin(buf[2] & 0x3F);
|
||||
dt->tm_mday = bcd2bin(buf[3]);
|
||||
dt->tm_mon = bcd2bin(buf[4]) - 1;
|
||||
dt->tm_wday = bcd2bin(buf[5]) - 1;
|
||||
dt->tm_year = bcd2bin(buf[6]) + 100;
|
||||
|
||||
return rtc_valid_tm(dt);
|
||||
}
|
||||
|
||||
static int ds1347_set_time(struct device *dev, struct rtc_time *dt)
|
||||
{
|
||||
struct spi_device *spi = to_spi_device(dev);
|
||||
unsigned char buf[9];
|
||||
|
||||
buf[0] = DS1347_CLOCK_BURST & 0x7F;
|
||||
buf[1] = bin2bcd(dt->tm_sec);
|
||||
buf[2] = bin2bcd(dt->tm_min);
|
||||
buf[3] = (bin2bcd(dt->tm_hour) & 0x3F);
|
||||
buf[4] = bin2bcd(dt->tm_mday);
|
||||
buf[5] = bin2bcd(dt->tm_mon + 1);
|
||||
buf[6] = bin2bcd(dt->tm_wday + 1);
|
||||
|
||||
/* year in linux is from 1900 i.e in range of 100
|
||||
in rtc it is from 00 to 99 */
|
||||
dt->tm_year = dt->tm_year % 100;
|
||||
|
||||
buf[7] = bin2bcd(dt->tm_year);
|
||||
buf[8] = bin2bcd(0x00);
|
||||
|
||||
/* write the rtc settings */
|
||||
return spi_write_then_read(spi, buf, 9, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops ds1347_rtc_ops = {
|
||||
.read_time = ds1347_read_time,
|
||||
.set_time = ds1347_set_time,
|
||||
};
|
||||
|
||||
static int ds1347_probe(struct spi_device *spi)
|
||||
{
|
||||
struct rtc_device *rtc;
|
||||
unsigned char data;
|
||||
int res;
|
||||
|
||||
/* spi setup with ds1347 in mode 3 and bits per word as 8 */
|
||||
spi->mode = SPI_MODE_3;
|
||||
spi->bits_per_word = 8;
|
||||
spi_setup(spi);
|
||||
|
||||
/* RTC Settings */
|
||||
res = ds1347_read_reg(&spi->dev, DS1347_SECONDS_REG, &data);
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
/* Disable the write protect of rtc */
|
||||
ds1347_read_reg(&spi->dev, DS1347_CONTROL_REG, &data);
|
||||
data = data & ~(1<<7);
|
||||
ds1347_write_reg(&spi->dev, DS1347_CONTROL_REG, data);
|
||||
|
||||
/* Enable the oscillator , disable the oscillator stop flag,
|
||||
and glitch filter to reduce current consumption */
|
||||
ds1347_read_reg(&spi->dev, DS1347_STATUS_REG, &data);
|
||||
data = data & 0x1B;
|
||||
ds1347_write_reg(&spi->dev, DS1347_STATUS_REG, data);
|
||||
|
||||
/* display the settings */
|
||||
ds1347_read_reg(&spi->dev, DS1347_CONTROL_REG, &data);
|
||||
dev_info(&spi->dev, "DS1347 RTC CTRL Reg = 0x%02x\n", data);
|
||||
|
||||
ds1347_read_reg(&spi->dev, DS1347_STATUS_REG, &data);
|
||||
dev_info(&spi->dev, "DS1347 RTC Status Reg = 0x%02x\n", data);
|
||||
|
||||
rtc = devm_rtc_device_register(&spi->dev, "ds1347",
|
||||
&ds1347_rtc_ops, THIS_MODULE);
|
||||
|
||||
if (IS_ERR(rtc))
|
||||
return PTR_ERR(rtc);
|
||||
|
||||
spi_set_drvdata(spi, rtc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct spi_driver ds1347_driver = {
|
||||
.driver = {
|
||||
.name = "ds1347",
|
||||
.owner = THIS_MODULE,
|
||||
},
|
||||
.probe = ds1347_probe,
|
||||
};
|
||||
|
||||
module_spi_driver(ds1347_driver);
|
||||
|
||||
MODULE_DESCRIPTION("DS1347 SPI RTC DRIVER");
|
||||
MODULE_AUTHOR("Raghavendra C Ganiga <ravi23ganiga@gmail.com>");
|
||||
MODULE_LICENSE("GPL v2");
|
@ -132,10 +132,9 @@ static int ds1390_probe(struct spi_device *spi)
|
||||
spi_setup(spi);
|
||||
|
||||
chip = devm_kzalloc(&spi->dev, sizeof(*chip), GFP_KERNEL);
|
||||
if (!chip) {
|
||||
dev_err(&spi->dev, "unable to allocate device memory\n");
|
||||
if (!chip)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
spi_set_drvdata(spi, chip);
|
||||
|
||||
res = ds1390_get_reg(&spi->dev, DS1390_REG_SECONDS, &tmp);
|
||||
|
@ -371,8 +371,7 @@ ds1511_interrupt(int irq, void *dev_id)
|
||||
events |= RTC_UF;
|
||||
else
|
||||
events |= RTC_AF;
|
||||
if (likely(pdata->rtc))
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
}
|
||||
spin_unlock(&pdata->lock);
|
||||
return events ? IRQ_HANDLED : IRQ_NONE;
|
||||
@ -473,7 +472,6 @@ static struct bin_attribute ds1511_nvram_attr = {
|
||||
|
||||
static int ds1511_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rtc_device *rtc;
|
||||
struct resource *res;
|
||||
struct rtc_plat_data *pdata;
|
||||
int ret = 0;
|
||||
@ -512,6 +510,12 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
spin_lock_init(&pdata->lock);
|
||||
platform_set_drvdata(pdev, pdata);
|
||||
|
||||
pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&ds1511_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(pdata->rtc))
|
||||
return PTR_ERR(pdata->rtc);
|
||||
|
||||
/*
|
||||
* if the platform has an interrupt in mind for this device,
|
||||
* then by all means, set it
|
||||
@ -526,15 +530,12 @@ static int ds1511_rtc_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
rtc = devm_rtc_device_register(&pdev->dev, pdev->name, &ds1511_rtc_ops,
|
||||
THIS_MODULE);
|
||||
if (IS_ERR(rtc))
|
||||
return PTR_ERR(rtc);
|
||||
pdata->rtc = rtc;
|
||||
|
||||
ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1511_nvram_attr);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n",
|
||||
ds1511_nvram_attr.attr.name);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ds1511_rtc_remove(struct platform_device *pdev)
|
||||
|
@ -206,8 +206,7 @@ static irqreturn_t ds1553_rtc_interrupt(int irq, void *dev_id)
|
||||
events |= RTC_UF;
|
||||
else
|
||||
events |= RTC_AF;
|
||||
if (likely(pdata->rtc))
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
}
|
||||
spin_unlock(&pdata->lock);
|
||||
return events ? IRQ_HANDLED : IRQ_NONE;
|
||||
@ -278,7 +277,6 @@ static struct bin_attribute ds1553_nvram_attr = {
|
||||
|
||||
static int ds1553_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct rtc_device *rtc;
|
||||
struct resource *res;
|
||||
unsigned int cen, sec;
|
||||
struct rtc_plat_data *pdata;
|
||||
@ -311,6 +309,12 @@ static int ds1553_rtc_probe(struct platform_device *pdev)
|
||||
spin_lock_init(&pdata->lock);
|
||||
pdata->last_jiffies = jiffies;
|
||||
platform_set_drvdata(pdev, pdata);
|
||||
|
||||
pdata->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&ds1553_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(pdata->rtc))
|
||||
return PTR_ERR(pdata->rtc);
|
||||
|
||||
if (pdata->irq > 0) {
|
||||
writeb(0, ioaddr + RTC_INTERRUPTS);
|
||||
if (devm_request_irq(&pdev->dev, pdata->irq,
|
||||
@ -321,15 +325,12 @@ static int ds1553_rtc_probe(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&ds1553_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(rtc))
|
||||
return PTR_ERR(rtc);
|
||||
pdata->rtc = rtc;
|
||||
|
||||
ret = sysfs_create_bin_file(&pdev->dev.kobj, &ds1553_nvram_attr);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "unable to create sysfs file: %s\n",
|
||||
ds1553_nvram_attr.attr.name);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ds1553_rtc_remove(struct platform_device *pdev)
|
||||
|
@ -177,8 +177,9 @@ static int ds1672_probe(struct i2c_client *client,
|
||||
|
||||
/* read control register */
|
||||
err = ds1672_get_control(client, &control);
|
||||
if (err)
|
||||
goto exit_devreg;
|
||||
if (err) {
|
||||
dev_warn(&client->dev, "Unable to read the control register\n");
|
||||
}
|
||||
|
||||
if (control & DS1672_REG_CONTROL_EOSC)
|
||||
dev_warn(&client->dev, "Oscillator not enabled. "
|
||||
@ -187,12 +188,10 @@ static int ds1672_probe(struct i2c_client *client,
|
||||
/* Register sysfs hooks */
|
||||
err = device_create_file(&client->dev, &dev_attr_control);
|
||||
if (err)
|
||||
goto exit_devreg;
|
||||
dev_err(&client->dev, "Unable to create sysfs entry: %s\n",
|
||||
dev_attr_control.attr.name);
|
||||
|
||||
return 0;
|
||||
|
||||
exit_devreg:
|
||||
return err;
|
||||
}
|
||||
|
||||
static struct i2c_device_id ds1672_id[] = {
|
||||
|
@ -204,8 +204,11 @@ static int ds1742_rtc_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(rtc);
|
||||
|
||||
ret = sysfs_create_bin_file(&pdev->dev.kobj, &pdata->nvram_attr);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "Unable to create sysfs entry: %s\n",
|
||||
pdata->nvram_attr.attr.name);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ds1742_rtc_remove(struct platform_device *pdev)
|
||||
|
@ -57,6 +57,7 @@ struct ds3232 {
|
||||
* in the remove function.
|
||||
*/
|
||||
struct mutex mutex;
|
||||
bool suspended;
|
||||
int exiting;
|
||||
};
|
||||
|
||||
@ -345,7 +346,15 @@ static irqreturn_t ds3232_irq(int irq, void *dev_id)
|
||||
struct ds3232 *ds3232 = i2c_get_clientdata(client);
|
||||
|
||||
disable_irq_nosync(irq);
|
||||
schedule_work(&ds3232->work);
|
||||
|
||||
/*
|
||||
* If rtc as a wakeup source, can't schedule the work
|
||||
* at system resume flow, because at this time the i2c bus
|
||||
* has not been resumed.
|
||||
*/
|
||||
if (!ds3232->suspended)
|
||||
schedule_work(&ds3232->work);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@ -363,22 +372,26 @@ static void ds3232_work(struct work_struct *work)
|
||||
|
||||
if (stat & DS3232_REG_SR_A1F) {
|
||||
control = i2c_smbus_read_byte_data(client, DS3232_REG_CR);
|
||||
if (control < 0)
|
||||
goto out;
|
||||
/* disable alarm1 interrupt */
|
||||
control &= ~(DS3232_REG_CR_A1IE);
|
||||
i2c_smbus_write_byte_data(client, DS3232_REG_CR, control);
|
||||
if (control < 0) {
|
||||
pr_warn("Read DS3232 Control Register error."
|
||||
"Disable IRQ%d.\n", client->irq);
|
||||
} else {
|
||||
/* disable alarm1 interrupt */
|
||||
control &= ~(DS3232_REG_CR_A1IE);
|
||||
i2c_smbus_write_byte_data(client, DS3232_REG_CR,
|
||||
control);
|
||||
|
||||
/* clear the alarm pend flag */
|
||||
stat &= ~DS3232_REG_SR_A1F;
|
||||
i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
|
||||
/* clear the alarm pend flag */
|
||||
stat &= ~DS3232_REG_SR_A1F;
|
||||
i2c_smbus_write_byte_data(client, DS3232_REG_SR, stat);
|
||||
|
||||
rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF);
|
||||
rtc_update_irq(ds3232->rtc, 1, RTC_AF | RTC_IRQF);
|
||||
|
||||
if (!ds3232->exiting)
|
||||
enable_irq(client->irq);
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
if (!ds3232->exiting)
|
||||
enable_irq(client->irq);
|
||||
unlock:
|
||||
mutex_unlock(&ds3232->mutex);
|
||||
}
|
||||
@ -411,23 +424,17 @@ static int ds3232_probe(struct i2c_client *client,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ds3232->rtc = devm_rtc_device_register(&client->dev, client->name,
|
||||
&ds3232_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(ds3232->rtc)) {
|
||||
dev_err(&client->dev, "unable to register the class device\n");
|
||||
return PTR_ERR(ds3232->rtc);
|
||||
}
|
||||
|
||||
if (client->irq >= 0) {
|
||||
ret = devm_request_irq(&client->dev, client->irq, ds3232_irq, 0,
|
||||
"ds3232", client);
|
||||
if (client->irq > 0) {
|
||||
ret = devm_request_irq(&client->dev, client->irq, ds3232_irq,
|
||||
IRQF_SHARED, "ds3232", client);
|
||||
if (ret) {
|
||||
dev_err(&client->dev, "unable to request IRQ\n");
|
||||
return ret;
|
||||
}
|
||||
device_init_wakeup(&client->dev, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
ds3232->rtc = devm_rtc_device_register(&client->dev, client->name,
|
||||
&ds3232_rtc_ops, THIS_MODULE);
|
||||
return PTR_ERR_OR_ZERO(ds3232->rtc);
|
||||
}
|
||||
|
||||
static int ds3232_remove(struct i2c_client *client)
|
||||
@ -446,6 +453,42 @@ static int ds3232_remove(struct i2c_client *client)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int ds3232_suspend(struct device *dev)
|
||||
{
|
||||
struct ds3232 *ds3232 = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
|
||||
if (device_can_wakeup(dev)) {
|
||||
ds3232->suspended = true;
|
||||
irq_set_irq_wake(client->irq, 1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ds3232_resume(struct device *dev)
|
||||
{
|
||||
struct ds3232 *ds3232 = dev_get_drvdata(dev);
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
|
||||
if (ds3232->suspended) {
|
||||
ds3232->suspended = false;
|
||||
|
||||
/* Clear the hardware alarm pend flag */
|
||||
schedule_work(&ds3232->work);
|
||||
|
||||
irq_set_irq_wake(client->irq, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops ds3232_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(ds3232_suspend, ds3232_resume)
|
||||
};
|
||||
|
||||
static const struct i2c_device_id ds3232_id[] = {
|
||||
{ "ds3232", 0 },
|
||||
{ }
|
||||
@ -456,6 +499,7 @@ static struct i2c_driver ds3232_driver = {
|
||||
.driver = {
|
||||
.name = "rtc-ds3232",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &ds3232_pm_ops,
|
||||
},
|
||||
.probe = ds3232_probe,
|
||||
.remove = ds3232_remove,
|
||||
|
@ -401,7 +401,9 @@ static int __init dryice_rtc_probe(struct platform_device *pdev)
|
||||
imxdi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(imxdi->clk))
|
||||
return PTR_ERR(imxdi->clk);
|
||||
clk_prepare_enable(imxdi->clk);
|
||||
rc = clk_prepare_enable(imxdi->clk);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
/*
|
||||
* Initialize dryice hardware
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/regmap.h>
|
||||
|
@ -38,7 +38,6 @@
|
||||
#define JZ_RTC_CTRL_ENABLE BIT(0)
|
||||
|
||||
struct jz4740_rtc {
|
||||
struct resource *mem;
|
||||
void __iomem *base;
|
||||
|
||||
struct rtc_device *rtc;
|
||||
@ -216,6 +215,7 @@ static int jz4740_rtc_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
struct jz4740_rtc *rtc;
|
||||
uint32_t scratchpad;
|
||||
struct resource *mem;
|
||||
|
||||
rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
|
||||
if (!rtc)
|
||||
@ -227,25 +227,10 @@ static int jz4740_rtc_probe(struct platform_device *pdev)
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
rtc->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!rtc->mem) {
|
||||
dev_err(&pdev->dev, "Failed to get platform mmio memory\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
rtc->mem = devm_request_mem_region(&pdev->dev, rtc->mem->start,
|
||||
resource_size(rtc->mem), pdev->name);
|
||||
if (!rtc->mem) {
|
||||
dev_err(&pdev->dev, "Failed to request mmio memory region\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
rtc->base = devm_ioremap_nocache(&pdev->dev, rtc->mem->start,
|
||||
resource_size(rtc->mem));
|
||||
if (!rtc->base) {
|
||||
dev_err(&pdev->dev, "Failed to ioremap mmio memory\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
rtc->base = devm_ioremap_resource(&pdev->dev, mem);
|
||||
if (IS_ERR(rtc->base))
|
||||
return PTR_ERR(rtc->base);
|
||||
|
||||
spin_lock_init(&rtc->lock);
|
||||
|
||||
|
@ -211,10 +211,9 @@ static int lpc32xx_rtc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
|
||||
if (unlikely(!rtc)) {
|
||||
dev_err(&pdev->dev, "Can't allocate memory\n");
|
||||
if (unlikely(!rtc))
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rtc->irq = rtcirq;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
@ -23,6 +23,8 @@
|
||||
#define MC13XXX_RTCDAY 22
|
||||
#define MC13XXX_RTCDAYA 23
|
||||
|
||||
#define SEC_PER_DAY (24 * 60 * 60)
|
||||
|
||||
struct mc13xxx_rtc {
|
||||
struct rtc_device *rtc;
|
||||
struct mc13xxx *mc13xxx;
|
||||
@ -42,15 +44,15 @@ static int mc13xxx_rtc_irq_enable_unlocked(struct device *dev,
|
||||
return func(priv->mc13xxx, irq);
|
||||
}
|
||||
|
||||
static int mc13xxx_rtc_irq_enable(struct device *dev,
|
||||
unsigned int enabled, int irq)
|
||||
static int mc13xxx_rtc_alarm_irq_enable(struct device *dev,
|
||||
unsigned int enabled)
|
||||
{
|
||||
struct mc13xxx_rtc *priv = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
mc13xxx_lock(priv->mc13xxx);
|
||||
|
||||
ret = mc13xxx_rtc_irq_enable_unlocked(dev, enabled, irq);
|
||||
ret = mc13xxx_rtc_irq_enable_unlocked(dev, enabled, MC13XXX_IRQ_TODA);
|
||||
|
||||
mc13xxx_unlock(priv->mc13xxx);
|
||||
|
||||
@ -61,44 +63,27 @@ static int mc13xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
struct mc13xxx_rtc *priv = dev_get_drvdata(dev);
|
||||
unsigned int seconds, days1, days2;
|
||||
unsigned long s1970;
|
||||
int ret;
|
||||
|
||||
mc13xxx_lock(priv->mc13xxx);
|
||||
if (!priv->valid)
|
||||
return -ENODATA;
|
||||
|
||||
if (!priv->valid) {
|
||||
ret = -ENODATA;
|
||||
goto out;
|
||||
}
|
||||
do {
|
||||
int ret;
|
||||
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days1);
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days1);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTOD, &seconds);
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTOD, &seconds);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days2);
|
||||
out:
|
||||
mc13xxx_unlock(priv->mc13xxx);
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCDAY, &days2);
|
||||
if (ret)
|
||||
return ret;
|
||||
} while (days1 != days2);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (days2 == days1 + 1) {
|
||||
if (seconds >= 86400 / 2)
|
||||
days2 = days1;
|
||||
else
|
||||
days1 = days2;
|
||||
}
|
||||
|
||||
if (days1 != days2)
|
||||
return -EIO;
|
||||
|
||||
s1970 = days1 * 86400 + seconds;
|
||||
|
||||
rtc_time_to_tm(s1970, tm);
|
||||
rtc_time_to_tm(days1 * SEC_PER_DAY + seconds, tm);
|
||||
|
||||
return rtc_valid_tm(tm);
|
||||
}
|
||||
@ -110,8 +95,8 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs)
|
||||
unsigned int alarmseconds;
|
||||
int ret;
|
||||
|
||||
seconds = secs % 86400;
|
||||
days = secs / 86400;
|
||||
seconds = secs % SEC_PER_DAY;
|
||||
days = secs / SEC_PER_DAY;
|
||||
|
||||
mc13xxx_lock(priv->mc13xxx);
|
||||
|
||||
@ -123,7 +108,7 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs)
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
|
||||
if (alarmseconds < 86400) {
|
||||
if (alarmseconds < SEC_PER_DAY) {
|
||||
ret = mc13xxx_reg_write(priv->mc13xxx,
|
||||
MC13XXX_RTCTODA, 0x1ffff);
|
||||
if (unlikely(ret))
|
||||
@ -147,18 +132,21 @@ static int mc13xxx_rtc_set_mmss(struct device *dev, unsigned long secs)
|
||||
goto out;
|
||||
|
||||
/* restore alarm */
|
||||
if (alarmseconds < 86400) {
|
||||
if (alarmseconds < SEC_PER_DAY) {
|
||||
ret = mc13xxx_reg_write(priv->mc13xxx,
|
||||
MC13XXX_RTCTODA, alarmseconds);
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = mc13xxx_irq_ack(priv->mc13xxx, MC13XXX_IRQ_RTCRST);
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
if (!priv->valid) {
|
||||
ret = mc13xxx_irq_ack(priv->mc13xxx, MC13XXX_IRQ_RTCRST);
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
|
||||
ret = mc13xxx_irq_unmask(priv->mc13xxx, MC13XXX_IRQ_RTCRST);
|
||||
}
|
||||
|
||||
ret = mc13xxx_irq_unmask(priv->mc13xxx, MC13XXX_IRQ_RTCRST);
|
||||
out:
|
||||
priv->valid = !ret;
|
||||
|
||||
@ -180,7 +168,7 @@ static int mc13xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
ret = mc13xxx_reg_read(priv->mc13xxx, MC13XXX_RTCTODA, &seconds);
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
if (seconds >= 86400) {
|
||||
if (seconds >= SEC_PER_DAY) {
|
||||
ret = -ENODATA;
|
||||
goto out;
|
||||
}
|
||||
@ -201,7 +189,7 @@ out:
|
||||
alarm->enabled = enabled;
|
||||
alarm->pending = pending;
|
||||
|
||||
s1970 = days * 86400 + seconds;
|
||||
s1970 = days * SEC_PER_DAY + seconds;
|
||||
|
||||
rtc_time_to_tm(s1970, &alarm->time);
|
||||
dev_dbg(dev, "%s: %lu\n", __func__, s1970);
|
||||
@ -239,8 +227,8 @@ static int mc13xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
if (unlikely(ret))
|
||||
goto out;
|
||||
|
||||
seconds = s1970 % 86400;
|
||||
days = s1970 / 86400;
|
||||
seconds = s1970 % SEC_PER_DAY;
|
||||
days = s1970 / SEC_PER_DAY;
|
||||
|
||||
ret = mc13xxx_reg_write(priv->mc13xxx, MC13XXX_RTCDAYA, days);
|
||||
if (unlikely(ret))
|
||||
@ -259,8 +247,6 @@ static irqreturn_t mc13xxx_rtc_alarm_handler(int irq, void *dev)
|
||||
struct mc13xxx_rtc *priv = dev;
|
||||
struct mc13xxx *mc13xxx = priv->mc13xxx;
|
||||
|
||||
dev_dbg(&priv->rtc->dev, "Alarm\n");
|
||||
|
||||
rtc_update_irq(priv->rtc, 1, RTC_IRQF | RTC_AF);
|
||||
|
||||
mc13xxx_irq_ack(mc13xxx, irq);
|
||||
@ -273,8 +259,6 @@ static irqreturn_t mc13xxx_rtc_update_handler(int irq, void *dev)
|
||||
struct mc13xxx_rtc *priv = dev;
|
||||
struct mc13xxx *mc13xxx = priv->mc13xxx;
|
||||
|
||||
dev_dbg(&priv->rtc->dev, "1HZ\n");
|
||||
|
||||
rtc_update_irq(priv->rtc, 1, RTC_IRQF | RTC_UF);
|
||||
|
||||
mc13xxx_irq_ack(mc13xxx, irq);
|
||||
@ -282,12 +266,6 @@ static irqreturn_t mc13xxx_rtc_update_handler(int irq, void *dev)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int mc13xxx_rtc_alarm_irq_enable(struct device *dev,
|
||||
unsigned int enabled)
|
||||
{
|
||||
return mc13xxx_rtc_irq_enable(dev, enabled, MC13XXX_IRQ_TODA);
|
||||
}
|
||||
|
||||
static const struct rtc_class_ops mc13xxx_rtc_ops = {
|
||||
.read_time = mc13xxx_rtc_read_time,
|
||||
.set_mmss = mc13xxx_rtc_set_mmss,
|
||||
@ -301,7 +279,6 @@ static irqreturn_t mc13xxx_rtc_reset_handler(int irq, void *dev)
|
||||
struct mc13xxx_rtc *priv = dev;
|
||||
struct mc13xxx *mc13xxx = priv->mc13xxx;
|
||||
|
||||
dev_dbg(&priv->rtc->dev, "RTCRST\n");
|
||||
priv->valid = 0;
|
||||
|
||||
mc13xxx_irq_mask(mc13xxx, irq);
|
||||
@ -314,7 +291,6 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev)
|
||||
int ret;
|
||||
struct mc13xxx_rtc *priv;
|
||||
struct mc13xxx *mc13xxx;
|
||||
int rtcrst_pending;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv)
|
||||
@ -322,60 +298,47 @@ static int __init mc13xxx_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
mc13xxx = dev_get_drvdata(pdev->dev.parent);
|
||||
priv->mc13xxx = mc13xxx;
|
||||
priv->valid = 1;
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
|
||||
mc13xxx_lock(mc13xxx);
|
||||
|
||||
mc13xxx_irq_ack(mc13xxx, MC13XXX_IRQ_RTCRST);
|
||||
|
||||
ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_RTCRST,
|
||||
mc13xxx_rtc_reset_handler, DRIVER_NAME, priv);
|
||||
if (ret)
|
||||
goto err_reset_irq_request;
|
||||
goto err_irq_request;
|
||||
|
||||
ret = mc13xxx_irq_status(mc13xxx, MC13XXX_IRQ_RTCRST,
|
||||
NULL, &rtcrst_pending);
|
||||
if (ret)
|
||||
goto err_reset_irq_status;
|
||||
|
||||
priv->valid = !rtcrst_pending;
|
||||
|
||||
ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_1HZ,
|
||||
ret = mc13xxx_irq_request(mc13xxx, MC13XXX_IRQ_1HZ,
|
||||
mc13xxx_rtc_update_handler, DRIVER_NAME, priv);
|
||||
if (ret)
|
||||
goto err_update_irq_request;
|
||||
goto err_irq_request;
|
||||
|
||||
ret = mc13xxx_irq_request_nounmask(mc13xxx, MC13XXX_IRQ_TODA,
|
||||
mc13xxx_rtc_alarm_handler, DRIVER_NAME, priv);
|
||||
if (ret)
|
||||
goto err_alarm_irq_request;
|
||||
goto err_irq_request;
|
||||
|
||||
mc13xxx_unlock(mc13xxx);
|
||||
|
||||
priv->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&mc13xxx_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(priv->rtc)) {
|
||||
ret = PTR_ERR(priv->rtc);
|
||||
&mc13xxx_rtc_ops, THIS_MODULE);
|
||||
|
||||
mc13xxx_lock(mc13xxx);
|
||||
return 0;
|
||||
|
||||
mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv);
|
||||
err_alarm_irq_request:
|
||||
err_irq_request:
|
||||
mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_TODA, priv);
|
||||
mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv);
|
||||
mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv);
|
||||
|
||||
mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_1HZ, priv);
|
||||
err_update_irq_request:
|
||||
|
||||
err_reset_irq_status:
|
||||
|
||||
mc13xxx_irq_free(mc13xxx, MC13XXX_IRQ_RTCRST, priv);
|
||||
err_reset_irq_request:
|
||||
|
||||
mc13xxx_unlock(mc13xxx);
|
||||
}
|
||||
mc13xxx_unlock(mc13xxx);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __exit mc13xxx_rtc_remove(struct platform_device *pdev)
|
||||
static int mc13xxx_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mc13xxx_rtc *priv = platform_get_drvdata(pdev);
|
||||
|
||||
@ -404,7 +367,7 @@ MODULE_DEVICE_TABLE(platform, mc13xxx_rtc_idtable);
|
||||
|
||||
static struct platform_driver mc13xxx_rtc_driver = {
|
||||
.id_table = mc13xxx_rtc_idtable,
|
||||
.remove = __exit_p(mc13xxx_rtc_remove),
|
||||
.remove = mc13xxx_rtc_remove,
|
||||
.driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
|
@ -247,10 +247,8 @@ static int moxart_rtc_probe(struct platform_device *pdev)
|
||||
int ret = 0;
|
||||
|
||||
moxart_rtc = devm_kzalloc(&pdev->dev, sizeof(*moxart_rtc), GFP_KERNEL);
|
||||
if (!moxart_rtc) {
|
||||
dev_err(&pdev->dev, "devm_kzalloc failed\n");
|
||||
if (!moxart_rtc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
moxart_rtc->gpio_data = of_get_named_gpio(pdev->dev.of_node,
|
||||
"gpio-rtc-data", 0);
|
||||
|
@ -229,10 +229,9 @@ static int __init nuc900_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
nuc900_rtc = devm_kzalloc(&pdev->dev, sizeof(struct nuc900_rtc),
|
||||
GFP_KERNEL);
|
||||
if (!nuc900_rtc) {
|
||||
dev_err(&pdev->dev, "kzalloc nuc900_rtc failed\n");
|
||||
if (!nuc900_rtc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
nuc900_rtc->rtc_reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(nuc900_rtc->rtc_reg))
|
||||
|
@ -348,9 +348,8 @@ static int palmas_rtc_resume(struct device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops palmas_rtc_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(palmas_rtc_suspend, palmas_rtc_resume)
|
||||
};
|
||||
static SIMPLE_DEV_PM_OPS(palmas_rtc_pm_ops, palmas_rtc_suspend,
|
||||
palmas_rtc_resume);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static struct of_device_id of_palmas_rtc_match[] = {
|
||||
|
@ -9,18 +9,16 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/of.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <linux/mfd/pm8xxx/core.h>
|
||||
#include <linux/mfd/pm8xxx/rtc.h>
|
||||
|
||||
|
||||
/* RTC Register offsets from RTC CTRL REG */
|
||||
#define PM8XXX_ALARM_CTRL_OFFSET 0x01
|
||||
#define PM8XXX_RTC_WRITE_OFFSET 0x02
|
||||
@ -37,6 +35,8 @@
|
||||
/**
|
||||
* struct pm8xxx_rtc - rtc driver internal structure
|
||||
* @rtc: rtc device for this driver.
|
||||
* @regmap: regmap used to access RTC registers
|
||||
* @allow_set_time: indicates whether writing to the RTC is allowed
|
||||
* @rtc_alarm_irq: rtc alarm irq number.
|
||||
* @rtc_base: address of rtc control register.
|
||||
* @rtc_read_base: base address of read registers.
|
||||
@ -48,54 +48,18 @@
|
||||
*/
|
||||
struct pm8xxx_rtc {
|
||||
struct rtc_device *rtc;
|
||||
struct regmap *regmap;
|
||||
bool allow_set_time;
|
||||
int rtc_alarm_irq;
|
||||
int rtc_base;
|
||||
int rtc_read_base;
|
||||
int rtc_write_base;
|
||||
int alarm_rw_base;
|
||||
u8 ctrl_reg;
|
||||
u8 ctrl_reg;
|
||||
struct device *rtc_dev;
|
||||
spinlock_t ctrl_reg_lock;
|
||||
};
|
||||
|
||||
/*
|
||||
* The RTC registers need to be read/written one byte at a time. This is a
|
||||
* hardware limitation.
|
||||
*/
|
||||
static int pm8xxx_read_wrapper(struct pm8xxx_rtc *rtc_dd, u8 *rtc_val,
|
||||
int base, int count)
|
||||
{
|
||||
int i, rc;
|
||||
struct device *parent = rtc_dd->rtc_dev->parent;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
rc = pm8xxx_readb(parent, base + i, &rtc_val[i]);
|
||||
if (rc < 0) {
|
||||
dev_err(rtc_dd->rtc_dev, "PMIC read failed\n");
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pm8xxx_write_wrapper(struct pm8xxx_rtc *rtc_dd, u8 *rtc_val,
|
||||
int base, int count)
|
||||
{
|
||||
int i, rc;
|
||||
struct device *parent = rtc_dd->rtc_dev->parent;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
rc = pm8xxx_writeb(parent, base + i, rtc_val[i]);
|
||||
if (rc < 0) {
|
||||
dev_err(rtc_dd->rtc_dev, "PMIC write failed\n");
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Steps to write the RTC registers.
|
||||
* 1. Disable alarm if enabled.
|
||||
@ -107,9 +71,12 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
int rc, i;
|
||||
unsigned long secs, irq_flags;
|
||||
u8 value[NUM_8_BIT_RTC_REGS], reg = 0, alarm_enabled = 0, ctrl_reg;
|
||||
u8 value[NUM_8_BIT_RTC_REGS], alarm_enabled = 0, ctrl_reg;
|
||||
struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
|
||||
|
||||
if (!rtc_dd->allow_set_time)
|
||||
return -EACCES;
|
||||
|
||||
rtc_tm_to_time(tm, &secs);
|
||||
|
||||
for (i = 0; i < NUM_8_BIT_RTC_REGS; i++) {
|
||||
@ -125,47 +92,43 @@ static int pm8xxx_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
||||
if (ctrl_reg & PM8xxx_RTC_ALARM_ENABLE) {
|
||||
alarm_enabled = 1;
|
||||
ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE;
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base,
|
||||
1);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "Write to RTC control register "
|
||||
"failed\n");
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC control register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
rtc_dd->ctrl_reg = ctrl_reg;
|
||||
} else
|
||||
} else {
|
||||
spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
|
||||
}
|
||||
|
||||
/* Write 0 to Byte[0] */
|
||||
reg = 0;
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, ®, rtc_dd->rtc_write_base, 1);
|
||||
if (rc < 0) {
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, 0);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC write data register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
|
||||
/* Write Byte[1], Byte[2], Byte[3] */
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, value + 1,
|
||||
rtc_dd->rtc_write_base + 1, 3);
|
||||
if (rc < 0) {
|
||||
rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->rtc_write_base + 1,
|
||||
&value[1], sizeof(value) - 1);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC write data register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
|
||||
/* Write Byte[0] */
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, value, rtc_dd->rtc_write_base, 1);
|
||||
if (rc < 0) {
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_write_base, value[0]);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC write data register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
|
||||
if (alarm_enabled) {
|
||||
ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE;
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base,
|
||||
1);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "Write to RTC control register "
|
||||
"failed\n");
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC control register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
rtc_dd->ctrl_reg = ctrl_reg;
|
||||
@ -181,13 +144,14 @@ rtc_rw_fail:
|
||||
static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
{
|
||||
int rc;
|
||||
u8 value[NUM_8_BIT_RTC_REGS], reg;
|
||||
u8 value[NUM_8_BIT_RTC_REGS];
|
||||
unsigned long secs;
|
||||
unsigned int reg;
|
||||
struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
|
||||
|
||||
rc = pm8xxx_read_wrapper(rtc_dd, value, rtc_dd->rtc_read_base,
|
||||
NUM_8_BIT_RTC_REGS);
|
||||
if (rc < 0) {
|
||||
rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base,
|
||||
value, sizeof(value));
|
||||
if (rc) {
|
||||
dev_err(dev, "RTC read data register failed\n");
|
||||
return rc;
|
||||
}
|
||||
@ -196,16 +160,16 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
* Read the LSB again and check if there has been a carry over.
|
||||
* If there is, redo the read operation.
|
||||
*/
|
||||
rc = pm8xxx_read_wrapper(rtc_dd, ®, rtc_dd->rtc_read_base, 1);
|
||||
rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_read_base, ®);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "RTC read data register failed\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (unlikely(reg < value[0])) {
|
||||
rc = pm8xxx_read_wrapper(rtc_dd, value,
|
||||
rtc_dd->rtc_read_base, NUM_8_BIT_RTC_REGS);
|
||||
if (rc < 0) {
|
||||
rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->rtc_read_base,
|
||||
value, sizeof(value));
|
||||
if (rc) {
|
||||
dev_err(dev, "RTC read data register failed\n");
|
||||
return rc;
|
||||
}
|
||||
@ -222,8 +186,8 @@ static int pm8xxx_rtc_read_time(struct device *dev, struct rtc_time *tm)
|
||||
}
|
||||
|
||||
dev_dbg(dev, "secs = %lu, h:m:s == %d:%d:%d, d/m/y = %d/%d/%d\n",
|
||||
secs, tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||
tm->tm_mday, tm->tm_mon, tm->tm_year);
|
||||
secs, tm->tm_hour, tm->tm_min, tm->tm_sec,
|
||||
tm->tm_mday, tm->tm_mon, tm->tm_year);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -244,19 +208,22 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
|
||||
spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
|
||||
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, value, rtc_dd->alarm_rw_base,
|
||||
NUM_8_BIT_RTC_REGS);
|
||||
if (rc < 0) {
|
||||
rc = regmap_bulk_write(rtc_dd->regmap, rtc_dd->alarm_rw_base, value,
|
||||
sizeof(value));
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC ALARM register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
|
||||
ctrl_reg = rtc_dd->ctrl_reg;
|
||||
ctrl_reg = alarm->enabled ? (ctrl_reg | PM8xxx_RTC_ALARM_ENABLE) :
|
||||
(ctrl_reg & ~PM8xxx_RTC_ALARM_ENABLE);
|
||||
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1);
|
||||
if (rc < 0) {
|
||||
if (alarm->enabled)
|
||||
ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE;
|
||||
else
|
||||
ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE;
|
||||
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC control register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
@ -264,9 +231,9 @@ static int pm8xxx_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
rtc_dd->ctrl_reg = ctrl_reg;
|
||||
|
||||
dev_dbg(dev, "Alarm Set for h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
|
||||
alarm->time.tm_hour, alarm->time.tm_min,
|
||||
alarm->time.tm_sec, alarm->time.tm_mday,
|
||||
alarm->time.tm_mon, alarm->time.tm_year);
|
||||
alarm->time.tm_hour, alarm->time.tm_min,
|
||||
alarm->time.tm_sec, alarm->time.tm_mday,
|
||||
alarm->time.tm_mon, alarm->time.tm_year);
|
||||
rtc_rw_fail:
|
||||
spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
|
||||
return rc;
|
||||
@ -279,9 +246,9 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
unsigned long secs;
|
||||
struct pm8xxx_rtc *rtc_dd = dev_get_drvdata(dev);
|
||||
|
||||
rc = pm8xxx_read_wrapper(rtc_dd, value, rtc_dd->alarm_rw_base,
|
||||
NUM_8_BIT_RTC_REGS);
|
||||
if (rc < 0) {
|
||||
rc = regmap_bulk_read(rtc_dd->regmap, rtc_dd->alarm_rw_base, value,
|
||||
sizeof(value));
|
||||
if (rc) {
|
||||
dev_err(dev, "RTC alarm time read failed\n");
|
||||
return rc;
|
||||
}
|
||||
@ -297,9 +264,9 @@ static int pm8xxx_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
|
||||
}
|
||||
|
||||
dev_dbg(dev, "Alarm set for - h:r:s=%d:%d:%d, d/m/y=%d/%d/%d\n",
|
||||
alarm->time.tm_hour, alarm->time.tm_min,
|
||||
alarm->time.tm_sec, alarm->time.tm_mday,
|
||||
alarm->time.tm_mon, alarm->time.tm_year);
|
||||
alarm->time.tm_hour, alarm->time.tm_min,
|
||||
alarm->time.tm_sec, alarm->time.tm_mday,
|
||||
alarm->time.tm_mon, alarm->time.tm_year);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -312,12 +279,16 @@ static int pm8xxx_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
|
||||
u8 ctrl_reg;
|
||||
|
||||
spin_lock_irqsave(&rtc_dd->ctrl_reg_lock, irq_flags);
|
||||
ctrl_reg = rtc_dd->ctrl_reg;
|
||||
ctrl_reg = (enable) ? (ctrl_reg | PM8xxx_RTC_ALARM_ENABLE) :
|
||||
(ctrl_reg & ~PM8xxx_RTC_ALARM_ENABLE);
|
||||
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1);
|
||||
if (rc < 0) {
|
||||
ctrl_reg = rtc_dd->ctrl_reg;
|
||||
|
||||
if (enable)
|
||||
ctrl_reg |= PM8xxx_RTC_ALARM_ENABLE;
|
||||
else
|
||||
ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE;
|
||||
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(dev, "Write to RTC control register failed\n");
|
||||
goto rtc_rw_fail;
|
||||
}
|
||||
@ -329,8 +300,9 @@ rtc_rw_fail:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static struct rtc_class_ops pm8xxx_rtc_ops = {
|
||||
static const struct rtc_class_ops pm8xxx_rtc_ops = {
|
||||
.read_time = pm8xxx_rtc_read_time,
|
||||
.set_time = pm8xxx_rtc_set_time,
|
||||
.set_alarm = pm8xxx_rtc_set_alarm,
|
||||
.read_alarm = pm8xxx_rtc_read_alarm,
|
||||
.alarm_irq_enable = pm8xxx_rtc_alarm_irq_enable,
|
||||
@ -339,7 +311,7 @@ static struct rtc_class_ops pm8xxx_rtc_ops = {
|
||||
static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id)
|
||||
{
|
||||
struct pm8xxx_rtc *rtc_dd = dev_id;
|
||||
u8 ctrl_reg;
|
||||
unsigned int ctrl_reg;
|
||||
int rc;
|
||||
unsigned long irq_flags;
|
||||
|
||||
@ -351,11 +323,11 @@ static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id)
|
||||
ctrl_reg = rtc_dd->ctrl_reg;
|
||||
ctrl_reg &= ~PM8xxx_RTC_ALARM_ENABLE;
|
||||
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1);
|
||||
if (rc < 0) {
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg);
|
||||
if (rc) {
|
||||
spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
|
||||
dev_err(rtc_dd->rtc_dev, "Write to RTC control register "
|
||||
"failed\n");
|
||||
dev_err(rtc_dd->rtc_dev,
|
||||
"Write to RTC control register failed\n");
|
||||
goto rtc_alarm_handled;
|
||||
}
|
||||
|
||||
@ -363,61 +335,71 @@ static irqreturn_t pm8xxx_alarm_trigger(int irq, void *dev_id)
|
||||
spin_unlock_irqrestore(&rtc_dd->ctrl_reg_lock, irq_flags);
|
||||
|
||||
/* Clear RTC alarm register */
|
||||
rc = pm8xxx_read_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base +
|
||||
PM8XXX_ALARM_CTRL_OFFSET, 1);
|
||||
if (rc < 0) {
|
||||
dev_err(rtc_dd->rtc_dev, "RTC Alarm control register read "
|
||||
"failed\n");
|
||||
rc = regmap_read(rtc_dd->regmap,
|
||||
rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET,
|
||||
&ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(rtc_dd->rtc_dev,
|
||||
"RTC Alarm control register read failed\n");
|
||||
goto rtc_alarm_handled;
|
||||
}
|
||||
|
||||
ctrl_reg &= ~PM8xxx_RTC_ALARM_CLEAR;
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base +
|
||||
PM8XXX_ALARM_CTRL_OFFSET, 1);
|
||||
if (rc < 0)
|
||||
dev_err(rtc_dd->rtc_dev, "Write to RTC Alarm control register"
|
||||
" failed\n");
|
||||
rc = regmap_write(rtc_dd->regmap,
|
||||
rtc_dd->rtc_base + PM8XXX_ALARM_CTRL_OFFSET,
|
||||
ctrl_reg);
|
||||
if (rc)
|
||||
dev_err(rtc_dd->rtc_dev,
|
||||
"Write to RTC Alarm control register failed\n");
|
||||
|
||||
rtc_alarm_handled:
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Hardcoded RTC bases until IORESOURCE_REG mapping is figured out
|
||||
*/
|
||||
static const struct of_device_id pm8xxx_id_table[] = {
|
||||
{ .compatible = "qcom,pm8921-rtc", .data = (void *) 0x11D },
|
||||
{ .compatible = "qcom,pm8058-rtc", .data = (void *) 0x1E8 },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, pm8xxx_id_table);
|
||||
|
||||
static int pm8xxx_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
int rc;
|
||||
u8 ctrl_reg;
|
||||
bool rtc_write_enable = false;
|
||||
unsigned int ctrl_reg;
|
||||
struct pm8xxx_rtc *rtc_dd;
|
||||
struct resource *rtc_resource;
|
||||
const struct pm8xxx_rtc_platform_data *pdata =
|
||||
dev_get_platdata(&pdev->dev);
|
||||
const struct of_device_id *match;
|
||||
|
||||
if (pdata != NULL)
|
||||
rtc_write_enable = pdata->rtc_write_enable;
|
||||
match = of_match_node(pm8xxx_id_table, pdev->dev.of_node);
|
||||
if (!match)
|
||||
return -ENXIO;
|
||||
|
||||
rtc_dd = devm_kzalloc(&pdev->dev, sizeof(*rtc_dd), GFP_KERNEL);
|
||||
if (rtc_dd == NULL) {
|
||||
dev_err(&pdev->dev, "Unable to allocate memory!\n");
|
||||
if (rtc_dd == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* Initialise spinlock to protect RTC control register */
|
||||
spin_lock_init(&rtc_dd->ctrl_reg_lock);
|
||||
|
||||
rtc_dd->regmap = dev_get_regmap(pdev->dev.parent, NULL);
|
||||
if (!rtc_dd->regmap) {
|
||||
dev_err(&pdev->dev, "Parent regmap unavailable.\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
rtc_dd->rtc_alarm_irq = platform_get_irq(pdev, 0);
|
||||
if (rtc_dd->rtc_alarm_irq < 0) {
|
||||
dev_err(&pdev->dev, "Alarm IRQ resource absent!\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
rtc_resource = platform_get_resource_byname(pdev, IORESOURCE_IO,
|
||||
"pmic_rtc_base");
|
||||
if (!(rtc_resource && rtc_resource->start)) {
|
||||
dev_err(&pdev->dev, "RTC IO resource absent!\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
rtc_dd->allow_set_time = of_property_read_bool(pdev->dev.of_node,
|
||||
"allow-set-time");
|
||||
|
||||
rtc_dd->rtc_base = rtc_resource->start;
|
||||
rtc_dd->rtc_base = (long) match->data;
|
||||
|
||||
/* Setup RTC register addresses */
|
||||
rtc_dd->rtc_write_base = rtc_dd->rtc_base + PM8XXX_RTC_WRITE_OFFSET;
|
||||
@ -427,64 +409,52 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)
|
||||
rtc_dd->rtc_dev = &pdev->dev;
|
||||
|
||||
/* Check if the RTC is on, else turn it on */
|
||||
rc = pm8xxx_read_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base, 1);
|
||||
if (rc < 0) {
|
||||
rc = regmap_read(rtc_dd->regmap, rtc_dd->rtc_base, &ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev, "RTC control register read failed!\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (!(ctrl_reg & PM8xxx_RTC_ENABLE)) {
|
||||
ctrl_reg |= PM8xxx_RTC_ENABLE;
|
||||
rc = pm8xxx_write_wrapper(rtc_dd, &ctrl_reg, rtc_dd->rtc_base,
|
||||
1);
|
||||
if (rc < 0) {
|
||||
dev_err(&pdev->dev, "Write to RTC control register "
|
||||
"failed\n");
|
||||
rc = regmap_write(rtc_dd->regmap, rtc_dd->rtc_base, ctrl_reg);
|
||||
if (rc) {
|
||||
dev_err(&pdev->dev,
|
||||
"Write to RTC control register failed\n");
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
rtc_dd->ctrl_reg = ctrl_reg;
|
||||
if (rtc_write_enable == true)
|
||||
pm8xxx_rtc_ops.set_time = pm8xxx_rtc_set_time;
|
||||
|
||||
platform_set_drvdata(pdev, rtc_dd);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
/* Register the RTC device */
|
||||
rtc_dd->rtc = devm_rtc_device_register(&pdev->dev, "pm8xxx_rtc",
|
||||
&pm8xxx_rtc_ops, THIS_MODULE);
|
||||
&pm8xxx_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(rtc_dd->rtc)) {
|
||||
dev_err(&pdev->dev, "%s: RTC registration failed (%ld)\n",
|
||||
__func__, PTR_ERR(rtc_dd->rtc));
|
||||
__func__, PTR_ERR(rtc_dd->rtc));
|
||||
return PTR_ERR(rtc_dd->rtc);
|
||||
}
|
||||
|
||||
/* Request the alarm IRQ */
|
||||
rc = request_any_context_irq(rtc_dd->rtc_alarm_irq,
|
||||
pm8xxx_alarm_trigger, IRQF_TRIGGER_RISING,
|
||||
"pm8xxx_rtc_alarm", rtc_dd);
|
||||
rc = devm_request_any_context_irq(&pdev->dev, rtc_dd->rtc_alarm_irq,
|
||||
pm8xxx_alarm_trigger,
|
||||
IRQF_TRIGGER_RISING,
|
||||
"pm8xxx_rtc_alarm", rtc_dd);
|
||||
if (rc < 0) {
|
||||
dev_err(&pdev->dev, "Request IRQ failed (%d)\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
|
||||
dev_dbg(&pdev->dev, "Probe success !!\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pm8xxx_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pm8xxx_rtc *rtc_dd = platform_get_drvdata(pdev);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
free_irq(rtc_dd->rtc_alarm_irq, rtc_dd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int pm8xxx_rtc_resume(struct device *dev)
|
||||
{
|
||||
@ -507,15 +477,17 @@ static int pm8xxx_rtc_suspend(struct device *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops, pm8xxx_rtc_suspend, pm8xxx_rtc_resume);
|
||||
static SIMPLE_DEV_PM_OPS(pm8xxx_rtc_pm_ops,
|
||||
pm8xxx_rtc_suspend,
|
||||
pm8xxx_rtc_resume);
|
||||
|
||||
static struct platform_driver pm8xxx_rtc_driver = {
|
||||
.probe = pm8xxx_rtc_probe,
|
||||
.remove = pm8xxx_rtc_remove,
|
||||
.driver = {
|
||||
.name = PM8XXX_RTC_DEV_NAME,
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &pm8xxx_rtc_pm_ops,
|
||||
.name = "rtc-pm8xxx",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &pm8xxx_rtc_pm_ops,
|
||||
.of_match_table = pm8xxx_id_table,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -395,6 +395,12 @@ static int rv3029c2_probe(struct i2c_client *client,
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_EMUL))
|
||||
return -ENODEV;
|
||||
|
||||
rc = rv3029c2_i2c_get_sr(client, buf);
|
||||
if (rc < 0) {
|
||||
dev_err(&client->dev, "reading status failed\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
rtc = devm_rtc_device_register(&client->dev, client->name,
|
||||
&rv3029c2_rtc_ops, THIS_MODULE);
|
||||
|
||||
@ -403,12 +409,6 @@ static int rv3029c2_probe(struct i2c_client *client,
|
||||
|
||||
i2c_set_clientdata(client, rtc);
|
||||
|
||||
rc = rv3029c2_i2c_get_sr(client, buf);
|
||||
if (rc < 0) {
|
||||
dev_err(&client->dev, "reading status failed\n");
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -551,7 +551,6 @@ static int rx8025_probe(struct i2c_client *client,
|
||||
|
||||
rx8025 = devm_kzalloc(&client->dev, sizeof(*rx8025), GFP_KERNEL);
|
||||
if (!rx8025) {
|
||||
dev_err(&adapter->dev, "failed to alloc memory\n");
|
||||
err = -ENOMEM;
|
||||
goto errout;
|
||||
}
|
||||
|
@ -48,8 +48,8 @@ struct s3c_rtc_drv_data {
|
||||
|
||||
static struct clk *rtc_clk;
|
||||
static void __iomem *s3c_rtc_base;
|
||||
static int s3c_rtc_alarmno = NO_IRQ;
|
||||
static int s3c_rtc_tickno = NO_IRQ;
|
||||
static int s3c_rtc_alarmno;
|
||||
static int s3c_rtc_tickno;
|
||||
static enum s3c_cpu_type s3c_rtc_cpu_type;
|
||||
|
||||
static DEFINE_SPINLOCK(s3c_rtc_pie_lock);
|
||||
|
@ -264,12 +264,8 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev)
|
||||
|
||||
rtcdrv = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct sirfsoc_rtc_drv), GFP_KERNEL);
|
||||
if (rtcdrv == NULL) {
|
||||
dev_err(&pdev->dev,
|
||||
"%s: can't alloc mem for drv struct\n",
|
||||
pdev->name);
|
||||
if (rtcdrv == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base);
|
||||
if (err) {
|
||||
@ -335,39 +331,29 @@ static int sirfsoc_rtc_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int sirfsoc_rtc_suspend(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev);
|
||||
struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev);
|
||||
rtcdrv->overflow_rtc =
|
||||
sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_SW_VALUE);
|
||||
|
||||
rtcdrv->saved_counter =
|
||||
sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_CN);
|
||||
rtcdrv->saved_overflow_rtc = rtcdrv->overflow_rtc;
|
||||
if (device_may_wakeup(&pdev->dev) && !enable_irq_wake(rtcdrv->irq))
|
||||
if (device_may_wakeup(dev) && !enable_irq_wake(rtcdrv->irq))
|
||||
rtcdrv->irq_wake = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sirfsoc_rtc_freeze(struct device *dev)
|
||||
{
|
||||
sirfsoc_rtc_suspend(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sirfsoc_rtc_thaw(struct device *dev)
|
||||
static int sirfsoc_rtc_resume(struct device *dev)
|
||||
{
|
||||
u32 tmp;
|
||||
struct sirfsoc_rtc_drv *rtcdrv;
|
||||
rtcdrv = dev_get_drvdata(dev);
|
||||
struct sirfsoc_rtc_drv *rtcdrv = dev_get_drvdata(dev);
|
||||
|
||||
/*
|
||||
* if resume from snapshot and the rtc power is losed,
|
||||
* if resume from snapshot and the rtc power is lost,
|
||||
* restroe the rtc settings
|
||||
*/
|
||||
if (SIRFSOC_RTC_CLK != sirfsoc_rtc_iobrg_readl(
|
||||
@ -407,57 +393,23 @@ static int sirfsoc_rtc_thaw(struct device *dev)
|
||||
sirfsoc_rtc_iobrg_writel(rtcdrv->overflow_rtc,
|
||||
rtcdrv->rtc_base + RTC_SW_VALUE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sirfsoc_rtc_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev);
|
||||
sirfsoc_rtc_thaw(dev);
|
||||
if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) {
|
||||
if (device_may_wakeup(dev) && rtcdrv->irq_wake) {
|
||||
disable_irq_wake(rtcdrv->irq);
|
||||
rtcdrv->irq_wake = 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sirfsoc_rtc_restore(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
struct sirfsoc_rtc_drv *rtcdrv = platform_get_drvdata(pdev);
|
||||
|
||||
if (device_may_wakeup(&pdev->dev) && rtcdrv->irq_wake) {
|
||||
disable_irq_wake(rtcdrv->irq);
|
||||
rtcdrv->irq_wake = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
#define sirfsoc_rtc_suspend NULL
|
||||
#define sirfsoc_rtc_resume NULL
|
||||
#define sirfsoc_rtc_freeze NULL
|
||||
#define sirfsoc_rtc_thaw NULL
|
||||
#define sirfsoc_rtc_restore NULL
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops sirfsoc_rtc_pm_ops = {
|
||||
.suspend = sirfsoc_rtc_suspend,
|
||||
.resume = sirfsoc_rtc_resume,
|
||||
.freeze = sirfsoc_rtc_freeze,
|
||||
.thaw = sirfsoc_rtc_thaw,
|
||||
.restore = sirfsoc_rtc_restore,
|
||||
};
|
||||
static SIMPLE_DEV_PM_OPS(sirfsoc_rtc_pm_ops,
|
||||
sirfsoc_rtc_suspend, sirfsoc_rtc_resume);
|
||||
|
||||
static struct platform_driver sirfsoc_rtc_driver = {
|
||||
.driver = {
|
||||
.name = "sirfsoc-rtc",
|
||||
.owner = THIS_MODULE,
|
||||
#ifdef CONFIG_PM
|
||||
.pm = &sirfsoc_rtc_pm_ops,
|
||||
#endif
|
||||
.of_match_table = sirfsoc_rtc_of_match,
|
||||
},
|
||||
.probe = sirfsoc_rtc_probe,
|
||||
|
@ -365,10 +365,8 @@ static int spear_rtc_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
config = devm_kzalloc(&pdev->dev, sizeof(*config), GFP_KERNEL);
|
||||
if (!config) {
|
||||
dev_err(&pdev->dev, "out of memory\n");
|
||||
if (!config)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* alarm irqs */
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
|
@ -214,8 +214,7 @@ static irqreturn_t stk17ta8_rtc_interrupt(int irq, void *dev_id)
|
||||
events |= RTC_UF;
|
||||
else
|
||||
events |= RTC_AF;
|
||||
if (likely(pdata->rtc))
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
}
|
||||
spin_unlock(&pdata->lock);
|
||||
return events ? IRQ_HANDLED : IRQ_NONE;
|
||||
|
@ -428,7 +428,7 @@ static const struct rtc_class_ops sunxi_rtc_ops = {
|
||||
};
|
||||
|
||||
static const struct of_device_id sunxi_rtc_dt_ids[] = {
|
||||
{ .compatible = "allwinner,sun4i-rtc", .data = &data_year_param[0] },
|
||||
{ .compatible = "allwinner,sun4i-a10-rtc", .data = &data_year_param[0] },
|
||||
{ .compatible = "allwinner,sun7i-a20-rtc", .data = &data_year_param[1] },
|
||||
{ /* sentinel */ },
|
||||
};
|
||||
|
@ -104,20 +104,17 @@ static int test_probe(struct platform_device *plat_dev)
|
||||
rtc = devm_rtc_device_register(&plat_dev->dev, "test",
|
||||
&test_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(rtc)) {
|
||||
err = PTR_ERR(rtc);
|
||||
return err;
|
||||
return PTR_ERR(rtc);
|
||||
}
|
||||
|
||||
err = device_create_file(&plat_dev->dev, &dev_attr_irq);
|
||||
if (err)
|
||||
goto err;
|
||||
dev_err(&plat_dev->dev, "Unable to create sysfs entry: %s\n",
|
||||
dev_attr_irq.attr.name);
|
||||
|
||||
platform_set_drvdata(plat_dev, rtc);
|
||||
|
||||
return 0;
|
||||
|
||||
err:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int test_remove(struct platform_device *plat_dev)
|
||||
|
@ -176,8 +176,8 @@ static irqreturn_t tx4939_rtc_interrupt(int irq, void *dev_id)
|
||||
tx4939_rtc_cmd(rtcreg, TX4939_RTCCTL_COMMAND_NOP);
|
||||
}
|
||||
spin_unlock(&pdata->lock);
|
||||
if (likely(pdata->rtc))
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
rtc_update_irq(pdata->rtc, 1, events);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,6 @@
|
||||
|
||||
struct vt8500_rtc {
|
||||
void __iomem *regbase;
|
||||
struct resource *res;
|
||||
int irq_alarm;
|
||||
struct rtc_device *rtc;
|
||||
spinlock_t lock; /* Protects this structure */
|
||||
@ -209,6 +208,7 @@ static const struct rtc_class_ops vt8500_rtc_ops = {
|
||||
static int vt8500_rtc_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct vt8500_rtc *vt8500_rtc;
|
||||
struct resource *res;
|
||||
int ret;
|
||||
|
||||
vt8500_rtc = devm_kzalloc(&pdev->dev,
|
||||
@ -219,34 +219,16 @@ static int vt8500_rtc_probe(struct platform_device *pdev)
|
||||
spin_lock_init(&vt8500_rtc->lock);
|
||||
platform_set_drvdata(pdev, vt8500_rtc);
|
||||
|
||||
vt8500_rtc->res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!vt8500_rtc->res) {
|
||||
dev_err(&pdev->dev, "No I/O memory resource defined\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
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 vt8500_rtc->irq_alarm;
|
||||
}
|
||||
|
||||
vt8500_rtc->res = devm_request_mem_region(&pdev->dev,
|
||||
vt8500_rtc->res->start,
|
||||
resource_size(vt8500_rtc->res),
|
||||
"vt8500-rtc");
|
||||
if (vt8500_rtc->res == NULL) {
|
||||
dev_err(&pdev->dev, "failed to request I/O memory\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
vt8500_rtc->regbase = devm_ioremap(&pdev->dev, vt8500_rtc->res->start,
|
||||
resource_size(vt8500_rtc->res));
|
||||
if (!vt8500_rtc->regbase) {
|
||||
dev_err(&pdev->dev, "Unable to map RTC I/O memory\n");
|
||||
ret = -EBUSY;
|
||||
goto err_return;
|
||||
}
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
vt8500_rtc->regbase = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(vt8500_rtc->regbase))
|
||||
return PTR_ERR(vt8500_rtc->regbase);
|
||||
|
||||
/* Enable RTC and set it to 24-hour mode */
|
||||
writel(VT8500_RTC_CR_ENABLE,
|
||||
|
@ -660,7 +660,7 @@ static int x1205_probe(struct i2c_client *client,
|
||||
|
||||
err = x1205_sysfs_register(&client->dev);
|
||||
if (err)
|
||||
return err;
|
||||
dev_err(&client->dev, "Unable to create sysfs entries\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1877,7 +1877,7 @@ void ll_delete_inode(struct inode *inode)
|
||||
cl_sync_file_range(inode, 0, OBD_OBJECT_EOF,
|
||||
CL_FSYNC_DISCARD, 1);
|
||||
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
|
||||
/* Workaround for LU-118 */
|
||||
if (inode->i_data.nrpages) {
|
||||
|
@ -149,8 +149,6 @@ static int aat2870_bl_probe(struct platform_device *pdev)
|
||||
sizeof(struct aat2870_bl_driver_data),
|
||||
GFP_KERNEL);
|
||||
if (!aat2870_bl) {
|
||||
dev_err(&pdev->dev,
|
||||
"Failed to allocate memory for aat2870 backlight\n");
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
@ -224,10 +224,8 @@ static int adp8860_led_probe(struct i2c_client *client)
|
||||
|
||||
led = devm_kzalloc(&client->dev, sizeof(*led) * pdata->num_leds,
|
||||
GFP_KERNEL);
|
||||
if (led == NULL) {
|
||||
dev_err(&client->dev, "failed to alloc memory\n");
|
||||
if (led == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = adp8860_write(client, ADP8860_ISCFR, pdata->led_fade_law);
|
||||
ret = adp8860_write(client, ADP8860_ISCT1,
|
||||
|
@ -246,10 +246,8 @@ static int adp8870_led_probe(struct i2c_client *client)
|
||||
|
||||
led = devm_kzalloc(&client->dev, pdata->num_leds * sizeof(*led),
|
||||
GFP_KERNEL);
|
||||
if (led == NULL) {
|
||||
dev_err(&client->dev, "failed to alloc memory\n");
|
||||
if (led == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = adp8870_write(client, ADP8870_ISCLAW, pdata->led_fade_law);
|
||||
if (ret)
|
||||
|
@ -34,13 +34,15 @@ static const char *const backlight_types[] = {
|
||||
defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE))
|
||||
/* This callback gets called when something important happens inside a
|
||||
* framebuffer driver. We're looking if that important event is blanking,
|
||||
* and if it is, we're switching backlight power as well ...
|
||||
* and if it is and necessary, we're switching backlight power as well ...
|
||||
*/
|
||||
static int fb_notifier_callback(struct notifier_block *self,
|
||||
unsigned long event, void *data)
|
||||
{
|
||||
struct backlight_device *bd;
|
||||
struct fb_event *evdata = data;
|
||||
int node = evdata->info->node;
|
||||
int fb_blank = 0;
|
||||
|
||||
/* If we aren't interested in this event, skip it immediately ... */
|
||||
if (event != FB_EVENT_BLANK && event != FB_EVENT_CONBLANK)
|
||||
@ -51,12 +53,24 @@ static int fb_notifier_callback(struct notifier_block *self,
|
||||
if (bd->ops)
|
||||
if (!bd->ops->check_fb ||
|
||||
bd->ops->check_fb(bd, evdata->info)) {
|
||||
bd->props.fb_blank = *(int *)evdata->data;
|
||||
if (bd->props.fb_blank == FB_BLANK_UNBLANK)
|
||||
bd->props.state &= ~BL_CORE_FBBLANK;
|
||||
else
|
||||
bd->props.state |= BL_CORE_FBBLANK;
|
||||
backlight_update_status(bd);
|
||||
fb_blank = *(int *)evdata->data;
|
||||
if (fb_blank == FB_BLANK_UNBLANK &&
|
||||
!bd->fb_bl_on[node]) {
|
||||
bd->fb_bl_on[node] = true;
|
||||
if (!bd->use_count++) {
|
||||
bd->props.state &= ~BL_CORE_FBBLANK;
|
||||
bd->props.fb_blank = FB_BLANK_UNBLANK;
|
||||
backlight_update_status(bd);
|
||||
}
|
||||
} else if (fb_blank != FB_BLANK_UNBLANK &&
|
||||
bd->fb_bl_on[node]) {
|
||||
bd->fb_bl_on[node] = false;
|
||||
if (!(--bd->use_count)) {
|
||||
bd->props.state |= BL_CORE_FBBLANK;
|
||||
bd->props.fb_blank = fb_blank;
|
||||
backlight_update_status(bd);
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_unlock(&bd->ops_lock);
|
||||
return 0;
|
||||
|
@ -543,10 +543,8 @@ static int corgi_lcd_probe(struct spi_device *spi)
|
||||
}
|
||||
|
||||
lcd = devm_kzalloc(&spi->dev, sizeof(struct corgi_lcd), GFP_KERNEL);
|
||||
if (!lcd) {
|
||||
dev_err(&spi->dev, "failed to allocate memory\n");
|
||||
if (!lcd)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
lcd->spi_dev = spi;
|
||||
|
||||
|
@ -587,10 +587,8 @@ static int hx8357_probe(struct spi_device *spi)
|
||||
int i, ret;
|
||||
|
||||
lcd = devm_kzalloc(&spi->dev, sizeof(*lcd), GFP_KERNEL);
|
||||
if (!lcd) {
|
||||
dev_err(&spi->dev, "Couldn't allocate lcd internal structure!\n");
|
||||
if (!lcd)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = spi_setup(spi);
|
||||
if (ret < 0) {
|
||||
|
@ -482,10 +482,8 @@ static int ili922x_probe(struct spi_device *spi)
|
||||
u16 reg = 0;
|
||||
|
||||
ili = devm_kzalloc(&spi->dev, sizeof(*ili), GFP_KERNEL);
|
||||
if (!ili) {
|
||||
dev_err(&spi->dev, "cannot alloc priv data\n");
|
||||
if (!ili)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ili->spi = spi;
|
||||
spi_set_drvdata(spi, ili);
|
||||
|
@ -219,10 +219,8 @@ int ili9320_probe_spi(struct spi_device *spi,
|
||||
/* allocate and initialse our state */
|
||||
|
||||
ili = devm_kzalloc(&spi->dev, sizeof(struct ili9320), GFP_KERNEL);
|
||||
if (ili == NULL) {
|
||||
dev_err(dev, "no memory for device\n");
|
||||
if (ili == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ili->access.spi.id = ILI9320_SPI_IDCODE | ILI9320_SPI_ID(1);
|
||||
|
||||
|
@ -181,11 +181,8 @@ static int l4f00242t03_probe(struct spi_device *spi)
|
||||
|
||||
priv = devm_kzalloc(&spi->dev, sizeof(struct l4f00242t03_priv),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (priv == NULL) {
|
||||
dev_err(&spi->dev, "No memory for this device.\n");
|
||||
if (priv == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
spi_set_drvdata(spi, priv);
|
||||
spi->bits_per_word = 9;
|
||||
|
@ -296,11 +296,8 @@ static int lm3533_bl_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
bl = devm_kzalloc(&pdev->dev, sizeof(*bl), GFP_KERNEL);
|
||||
if (!bl) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to allocate memory for backlight\n");
|
||||
if (!bl)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
bl->lm3533 = lm3533;
|
||||
bl->id = pdev->id;
|
||||
|
@ -168,10 +168,8 @@ static int lms283gf05_probe(struct spi_device *spi)
|
||||
|
||||
st = devm_kzalloc(&spi->dev, sizeof(struct lms283gf05_state),
|
||||
GFP_KERNEL);
|
||||
if (st == NULL) {
|
||||
dev_err(&spi->dev, "No memory for device state\n");
|
||||
if (st == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ld = devm_lcd_device_register(&spi->dev, "lms283gf05", &spi->dev, st,
|
||||
&lms_ops);
|
||||
|
@ -94,10 +94,8 @@ static int platform_lcd_probe(struct platform_device *pdev)
|
||||
|
||||
plcd = devm_kzalloc(&pdev->dev, sizeof(struct platform_lcd),
|
||||
GFP_KERNEL);
|
||||
if (!plcd) {
|
||||
dev_err(dev, "no memory for state\n");
|
||||
if (!plcd)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
plcd->us = dev;
|
||||
plcd->pdata = pdata;
|
||||
|
@ -200,7 +200,6 @@ tps65217_bl_parse_dt(struct platform_device *pdev)
|
||||
|
||||
pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "failed to allocate platform data\n");
|
||||
err = ERR_PTR(-ENOMEM);
|
||||
goto err;
|
||||
}
|
||||
@ -296,10 +295,8 @@ static int tps65217_bl_probe(struct platform_device *pdev)
|
||||
|
||||
tps65217_bl = devm_kzalloc(&pdev->dev, sizeof(*tps65217_bl),
|
||||
GFP_KERNEL);
|
||||
if (tps65217_bl == NULL) {
|
||||
dev_err(&pdev->dev, "allocation of struct tps65217_bl failed\n");
|
||||
if (tps65217_bl == NULL)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
tps65217_bl->tps = tps;
|
||||
tps65217_bl->dev = &pdev->dev;
|
||||
|
@ -451,7 +451,7 @@ void v9fs_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct v9fs_inode *v9inode = V9FS_I(inode);
|
||||
|
||||
truncate_inode_pages(inode->i_mapping, 0);
|
||||
truncate_inode_pages_final(inode->i_mapping);
|
||||
clear_inode(inode);
|
||||
filemap_fdatawrite(inode->i_mapping);
|
||||
|
||||
|
@ -259,7 +259,7 @@ affs_evict_inode(struct inode *inode)
|
||||
{
|
||||
unsigned long cache_page;
|
||||
pr_debug("AFFS: evict_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
|
||||
if (!inode->i_nlink) {
|
||||
inode->i_size = 0;
|
||||
|
@ -422,7 +422,7 @@ void afs_evict_inode(struct inode *inode)
|
||||
|
||||
ASSERTCMP(inode->i_ino, ==, vnode->fid.vnode);
|
||||
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
clear_inode(inode);
|
||||
|
||||
afs_give_up_callback(vnode);
|
||||
|
@ -3,5 +3,5 @@
|
||||
#
|
||||
|
||||
obj-$(CONFIG_BEFS_FS) += befs.o
|
||||
|
||||
ccflags-$(CONFIG_BEFS_DEBUG) += -DDEBUG
|
||||
befs-objs := datastream.o btree.o super.o inode.o debug.o io.o linuxvfs.o
|
||||
|
@ -88,8 +88,11 @@ enum befs_err {
|
||||
|
||||
/****************************/
|
||||
/* debug.c */
|
||||
__printf(2, 3)
|
||||
void befs_error(const struct super_block *sb, const char *fmt, ...);
|
||||
__printf(2, 3)
|
||||
void befs_warning(const struct super_block *sb, const char *fmt, ...);
|
||||
__printf(2, 3)
|
||||
void befs_debug(const struct super_block *sb, const char *fmt, ...);
|
||||
|
||||
void befs_dump_super_block(const struct super_block *sb, befs_super_block *);
|
||||
|
@ -137,7 +137,7 @@ befs_bt_read_super(struct super_block *sb, befs_data_stream * ds,
|
||||
struct buffer_head *bh = NULL;
|
||||
befs_disk_btree_super *od_sup = NULL;
|
||||
|
||||
befs_debug(sb, "---> befs_btree_read_super()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
bh = befs_read_datastream(sb, ds, 0, NULL);
|
||||
|
||||
@ -162,11 +162,11 @@ befs_bt_read_super(struct super_block *sb, befs_data_stream * ds,
|
||||
goto error;
|
||||
}
|
||||
|
||||
befs_debug(sb, "<--- befs_btree_read_super()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
return BEFS_OK;
|
||||
|
||||
error:
|
||||
befs_debug(sb, "<--- befs_btree_read_super() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -195,16 +195,16 @@ befs_bt_read_node(struct super_block *sb, befs_data_stream * ds,
|
||||
{
|
||||
uint off = 0;
|
||||
|
||||
befs_debug(sb, "---> befs_bt_read_node()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
if (node->bh)
|
||||
brelse(node->bh);
|
||||
|
||||
node->bh = befs_read_datastream(sb, ds, node_off, &off);
|
||||
if (!node->bh) {
|
||||
befs_error(sb, "befs_bt_read_node() failed to read "
|
||||
"node at %Lu", node_off);
|
||||
befs_debug(sb, "<--- befs_bt_read_node() ERROR");
|
||||
befs_error(sb, "%s failed to read "
|
||||
"node at %llu", __func__, node_off);
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
|
||||
return BEFS_ERR;
|
||||
}
|
||||
@ -221,7 +221,7 @@ befs_bt_read_node(struct super_block *sb, befs_data_stream * ds,
|
||||
node->head.all_key_length =
|
||||
fs16_to_cpu(sb, node->od_node->all_key_length);
|
||||
|
||||
befs_debug(sb, "<--- befs_btree_read_node()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
return BEFS_OK;
|
||||
}
|
||||
|
||||
@ -252,7 +252,7 @@ befs_btree_find(struct super_block *sb, befs_data_stream * ds,
|
||||
befs_off_t node_off;
|
||||
int res;
|
||||
|
||||
befs_debug(sb, "---> befs_btree_find() Key: %s", key);
|
||||
befs_debug(sb, "---> %s Key: %s", __func__, key);
|
||||
|
||||
if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) {
|
||||
befs_error(sb,
|
||||
@ -263,7 +263,7 @@ befs_btree_find(struct super_block *sb, befs_data_stream * ds,
|
||||
this_node = kmalloc(sizeof (befs_btree_node),
|
||||
GFP_NOFS);
|
||||
if (!this_node) {
|
||||
befs_error(sb, "befs_btree_find() failed to allocate %u "
|
||||
befs_error(sb, "befs_btree_find() failed to allocate %zu "
|
||||
"bytes of memory", sizeof (befs_btree_node));
|
||||
goto error;
|
||||
}
|
||||
@ -274,7 +274,7 @@ befs_btree_find(struct super_block *sb, befs_data_stream * ds,
|
||||
node_off = bt_super.root_node_ptr;
|
||||
if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) {
|
||||
befs_error(sb, "befs_btree_find() failed to read "
|
||||
"node at %Lu", node_off);
|
||||
"node at %llu", node_off);
|
||||
goto error_alloc;
|
||||
}
|
||||
|
||||
@ -285,7 +285,7 @@ befs_btree_find(struct super_block *sb, befs_data_stream * ds,
|
||||
/* if no match, go to overflow node */
|
||||
if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) {
|
||||
befs_error(sb, "befs_btree_find() failed to read "
|
||||
"node at %Lu", node_off);
|
||||
"node at %llu", node_off);
|
||||
goto error_alloc;
|
||||
}
|
||||
}
|
||||
@ -298,11 +298,11 @@ befs_btree_find(struct super_block *sb, befs_data_stream * ds,
|
||||
kfree(this_node);
|
||||
|
||||
if (res != BEFS_BT_MATCH) {
|
||||
befs_debug(sb, "<--- befs_btree_find() Key %s not found", key);
|
||||
befs_debug(sb, "<--- %s Key %s not found", __func__, key);
|
||||
*value = 0;
|
||||
return BEFS_BT_NOT_FOUND;
|
||||
}
|
||||
befs_debug(sb, "<--- befs_btree_find() Found key %s, value %Lu",
|
||||
befs_debug(sb, "<--- %s Found key %s, value %llu", __func__,
|
||||
key, *value);
|
||||
return BEFS_OK;
|
||||
|
||||
@ -310,7 +310,7 @@ befs_btree_find(struct super_block *sb, befs_data_stream * ds,
|
||||
kfree(this_node);
|
||||
error:
|
||||
*value = 0;
|
||||
befs_debug(sb, "<--- befs_btree_find() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -343,7 +343,7 @@ befs_find_key(struct super_block *sb, befs_btree_node * node,
|
||||
char *thiskey;
|
||||
fs64 *valarray;
|
||||
|
||||
befs_debug(sb, "---> befs_find_key() %s", findkey);
|
||||
befs_debug(sb, "---> %s %s", __func__, findkey);
|
||||
|
||||
*value = 0;
|
||||
|
||||
@ -355,7 +355,7 @@ befs_find_key(struct super_block *sb, befs_btree_node * node,
|
||||
|
||||
eq = befs_compare_strings(thiskey, keylen, findkey, findkey_len);
|
||||
if (eq < 0) {
|
||||
befs_debug(sb, "<--- befs_find_key() %s not found", findkey);
|
||||
befs_debug(sb, "<--- %s %s not found", __func__, findkey);
|
||||
return BEFS_BT_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -373,8 +373,8 @@ befs_find_key(struct super_block *sb, befs_btree_node * node,
|
||||
findkey_len);
|
||||
|
||||
if (eq == 0) {
|
||||
befs_debug(sb, "<--- befs_find_key() found %s at %d",
|
||||
thiskey, mid);
|
||||
befs_debug(sb, "<--- %s found %s at %d",
|
||||
__func__, thiskey, mid);
|
||||
|
||||
*value = fs64_to_cpu(sb, valarray[mid]);
|
||||
return BEFS_BT_MATCH;
|
||||
@ -388,7 +388,7 @@ befs_find_key(struct super_block *sb, befs_btree_node * node,
|
||||
*value = fs64_to_cpu(sb, valarray[mid + 1]);
|
||||
else
|
||||
*value = fs64_to_cpu(sb, valarray[mid]);
|
||||
befs_debug(sb, "<--- befs_find_key() found %s at %d", thiskey, mid);
|
||||
befs_debug(sb, "<--- %s found %s at %d", __func__, thiskey, mid);
|
||||
return BEFS_BT_PARMATCH;
|
||||
}
|
||||
|
||||
@ -428,7 +428,7 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
|
||||
uint key_sum = 0;
|
||||
|
||||
befs_debug(sb, "---> befs_btree_read()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
if (befs_bt_read_super(sb, ds, &bt_super) != BEFS_OK) {
|
||||
befs_error(sb,
|
||||
@ -437,7 +437,7 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
}
|
||||
|
||||
if ((this_node = kmalloc(sizeof (befs_btree_node), GFP_NOFS)) == NULL) {
|
||||
befs_error(sb, "befs_btree_read() failed to allocate %u "
|
||||
befs_error(sb, "befs_btree_read() failed to allocate %zu "
|
||||
"bytes of memory", sizeof (befs_btree_node));
|
||||
goto error;
|
||||
}
|
||||
@ -452,7 +452,7 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
kfree(this_node);
|
||||
*value = 0;
|
||||
*keysize = 0;
|
||||
befs_debug(sb, "<--- befs_btree_read() Tree is EMPTY");
|
||||
befs_debug(sb, "<--- %s Tree is EMPTY", __func__);
|
||||
return BEFS_BT_EMPTY;
|
||||
} else if (res == BEFS_ERR) {
|
||||
goto error_alloc;
|
||||
@ -467,7 +467,8 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
*keysize = 0;
|
||||
*value = 0;
|
||||
befs_debug(sb,
|
||||
"<--- befs_btree_read() END of keys at %Lu",
|
||||
"<--- %s END of keys at %llu", __func__,
|
||||
(unsigned long long)
|
||||
key_sum + this_node->head.all_key_count);
|
||||
brelse(this_node->bh);
|
||||
kfree(this_node);
|
||||
@ -478,8 +479,8 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
node_off = this_node->head.right;
|
||||
|
||||
if (befs_bt_read_node(sb, ds, this_node, node_off) != BEFS_OK) {
|
||||
befs_error(sb, "befs_btree_read() failed to read "
|
||||
"node at %Lu", node_off);
|
||||
befs_error(sb, "%s failed to read node at %llu",
|
||||
__func__, (unsigned long long)node_off);
|
||||
goto error_alloc;
|
||||
}
|
||||
}
|
||||
@ -492,11 +493,13 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
|
||||
keystart = befs_bt_get_key(sb, this_node, cur_key, &keylen);
|
||||
|
||||
befs_debug(sb, "Read [%Lu,%d]: keysize %d", node_off, cur_key, keylen);
|
||||
befs_debug(sb, "Read [%llu,%d]: keysize %d",
|
||||
(long long unsigned int)node_off, (int)cur_key,
|
||||
(int)keylen);
|
||||
|
||||
if (bufsize < keylen + 1) {
|
||||
befs_error(sb, "befs_btree_read() keybuf too small (%u) "
|
||||
"for key of size %d", bufsize, keylen);
|
||||
befs_error(sb, "%s keybuf too small (%zu) "
|
||||
"for key of size %d", __func__, bufsize, keylen);
|
||||
brelse(this_node->bh);
|
||||
goto error_alloc;
|
||||
};
|
||||
@ -506,13 +509,13 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
*keysize = keylen;
|
||||
keybuf[keylen] = '\0';
|
||||
|
||||
befs_debug(sb, "Read [%Lu,%d]: Key \"%.*s\", Value %Lu", node_off,
|
||||
befs_debug(sb, "Read [%llu,%d]: Key \"%.*s\", Value %llu", node_off,
|
||||
cur_key, keylen, keybuf, *value);
|
||||
|
||||
brelse(this_node->bh);
|
||||
kfree(this_node);
|
||||
|
||||
befs_debug(sb, "<--- befs_btree_read()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
|
||||
return BEFS_OK;
|
||||
|
||||
@ -522,7 +525,7 @@ befs_btree_read(struct super_block *sb, befs_data_stream * ds,
|
||||
error:
|
||||
*keysize = 0;
|
||||
*value = 0;
|
||||
befs_debug(sb, "<--- befs_btree_read() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -547,26 +550,26 @@ befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds,
|
||||
befs_off_t * node_off)
|
||||
{
|
||||
|
||||
befs_debug(sb, "---> befs_btree_seekleaf()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) {
|
||||
befs_error(sb, "befs_btree_seekleaf() failed to read "
|
||||
"node at %Lu", *node_off);
|
||||
befs_error(sb, "%s failed to read "
|
||||
"node at %llu", __func__, *node_off);
|
||||
goto error;
|
||||
}
|
||||
befs_debug(sb, "Seekleaf to root node %Lu", *node_off);
|
||||
befs_debug(sb, "Seekleaf to root node %llu", *node_off);
|
||||
|
||||
if (this_node->head.all_key_count == 0 && befs_leafnode(this_node)) {
|
||||
befs_debug(sb, "<--- befs_btree_seekleaf() Tree is EMPTY");
|
||||
befs_debug(sb, "<--- %s Tree is EMPTY", __func__);
|
||||
return BEFS_BT_EMPTY;
|
||||
}
|
||||
|
||||
while (!befs_leafnode(this_node)) {
|
||||
|
||||
if (this_node->head.all_key_count == 0) {
|
||||
befs_debug(sb, "befs_btree_seekleaf() encountered "
|
||||
"an empty interior node: %Lu. Using Overflow "
|
||||
"node: %Lu", *node_off,
|
||||
befs_debug(sb, "%s encountered "
|
||||
"an empty interior node: %llu. Using Overflow "
|
||||
"node: %llu", __func__, *node_off,
|
||||
this_node->head.overflow);
|
||||
*node_off = this_node->head.overflow;
|
||||
} else {
|
||||
@ -574,19 +577,19 @@ befs_btree_seekleaf(struct super_block *sb, befs_data_stream * ds,
|
||||
*node_off = fs64_to_cpu(sb, valarray[0]);
|
||||
}
|
||||
if (befs_bt_read_node(sb, ds, this_node, *node_off) != BEFS_OK) {
|
||||
befs_error(sb, "befs_btree_seekleaf() failed to read "
|
||||
"node at %Lu", *node_off);
|
||||
befs_error(sb, "%s failed to read "
|
||||
"node at %llu", __func__, *node_off);
|
||||
goto error;
|
||||
}
|
||||
|
||||
befs_debug(sb, "Seekleaf to child node %Lu", *node_off);
|
||||
befs_debug(sb, "Seekleaf to child node %llu", *node_off);
|
||||
}
|
||||
befs_debug(sb, "Node %Lu is a leaf node", *node_off);
|
||||
befs_debug(sb, "Node %llu is a leaf node", *node_off);
|
||||
|
||||
return BEFS_OK;
|
||||
|
||||
error:
|
||||
befs_debug(sb, "<--- befs_btree_seekleaf() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
|
@ -52,26 +52,25 @@ befs_read_datastream(struct super_block *sb, befs_data_stream * ds,
|
||||
befs_block_run run;
|
||||
befs_blocknr_t block; /* block coresponding to pos */
|
||||
|
||||
befs_debug(sb, "---> befs_read_datastream() %Lu", pos);
|
||||
befs_debug(sb, "---> %s %llu", __func__, pos);
|
||||
block = pos >> BEFS_SB(sb)->block_shift;
|
||||
if (off)
|
||||
*off = pos - (block << BEFS_SB(sb)->block_shift);
|
||||
|
||||
if (befs_fblock2brun(sb, ds, block, &run) != BEFS_OK) {
|
||||
befs_error(sb, "BeFS: Error finding disk addr of block %lu",
|
||||
block);
|
||||
befs_debug(sb, "<--- befs_read_datastream() ERROR");
|
||||
(unsigned long)block);
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return NULL;
|
||||
}
|
||||
bh = befs_bread_iaddr(sb, run);
|
||||
if (!bh) {
|
||||
befs_error(sb, "BeFS: Error reading block %lu from datastream",
|
||||
block);
|
||||
(unsigned long)block);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
befs_debug(sb, "<--- befs_read_datastream() read data, starting at %Lu",
|
||||
pos);
|
||||
befs_debug(sb, "<--- %s read data, starting at %llu", __func__, pos);
|
||||
|
||||
return bh;
|
||||
}
|
||||
@ -106,7 +105,8 @@ befs_fblock2brun(struct super_block *sb, befs_data_stream * data,
|
||||
} else {
|
||||
befs_error(sb,
|
||||
"befs_fblock2brun() was asked to find block %lu, "
|
||||
"which is not mapped by the datastream\n", fblock);
|
||||
"which is not mapped by the datastream\n",
|
||||
(unsigned long)fblock);
|
||||
err = BEFS_ERR;
|
||||
}
|
||||
return err;
|
||||
@ -128,14 +128,14 @@ befs_read_lsymlink(struct super_block * sb, befs_data_stream * ds, void *buff,
|
||||
befs_off_t bytes_read = 0; /* bytes readed */
|
||||
u16 plen;
|
||||
struct buffer_head *bh = NULL;
|
||||
befs_debug(sb, "---> befs_read_lsymlink() length: %Lu", len);
|
||||
befs_debug(sb, "---> %s length: %llu", __func__, len);
|
||||
|
||||
while (bytes_read < len) {
|
||||
bh = befs_read_datastream(sb, ds, bytes_read, NULL);
|
||||
if (!bh) {
|
||||
befs_error(sb, "BeFS: Error reading datastream block "
|
||||
"starting from %Lu", bytes_read);
|
||||
befs_debug(sb, "<--- befs_read_lsymlink() ERROR");
|
||||
"starting from %llu", bytes_read);
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return bytes_read;
|
||||
|
||||
}
|
||||
@ -146,7 +146,8 @@ befs_read_lsymlink(struct super_block * sb, befs_data_stream * ds, void *buff,
|
||||
bytes_read += plen;
|
||||
}
|
||||
|
||||
befs_debug(sb, "<--- befs_read_lsymlink() read %u bytes", bytes_read);
|
||||
befs_debug(sb, "<--- %s read %u bytes", __func__, (unsigned int)
|
||||
bytes_read);
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
@ -169,7 +170,7 @@ befs_count_blocks(struct super_block * sb, befs_data_stream * ds)
|
||||
befs_blocknr_t metablocks; /* FS metadata blocks */
|
||||
befs_sb_info *befs_sb = BEFS_SB(sb);
|
||||
|
||||
befs_debug(sb, "---> befs_count_blocks()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
datablocks = ds->size >> befs_sb->block_shift;
|
||||
if (ds->size & (befs_sb->block_size - 1))
|
||||
@ -206,7 +207,7 @@ befs_count_blocks(struct super_block * sb, befs_data_stream * ds)
|
||||
}
|
||||
|
||||
blocks = datablocks + metablocks;
|
||||
befs_debug(sb, "<--- befs_count_blocks() %u blocks", blocks);
|
||||
befs_debug(sb, "<--- %s %u blocks", __func__, (unsigned int)blocks);
|
||||
|
||||
return blocks;
|
||||
}
|
||||
@ -251,11 +252,11 @@ befs_find_brun_direct(struct super_block *sb, befs_data_stream * data,
|
||||
befs_blocknr_t max_block =
|
||||
data->max_direct_range >> BEFS_SB(sb)->block_shift;
|
||||
|
||||
befs_debug(sb, "---> befs_find_brun_direct(), find %lu", blockno);
|
||||
befs_debug(sb, "---> %s, find %lu", __func__, (unsigned long)blockno);
|
||||
|
||||
if (blockno > max_block) {
|
||||
befs_error(sb, "befs_find_brun_direct() passed block outside of"
|
||||
"direct region");
|
||||
befs_error(sb, "%s passed block outside of direct region",
|
||||
__func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -267,13 +268,14 @@ befs_find_brun_direct(struct super_block *sb, befs_data_stream * data,
|
||||
run->start = array[i].start + offset;
|
||||
run->len = array[i].len - offset;
|
||||
|
||||
befs_debug(sb, "---> befs_find_brun_direct(), "
|
||||
"found %lu at direct[%d]", blockno, i);
|
||||
befs_debug(sb, "---> %s, "
|
||||
"found %lu at direct[%d]", __func__,
|
||||
(unsigned long)blockno, i);
|
||||
return BEFS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
befs_debug(sb, "---> befs_find_brun_direct() ERROR");
|
||||
befs_debug(sb, "---> %s ERROR", __func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -316,7 +318,7 @@ befs_find_brun_indirect(struct super_block *sb,
|
||||
befs_blocknr_t indirblockno = iaddr2blockno(sb, &indirect);
|
||||
int arraylen = befs_iaddrs_per_block(sb);
|
||||
|
||||
befs_debug(sb, "---> befs_find_brun_indirect(), find %lu", blockno);
|
||||
befs_debug(sb, "---> %s, find %lu", __func__, (unsigned long)blockno);
|
||||
|
||||
indir_start_blk = data->max_direct_range >> BEFS_SB(sb)->block_shift;
|
||||
search_blk = blockno - indir_start_blk;
|
||||
@ -325,10 +327,9 @@ befs_find_brun_indirect(struct super_block *sb,
|
||||
for (i = 0; i < indirect.len; i++) {
|
||||
indirblock = befs_bread(sb, indirblockno + i);
|
||||
if (indirblock == NULL) {
|
||||
befs_debug(sb,
|
||||
"---> befs_find_brun_indirect() failed to "
|
||||
"read disk block %lu from the indirect brun",
|
||||
indirblockno + i);
|
||||
befs_debug(sb, "---> %s failed to read "
|
||||
"disk block %lu from the indirect brun",
|
||||
__func__, (unsigned long)indirblockno + i);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -348,9 +349,10 @@ befs_find_brun_indirect(struct super_block *sb,
|
||||
|
||||
brelse(indirblock);
|
||||
befs_debug(sb,
|
||||
"<--- befs_find_brun_indirect() found "
|
||||
"file block %lu at indirect[%d]",
|
||||
blockno, j + (i * arraylen));
|
||||
"<--- %s found file block "
|
||||
"%lu at indirect[%d]", __func__,
|
||||
(unsigned long)blockno,
|
||||
j + (i * arraylen));
|
||||
return BEFS_OK;
|
||||
}
|
||||
sum += len;
|
||||
@ -360,10 +362,10 @@ befs_find_brun_indirect(struct super_block *sb,
|
||||
}
|
||||
|
||||
/* Only fallthrough is an error */
|
||||
befs_error(sb, "BeFS: befs_find_brun_indirect() failed to find "
|
||||
"file block %lu", blockno);
|
||||
befs_error(sb, "BeFS: %s failed to find "
|
||||
"file block %lu", __func__, (unsigned long)blockno);
|
||||
|
||||
befs_debug(sb, "<--- befs_find_brun_indirect() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -444,7 +446,7 @@ befs_find_brun_dblindirect(struct super_block *sb,
|
||||
size_t diblklen = iblklen * befs_iaddrs_per_block(sb)
|
||||
* BEFS_DBLINDIR_BRUN_LEN;
|
||||
|
||||
befs_debug(sb, "---> befs_find_brun_dblindirect() find %lu", blockno);
|
||||
befs_debug(sb, "---> %s find %lu", __func__, (unsigned long)blockno);
|
||||
|
||||
/* First, discover which of the double_indir->indir blocks
|
||||
* contains pos. Then figure out how much of pos that
|
||||
@ -460,8 +462,9 @@ befs_find_brun_dblindirect(struct super_block *sb,
|
||||
dbl_which_block = dblindir_indx / befs_iaddrs_per_block(sb);
|
||||
if (dbl_which_block > data->double_indirect.len) {
|
||||
befs_error(sb, "The double-indirect index calculated by "
|
||||
"befs_read_brun_dblindirect(), %d, is outside the range "
|
||||
"of the double-indirect block", dblindir_indx);
|
||||
"%s, %d, is outside the range "
|
||||
"of the double-indirect block", __func__,
|
||||
dblindir_indx);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
@ -469,10 +472,10 @@ befs_find_brun_dblindirect(struct super_block *sb,
|
||||
befs_bread(sb, iaddr2blockno(sb, &data->double_indirect) +
|
||||
dbl_which_block);
|
||||
if (dbl_indir_block == NULL) {
|
||||
befs_error(sb, "befs_read_brun_dblindirect() couldn't read the "
|
||||
"double-indirect block at blockno %lu",
|
||||
iaddr2blockno(sb,
|
||||
&data->double_indirect) +
|
||||
befs_error(sb, "%s couldn't read the "
|
||||
"double-indirect block at blockno %lu", __func__,
|
||||
(unsigned long)
|
||||
iaddr2blockno(sb, &data->double_indirect) +
|
||||
dbl_which_block);
|
||||
brelse(dbl_indir_block);
|
||||
return BEFS_ERR;
|
||||
@ -489,16 +492,16 @@ befs_find_brun_dblindirect(struct super_block *sb,
|
||||
which_block = indir_indx / befs_iaddrs_per_block(sb);
|
||||
if (which_block > indir_run.len) {
|
||||
befs_error(sb, "The indirect index calculated by "
|
||||
"befs_read_brun_dblindirect(), %d, is outside the range "
|
||||
"of the indirect block", indir_indx);
|
||||
"%s, %d, is outside the range "
|
||||
"of the indirect block", __func__, indir_indx);
|
||||
return BEFS_ERR;
|
||||
}
|
||||
|
||||
indir_block =
|
||||
befs_bread(sb, iaddr2blockno(sb, &indir_run) + which_block);
|
||||
if (indir_block == NULL) {
|
||||
befs_error(sb, "befs_read_brun_dblindirect() couldn't read the "
|
||||
"indirect block at blockno %lu",
|
||||
befs_error(sb, "%s couldn't read the indirect block "
|
||||
"at blockno %lu", __func__, (unsigned long)
|
||||
iaddr2blockno(sb, &indir_run) + which_block);
|
||||
brelse(indir_block);
|
||||
return BEFS_ERR;
|
||||
@ -519,7 +522,7 @@ befs_find_brun_dblindirect(struct super_block *sb,
|
||||
run->len -= offset;
|
||||
|
||||
befs_debug(sb, "Found file block %lu in double_indirect[%d][%d],"
|
||||
" double_indirect_leftover = %lu",
|
||||
" double_indirect_leftover = %lu", (unsigned long)
|
||||
blockno, dblindir_indx, indir_indx, dblindir_leftover);
|
||||
|
||||
return BEFS_OK;
|
||||
|
@ -10,6 +10,7 @@
|
||||
* debug functions
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <stdarg.h>
|
||||
@ -23,43 +24,30 @@
|
||||
|
||||
#include "befs.h"
|
||||
|
||||
#define ERRBUFSIZE 1024
|
||||
|
||||
void
|
||||
befs_error(const struct super_block *sb, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
char *err_buf = kmalloc(ERRBUFSIZE, GFP_KERNEL);
|
||||
if (err_buf == NULL) {
|
||||
printk(KERN_ERR "could not allocate %d bytes\n", ERRBUFSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(args, fmt);
|
||||
vsnprintf(err_buf, ERRBUFSIZE, fmt, args);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
pr_err("(%s): %pV\n", sb->s_id, &vaf);
|
||||
va_end(args);
|
||||
|
||||
printk(KERN_ERR "BeFS(%s): %s\n", sb->s_id, err_buf);
|
||||
kfree(err_buf);
|
||||
}
|
||||
|
||||
void
|
||||
befs_warning(const struct super_block *sb, const char *fmt, ...)
|
||||
{
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
char *err_buf = kmalloc(ERRBUFSIZE, GFP_KERNEL);
|
||||
if (err_buf == NULL) {
|
||||
printk(KERN_ERR "could not allocate %d bytes\n", ERRBUFSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(args, fmt);
|
||||
vsnprintf(err_buf, ERRBUFSIZE, fmt, args);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
pr_warn("(%s): %pV\n", sb->s_id, &vaf);
|
||||
va_end(args);
|
||||
|
||||
printk(KERN_WARNING "BeFS(%s): %s\n", sb->s_id, err_buf);
|
||||
|
||||
kfree(err_buf);
|
||||
}
|
||||
|
||||
void
|
||||
@ -67,25 +55,13 @@ befs_debug(const struct super_block *sb, const char *fmt, ...)
|
||||
{
|
||||
#ifdef CONFIG_BEFS_DEBUG
|
||||
|
||||
struct va_format vaf;
|
||||
va_list args;
|
||||
char *err_buf = NULL;
|
||||
|
||||
if (BEFS_SB(sb)->mount_opts.debug) {
|
||||
err_buf = kmalloc(ERRBUFSIZE, GFP_KERNEL);
|
||||
if (err_buf == NULL) {
|
||||
printk(KERN_ERR "could not allocate %d bytes\n",
|
||||
ERRBUFSIZE);
|
||||
return;
|
||||
}
|
||||
|
||||
va_start(args, fmt);
|
||||
vsnprintf(err_buf, ERRBUFSIZE, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
printk(KERN_DEBUG "BeFS(%s): %s\n", sb->s_id, err_buf);
|
||||
|
||||
kfree(err_buf);
|
||||
}
|
||||
va_start(args, fmt);
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
pr_debug("(%s): %pV\n", sb->s_id, &vaf);
|
||||
va_end(args);
|
||||
|
||||
#endif //CONFIG_BEFS_DEBUG
|
||||
}
|
||||
@ -109,9 +85,9 @@ befs_dump_inode(const struct super_block *sb, befs_inode * inode)
|
||||
befs_debug(sb, " gid %u", fs32_to_cpu(sb, inode->gid));
|
||||
befs_debug(sb, " mode %08x", fs32_to_cpu(sb, inode->mode));
|
||||
befs_debug(sb, " flags %08x", fs32_to_cpu(sb, inode->flags));
|
||||
befs_debug(sb, " create_time %Lu",
|
||||
befs_debug(sb, " create_time %llu",
|
||||
fs64_to_cpu(sb, inode->create_time));
|
||||
befs_debug(sb, " last_modified_time %Lu",
|
||||
befs_debug(sb, " last_modified_time %llu",
|
||||
fs64_to_cpu(sb, inode->last_modified_time));
|
||||
|
||||
tmp_run = fsrun_to_cpu(sb, inode->parent);
|
||||
@ -137,7 +113,7 @@ befs_dump_inode(const struct super_block *sb, befs_inode * inode)
|
||||
tmp_run.allocation_group, tmp_run.start,
|
||||
tmp_run.len);
|
||||
}
|
||||
befs_debug(sb, " max_direct_range %Lu",
|
||||
befs_debug(sb, " max_direct_range %llu",
|
||||
fs64_to_cpu(sb,
|
||||
inode->data.datastream.
|
||||
max_direct_range));
|
||||
@ -147,7 +123,7 @@ befs_dump_inode(const struct super_block *sb, befs_inode * inode)
|
||||
tmp_run.allocation_group,
|
||||
tmp_run.start, tmp_run.len);
|
||||
|
||||
befs_debug(sb, " max_indirect_range %Lu",
|
||||
befs_debug(sb, " max_indirect_range %llu",
|
||||
fs64_to_cpu(sb,
|
||||
inode->data.datastream.
|
||||
max_indirect_range));
|
||||
@ -158,12 +134,12 @@ befs_dump_inode(const struct super_block *sb, befs_inode * inode)
|
||||
tmp_run.allocation_group, tmp_run.start,
|
||||
tmp_run.len);
|
||||
|
||||
befs_debug(sb, " max_double_indirect_range %Lu",
|
||||
befs_debug(sb, " max_double_indirect_range %llu",
|
||||
fs64_to_cpu(sb,
|
||||
inode->data.datastream.
|
||||
max_double_indirect_range));
|
||||
|
||||
befs_debug(sb, " size %Lu",
|
||||
befs_debug(sb, " size %llu",
|
||||
fs64_to_cpu(sb, inode->data.datastream.size));
|
||||
}
|
||||
|
||||
@ -191,8 +167,8 @@ befs_dump_super_block(const struct super_block *sb, befs_super_block * sup)
|
||||
befs_debug(sb, " block_size %u", fs32_to_cpu(sb, sup->block_size));
|
||||
befs_debug(sb, " block_shift %u", fs32_to_cpu(sb, sup->block_shift));
|
||||
|
||||
befs_debug(sb, " num_blocks %Lu", fs64_to_cpu(sb, sup->num_blocks));
|
||||
befs_debug(sb, " used_blocks %Lu", fs64_to_cpu(sb, sup->used_blocks));
|
||||
befs_debug(sb, " num_blocks %llu", fs64_to_cpu(sb, sup->num_blocks));
|
||||
befs_debug(sb, " used_blocks %llu", fs64_to_cpu(sb, sup->used_blocks));
|
||||
|
||||
befs_debug(sb, " magic2 %08x", fs32_to_cpu(sb, sup->magic2));
|
||||
befs_debug(sb, " blocks_per_ag %u",
|
||||
@ -206,8 +182,8 @@ befs_dump_super_block(const struct super_block *sb, befs_super_block * sup)
|
||||
befs_debug(sb, " log_blocks %u, %hu, %hu",
|
||||
tmp_run.allocation_group, tmp_run.start, tmp_run.len);
|
||||
|
||||
befs_debug(sb, " log_start %Ld", fs64_to_cpu(sb, sup->log_start));
|
||||
befs_debug(sb, " log_end %Ld", fs64_to_cpu(sb, sup->log_end));
|
||||
befs_debug(sb, " log_start %lld", fs64_to_cpu(sb, sup->log_start));
|
||||
befs_debug(sb, " log_end %lld", fs64_to_cpu(sb, sup->log_end));
|
||||
|
||||
befs_debug(sb, " magic3 %08x", fs32_to_cpu(sb, sup->magic3));
|
||||
|
||||
|
@ -25,7 +25,8 @@ befs_check_inode(struct super_block *sb, befs_inode * raw_inode,
|
||||
/* check magic header. */
|
||||
if (magic1 != BEFS_INODE_MAGIC1) {
|
||||
befs_error(sb,
|
||||
"Inode has a bad magic header - inode = %lu", inode);
|
||||
"Inode has a bad magic header - inode = %lu",
|
||||
(unsigned long)inode);
|
||||
return BEFS_BAD_INODE;
|
||||
}
|
||||
|
||||
@ -34,8 +35,8 @@ befs_check_inode(struct super_block *sb, befs_inode * raw_inode,
|
||||
*/
|
||||
if (inode != iaddr2blockno(sb, &ino_num)) {
|
||||
befs_error(sb, "inode blocknr field disagrees with vfs "
|
||||
"VFS: %lu, Inode %lu",
|
||||
inode, iaddr2blockno(sb, &ino_num));
|
||||
"VFS: %lu, Inode %lu", (unsigned long)
|
||||
inode, (unsigned long)iaddr2blockno(sb, &ino_num));
|
||||
return BEFS_BAD_INODE;
|
||||
}
|
||||
|
||||
@ -44,7 +45,8 @@ befs_check_inode(struct super_block *sb, befs_inode * raw_inode,
|
||||
*/
|
||||
|
||||
if (!(flags & BEFS_INODE_IN_USE)) {
|
||||
befs_error(sb, "inode is not used - inode = %lu", inode);
|
||||
befs_error(sb, "inode is not used - inode = %lu",
|
||||
(unsigned long)inode);
|
||||
return BEFS_BAD_INODE;
|
||||
}
|
||||
|
||||
|
24
fs/befs/io.c
24
fs/befs/io.c
@ -30,9 +30,9 @@ befs_bread_iaddr(struct super_block *sb, befs_inode_addr iaddr)
|
||||
befs_blocknr_t block = 0;
|
||||
befs_sb_info *befs_sb = BEFS_SB(sb);
|
||||
|
||||
befs_debug(sb, "---> Enter befs_read_iaddr() "
|
||||
"[%u, %hu, %hu]",
|
||||
iaddr.allocation_group, iaddr.start, iaddr.len);
|
||||
befs_debug(sb, "---> Enter %s "
|
||||
"[%u, %hu, %hu]", __func__, iaddr.allocation_group,
|
||||
iaddr.start, iaddr.len);
|
||||
|
||||
if (iaddr.allocation_group > befs_sb->num_ags) {
|
||||
befs_error(sb, "BEFS: Invalid allocation group %u, max is %u",
|
||||
@ -42,20 +42,21 @@ befs_bread_iaddr(struct super_block *sb, befs_inode_addr iaddr)
|
||||
|
||||
block = iaddr2blockno(sb, &iaddr);
|
||||
|
||||
befs_debug(sb, "befs_read_iaddr: offset = %lu", block);
|
||||
befs_debug(sb, "%s: offset = %lu", __func__, (unsigned long)block);
|
||||
|
||||
bh = sb_bread(sb, block);
|
||||
|
||||
if (bh == NULL) {
|
||||
befs_error(sb, "Failed to read block %lu", block);
|
||||
befs_error(sb, "Failed to read block %lu",
|
||||
(unsigned long)block);
|
||||
goto error;
|
||||
}
|
||||
|
||||
befs_debug(sb, "<--- befs_read_iaddr()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
return bh;
|
||||
|
||||
error:
|
||||
befs_debug(sb, "<--- befs_read_iaddr() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -64,20 +65,21 @@ befs_bread(struct super_block *sb, befs_blocknr_t block)
|
||||
{
|
||||
struct buffer_head *bh = NULL;
|
||||
|
||||
befs_debug(sb, "---> Enter befs_read() %Lu", block);
|
||||
befs_debug(sb, "---> Enter %s %lu", __func__, (unsigned long)block);
|
||||
|
||||
bh = sb_bread(sb, block);
|
||||
|
||||
if (bh == NULL) {
|
||||
befs_error(sb, "Failed to read block %lu", block);
|
||||
befs_error(sb, "Failed to read block %lu",
|
||||
(unsigned long)block);
|
||||
goto error;
|
||||
}
|
||||
|
||||
befs_debug(sb, "<--- befs_read()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
|
||||
return bh;
|
||||
|
||||
error:
|
||||
befs_debug(sb, "<--- befs_read() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -5,6 +5,8 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/fs.h>
|
||||
@ -39,7 +41,6 @@ static struct dentry *befs_lookup(struct inode *, struct dentry *, unsigned int)
|
||||
static struct inode *befs_iget(struct super_block *, unsigned long);
|
||||
static struct inode *befs_alloc_inode(struct super_block *sb);
|
||||
static void befs_destroy_inode(struct inode *inode);
|
||||
static int befs_init_inodecache(void);
|
||||
static void befs_destroy_inodecache(void);
|
||||
static void *befs_follow_link(struct dentry *, struct nameidata *);
|
||||
static void *befs_fast_follow_link(struct dentry *, struct nameidata *);
|
||||
@ -131,26 +132,28 @@ befs_get_block(struct inode *inode, sector_t block,
|
||||
ulong disk_off;
|
||||
|
||||
befs_debug(sb, "---> befs_get_block() for inode %lu, block %ld",
|
||||
inode->i_ino, block);
|
||||
(unsigned long)inode->i_ino, (long)block);
|
||||
|
||||
if (block < 0) {
|
||||
befs_error(sb, "befs_get_block() was asked for a block "
|
||||
"number less than zero: block %ld in inode %lu",
|
||||
block, inode->i_ino);
|
||||
(long)block, (unsigned long)inode->i_ino);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (create) {
|
||||
befs_error(sb, "befs_get_block() was asked to write to "
|
||||
"block %ld in inode %lu", block, inode->i_ino);
|
||||
"block %ld in inode %lu", (long)block,
|
||||
(unsigned long)inode->i_ino);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
res = befs_fblock2brun(sb, ds, block, &run);
|
||||
if (res != BEFS_OK) {
|
||||
befs_error(sb,
|
||||
"<--- befs_get_block() for inode %lu, block "
|
||||
"%ld ERROR", inode->i_ino, block);
|
||||
"<--- %s for inode %lu, block %ld ERROR",
|
||||
__func__, (unsigned long)inode->i_ino,
|
||||
(long)block);
|
||||
return -EFBIG;
|
||||
}
|
||||
|
||||
@ -158,8 +161,9 @@ befs_get_block(struct inode *inode, sector_t block,
|
||||
|
||||
map_bh(bh_result, inode->i_sb, disk_off);
|
||||
|
||||
befs_debug(sb, "<--- befs_get_block() for inode %lu, block %ld, "
|
||||
"disk address %lu", inode->i_ino, block, disk_off);
|
||||
befs_debug(sb, "<--- %s for inode %lu, block %ld, disk address %lu",
|
||||
__func__, (unsigned long)inode->i_ino, (long)block,
|
||||
(unsigned long)disk_off);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -176,15 +180,15 @@ befs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
|
||||
char *utfname;
|
||||
const char *name = dentry->d_name.name;
|
||||
|
||||
befs_debug(sb, "---> befs_lookup() "
|
||||
"name %s inode %ld", dentry->d_name.name, dir->i_ino);
|
||||
befs_debug(sb, "---> %s name %s inode %ld", __func__,
|
||||
dentry->d_name.name, dir->i_ino);
|
||||
|
||||
/* Convert to UTF-8 */
|
||||
if (BEFS_SB(sb)->nls) {
|
||||
ret =
|
||||
befs_nls2utf(sb, name, strlen(name), &utfname, &utfnamelen);
|
||||
if (ret < 0) {
|
||||
befs_debug(sb, "<--- befs_lookup() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
ret = befs_btree_find(sb, ds, utfname, &offset);
|
||||
@ -195,12 +199,12 @@ befs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
|
||||
}
|
||||
|
||||
if (ret == BEFS_BT_NOT_FOUND) {
|
||||
befs_debug(sb, "<--- befs_lookup() %s not found",
|
||||
befs_debug(sb, "<--- %s %s not found", __func__,
|
||||
dentry->d_name.name);
|
||||
return ERR_PTR(-ENOENT);
|
||||
|
||||
} else if (ret != BEFS_OK || offset == 0) {
|
||||
befs_warning(sb, "<--- befs_lookup() Error");
|
||||
befs_warning(sb, "<--- %s Error", __func__);
|
||||
return ERR_PTR(-ENODATA);
|
||||
}
|
||||
|
||||
@ -210,7 +214,7 @@ befs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
|
||||
|
||||
d_add(dentry, inode);
|
||||
|
||||
befs_debug(sb, "<--- befs_lookup()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
@ -228,26 +232,25 @@ befs_readdir(struct file *file, struct dir_context *ctx)
|
||||
char keybuf[BEFS_NAME_LEN + 1];
|
||||
const char *dirname = file->f_path.dentry->d_name.name;
|
||||
|
||||
befs_debug(sb, "---> befs_readdir() "
|
||||
"name %s, inode %ld, ctx->pos %Ld",
|
||||
dirname, inode->i_ino, ctx->pos);
|
||||
befs_debug(sb, "---> %s name %s, inode %ld, ctx->pos %lld",
|
||||
__func__, dirname, inode->i_ino, ctx->pos);
|
||||
|
||||
more:
|
||||
result = befs_btree_read(sb, ds, ctx->pos, BEFS_NAME_LEN + 1,
|
||||
keybuf, &keysize, &value);
|
||||
|
||||
if (result == BEFS_ERR) {
|
||||
befs_debug(sb, "<--- befs_readdir() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
befs_error(sb, "IO error reading %s (inode %lu)",
|
||||
dirname, inode->i_ino);
|
||||
return -EIO;
|
||||
|
||||
} else if (result == BEFS_BT_END) {
|
||||
befs_debug(sb, "<--- befs_readdir() END");
|
||||
befs_debug(sb, "<--- %s END", __func__);
|
||||
return 0;
|
||||
|
||||
} else if (result == BEFS_BT_EMPTY) {
|
||||
befs_debug(sb, "<--- befs_readdir() Empty directory");
|
||||
befs_debug(sb, "<--- %s Empty directory", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -260,7 +263,7 @@ more:
|
||||
result =
|
||||
befs_utf2nls(sb, keybuf, keysize, &nlsname, &nlsnamelen);
|
||||
if (result < 0) {
|
||||
befs_debug(sb, "<--- befs_readdir() ERROR");
|
||||
befs_debug(sb, "<--- %s ERROR", __func__);
|
||||
return result;
|
||||
}
|
||||
if (!dir_emit(ctx, nlsname, nlsnamelen,
|
||||
@ -277,7 +280,7 @@ more:
|
||||
ctx->pos++;
|
||||
goto more;
|
||||
|
||||
befs_debug(sb, "<--- befs_readdir() pos %Ld", ctx->pos);
|
||||
befs_debug(sb, "<--- %s pos %lld", __func__, ctx->pos);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -321,7 +324,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
|
||||
struct inode *inode;
|
||||
long ret = -EIO;
|
||||
|
||||
befs_debug(sb, "---> befs_read_inode() " "inode = %lu", ino);
|
||||
befs_debug(sb, "---> %s inode = %lu", __func__, ino);
|
||||
|
||||
inode = iget_locked(sb, ino);
|
||||
if (!inode)
|
||||
@ -428,7 +431,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
|
||||
}
|
||||
|
||||
brelse(bh);
|
||||
befs_debug(sb, "<--- befs_read_inode()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
unlock_new_inode(inode);
|
||||
return inode;
|
||||
|
||||
@ -437,7 +440,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
|
||||
|
||||
unacquire_none:
|
||||
iget_failed(inode);
|
||||
befs_debug(sb, "<--- befs_read_inode() - Bad inode");
|
||||
befs_debug(sb, "<--- %s - Bad inode", __func__);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@ -445,7 +448,7 @@ static struct inode *befs_iget(struct super_block *sb, unsigned long ino)
|
||||
*
|
||||
* Taken from NFS implementation by Al Viro.
|
||||
*/
|
||||
static int
|
||||
static int __init
|
||||
befs_init_inodecache(void)
|
||||
{
|
||||
befs_inode_cachep = kmem_cache_create("befs_inode_cache",
|
||||
@ -454,11 +457,9 @@ befs_init_inodecache(void)
|
||||
SLAB_MEM_SPREAD),
|
||||
init_once);
|
||||
if (befs_inode_cachep == NULL) {
|
||||
printk(KERN_ERR "befs_init_inodecache: "
|
||||
"Couldn't initialize inode slabcache\n");
|
||||
pr_err("%s: Couldn't initialize inode slabcache\n", __func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -544,16 +545,16 @@ befs_utf2nls(struct super_block *sb, const char *in,
|
||||
*/
|
||||
int maxlen = in_len + 1;
|
||||
|
||||
befs_debug(sb, "---> utf2nls()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
if (!nls) {
|
||||
befs_error(sb, "befs_utf2nls called with no NLS table loaded");
|
||||
befs_error(sb, "%s called with no NLS table loaded", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*out = result = kmalloc(maxlen, GFP_NOFS);
|
||||
if (!*out) {
|
||||
befs_error(sb, "befs_utf2nls() cannot allocate memory");
|
||||
befs_error(sb, "%s cannot allocate memory", __func__);
|
||||
*out_len = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -575,14 +576,14 @@ befs_utf2nls(struct super_block *sb, const char *in,
|
||||
result[o] = '\0';
|
||||
*out_len = o;
|
||||
|
||||
befs_debug(sb, "<--- utf2nls()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
|
||||
return o;
|
||||
|
||||
conv_err:
|
||||
befs_error(sb, "Name using character set %s contains a character that "
|
||||
"cannot be converted to unicode.", nls->charset);
|
||||
befs_debug(sb, "<--- utf2nls()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
kfree(result);
|
||||
return -EILSEQ;
|
||||
}
|
||||
@ -623,16 +624,17 @@ befs_nls2utf(struct super_block *sb, const char *in,
|
||||
* in special cases */
|
||||
int maxlen = (3 * in_len) + 1;
|
||||
|
||||
befs_debug(sb, "---> nls2utf()\n");
|
||||
befs_debug(sb, "---> %s\n", __func__);
|
||||
|
||||
if (!nls) {
|
||||
befs_error(sb, "befs_nls2utf called with no NLS table loaded.");
|
||||
befs_error(sb, "%s called with no NLS table loaded.",
|
||||
__func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
*out = result = kmalloc(maxlen, GFP_NOFS);
|
||||
if (!*out) {
|
||||
befs_error(sb, "befs_nls2utf() cannot allocate memory");
|
||||
befs_error(sb, "%s cannot allocate memory", __func__);
|
||||
*out_len = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -653,14 +655,14 @@ befs_nls2utf(struct super_block *sb, const char *in,
|
||||
result[o] = '\0';
|
||||
*out_len = o;
|
||||
|
||||
befs_debug(sb, "<--- nls2utf()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
|
||||
return i;
|
||||
|
||||
conv_err:
|
||||
befs_error(sb, "Name using charecter set %s contains a charecter that "
|
||||
"cannot be converted to unicode.", nls->charset);
|
||||
befs_debug(sb, "<--- nls2utf()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
kfree(result);
|
||||
return -EILSEQ;
|
||||
}
|
||||
@ -715,8 +717,8 @@ parse_options(char *options, befs_mount_options * opts)
|
||||
if (option >= 0)
|
||||
uid = make_kuid(current_user_ns(), option);
|
||||
if (!uid_valid(uid)) {
|
||||
printk(KERN_ERR "BeFS: Invalid uid %d, "
|
||||
"using default\n", option);
|
||||
pr_err("Invalid uid %d, "
|
||||
"using default\n", option);
|
||||
break;
|
||||
}
|
||||
opts->uid = uid;
|
||||
@ -729,8 +731,8 @@ parse_options(char *options, befs_mount_options * opts)
|
||||
if (option >= 0)
|
||||
gid = make_kgid(current_user_ns(), option);
|
||||
if (!gid_valid(gid)) {
|
||||
printk(KERN_ERR "BeFS: Invalid gid %d, "
|
||||
"using default\n", option);
|
||||
pr_err("Invalid gid %d, "
|
||||
"using default\n", option);
|
||||
break;
|
||||
}
|
||||
opts->gid = gid;
|
||||
@ -740,8 +742,8 @@ parse_options(char *options, befs_mount_options * opts)
|
||||
kfree(opts->iocharset);
|
||||
opts->iocharset = match_strdup(&args[0]);
|
||||
if (!opts->iocharset) {
|
||||
printk(KERN_ERR "BeFS: allocation failure for "
|
||||
"iocharset string\n");
|
||||
pr_err("allocation failure for "
|
||||
"iocharset string\n");
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
@ -749,8 +751,8 @@ parse_options(char *options, befs_mount_options * opts)
|
||||
opts->debug = 1;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_ERR "BeFS: Unrecognized mount option \"%s\" "
|
||||
"or missing value\n", p);
|
||||
pr_err("Unrecognized mount option \"%s\" "
|
||||
"or missing value\n", p);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -791,22 +793,20 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
|
||||
save_mount_options(sb, data);
|
||||
|
||||
sb->s_fs_info = kmalloc(sizeof (*befs_sb), GFP_KERNEL);
|
||||
sb->s_fs_info = kzalloc(sizeof(*befs_sb), GFP_KERNEL);
|
||||
if (sb->s_fs_info == NULL) {
|
||||
printk(KERN_ERR
|
||||
"BeFS(%s): Unable to allocate memory for private "
|
||||
pr_err("(%s): Unable to allocate memory for private "
|
||||
"portion of superblock. Bailing.\n", sb->s_id);
|
||||
goto unacquire_none;
|
||||
}
|
||||
befs_sb = BEFS_SB(sb);
|
||||
memset(befs_sb, 0, sizeof(befs_sb_info));
|
||||
|
||||
if (!parse_options((char *) data, &befs_sb->mount_opts)) {
|
||||
befs_error(sb, "cannot parse mount options");
|
||||
goto unacquire_priv_sbp;
|
||||
}
|
||||
|
||||
befs_debug(sb, "---> befs_fill_super()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
#ifndef CONFIG_BEFS_RW
|
||||
if (!(sb->s_flags & MS_RDONLY)) {
|
||||
@ -854,7 +854,7 @@ befs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
goto unacquire_priv_sbp;
|
||||
|
||||
if( befs_sb->num_blocks > ~((sector_t)0) ) {
|
||||
befs_error(sb, "blocks count: %Lu "
|
||||
befs_error(sb, "blocks count: %llu "
|
||||
"is larger than the host can use",
|
||||
befs_sb->num_blocks);
|
||||
goto unacquire_priv_sbp;
|
||||
@ -924,7 +924,7 @@ befs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
struct super_block *sb = dentry->d_sb;
|
||||
u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
|
||||
|
||||
befs_debug(sb, "---> befs_statfs()");
|
||||
befs_debug(sb, "---> %s", __func__);
|
||||
|
||||
buf->f_type = BEFS_SUPER_MAGIC;
|
||||
buf->f_bsize = sb->s_blocksize;
|
||||
@ -937,7 +937,7 @@ befs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||
buf->f_fsid.val[1] = (u32)(id >> 32);
|
||||
buf->f_namelen = BEFS_NAME_LEN;
|
||||
|
||||
befs_debug(sb, "<--- befs_statfs()");
|
||||
befs_debug(sb, "<--- %s", __func__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -963,7 +963,7 @@ init_befs_fs(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
printk(KERN_INFO "BeFS version: %s\n", BEFS_VERSION);
|
||||
pr_info("version: %s\n", BEFS_VERSION);
|
||||
|
||||
err = befs_init_inodecache();
|
||||
if (err)
|
||||
|
@ -172,7 +172,7 @@ static void bfs_evict_inode(struct inode *inode)
|
||||
|
||||
dprintf("ino=%08lx\n", ino);
|
||||
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
invalidate_inode_buffers(inode);
|
||||
clear_inode(inode);
|
||||
|
||||
|
@ -46,10 +46,15 @@
|
||||
#endif
|
||||
|
||||
static int load_elf_binary(struct linux_binprm *bprm);
|
||||
static int load_elf_library(struct file *);
|
||||
static unsigned long elf_map(struct file *, unsigned long, struct elf_phdr *,
|
||||
int, int, unsigned long);
|
||||
|
||||
#ifdef CONFIG_USELIB
|
||||
static int load_elf_library(struct file *);
|
||||
#else
|
||||
#define load_elf_library NULL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* If we don't support core dumping, then supply a NULL so we
|
||||
* don't even try.
|
||||
@ -1005,6 +1010,7 @@ out_free_ph:
|
||||
goto out;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_USELIB
|
||||
/* This is really simpleminded and specialized - we are loading an
|
||||
a.out library that is given an ELF header. */
|
||||
static int load_elf_library(struct file *file)
|
||||
@ -1083,6 +1089,7 @@ out_free_ph:
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
#endif /* #ifdef CONFIG_USELIB */
|
||||
|
||||
#ifdef CONFIG_ELF_CORE
|
||||
/*
|
||||
|
@ -656,6 +656,7 @@ static ssize_t bm_status_write(struct file * file, const char __user * buffer,
|
||||
|
||||
mutex_unlock(&root->d_inode->i_mutex);
|
||||
dput(root);
|
||||
break;
|
||||
default: return res;
|
||||
}
|
||||
return count;
|
||||
|
@ -83,7 +83,7 @@ void kill_bdev(struct block_device *bdev)
|
||||
{
|
||||
struct address_space *mapping = bdev->bd_inode->i_mapping;
|
||||
|
||||
if (mapping->nrpages == 0)
|
||||
if (mapping->nrpages == 0 && mapping->nrshadows == 0)
|
||||
return;
|
||||
|
||||
invalidate_bh_lrus();
|
||||
@ -419,7 +419,7 @@ static void bdev_evict_inode(struct inode *inode)
|
||||
{
|
||||
struct block_device *bdev = &BDEV_I(inode)->bdev;
|
||||
struct list_head *p;
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
invalidate_inode_buffers(inode); /* is it needed here? */
|
||||
clear_inode(inode);
|
||||
spin_lock(&bdev_lock);
|
||||
@ -1523,7 +1523,7 @@ ssize_t blkdev_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
||||
ssize_t err;
|
||||
|
||||
err = generic_write_sync(file, pos, ret);
|
||||
if (err < 0 && ret > 0)
|
||||
if (err < 0)
|
||||
ret = err;
|
||||
}
|
||||
blk_finish_plug(&plug);
|
||||
|
@ -472,7 +472,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,
|
||||
rcu_read_lock();
|
||||
page = radix_tree_lookup(&mapping->page_tree, pg_index);
|
||||
rcu_read_unlock();
|
||||
if (page) {
|
||||
if (page && !radix_tree_exceptional_entry(page)) {
|
||||
misses++;
|
||||
if (misses > 4)
|
||||
break;
|
||||
|
@ -1797,7 +1797,7 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
|
||||
BTRFS_I(inode)->last_sub_trans = root->log_transid;
|
||||
if (num_written > 0) {
|
||||
err = generic_write_sync(file, pos, num_written);
|
||||
if (err < 0 && num_written > 0)
|
||||
if (err < 0)
|
||||
num_written = err;
|
||||
}
|
||||
|
||||
|
@ -4593,7 +4593,7 @@ static void evict_inode_truncate_pages(struct inode *inode)
|
||||
struct rb_node *node;
|
||||
|
||||
ASSERT(inode->i_state & I_FREEING);
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
|
||||
write_lock(&map_tree->lock);
|
||||
while (!RB_EMPTY_ROOT(&map_tree->map)) {
|
||||
|
@ -265,24 +265,22 @@ static int cachefiles_read_backing_file_one(struct cachefiles_object *object,
|
||||
goto nomem_monitor;
|
||||
}
|
||||
|
||||
ret = add_to_page_cache(newpage, bmapping,
|
||||
netpage->index, cachefiles_gfp);
|
||||
ret = add_to_page_cache_lru(newpage, bmapping,
|
||||
netpage->index, cachefiles_gfp);
|
||||
if (ret == 0)
|
||||
goto installed_new_backing_page;
|
||||
if (ret != -EEXIST)
|
||||
goto nomem_page;
|
||||
}
|
||||
|
||||
/* we've installed a new backing page, so now we need to add it
|
||||
* to the LRU list and start it reading */
|
||||
/* we've installed a new backing page, so now we need to start
|
||||
* it reading */
|
||||
installed_new_backing_page:
|
||||
_debug("- new %p", newpage);
|
||||
|
||||
backpage = newpage;
|
||||
newpage = NULL;
|
||||
|
||||
lru_cache_add_file(backpage);
|
||||
|
||||
read_backing_page:
|
||||
ret = bmapping->a_ops->readpage(NULL, backpage);
|
||||
if (ret < 0)
|
||||
@ -510,24 +508,23 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
|
||||
goto nomem;
|
||||
}
|
||||
|
||||
ret = add_to_page_cache(newpage, bmapping,
|
||||
netpage->index, cachefiles_gfp);
|
||||
ret = add_to_page_cache_lru(newpage, bmapping,
|
||||
netpage->index,
|
||||
cachefiles_gfp);
|
||||
if (ret == 0)
|
||||
goto installed_new_backing_page;
|
||||
if (ret != -EEXIST)
|
||||
goto nomem;
|
||||
}
|
||||
|
||||
/* we've installed a new backing page, so now we need to add it
|
||||
* to the LRU list and start it reading */
|
||||
/* we've installed a new backing page, so now we need
|
||||
* to start it reading */
|
||||
installed_new_backing_page:
|
||||
_debug("- new %p", newpage);
|
||||
|
||||
backpage = newpage;
|
||||
newpage = NULL;
|
||||
|
||||
lru_cache_add_file(backpage);
|
||||
|
||||
reread_backing_page:
|
||||
ret = bmapping->a_ops->readpage(NULL, backpage);
|
||||
if (ret < 0)
|
||||
@ -538,8 +535,8 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
|
||||
monitor_backing_page:
|
||||
_debug("- monitor add");
|
||||
|
||||
ret = add_to_page_cache(netpage, op->mapping, netpage->index,
|
||||
cachefiles_gfp);
|
||||
ret = add_to_page_cache_lru(netpage, op->mapping,
|
||||
netpage->index, cachefiles_gfp);
|
||||
if (ret < 0) {
|
||||
if (ret == -EEXIST) {
|
||||
page_cache_release(netpage);
|
||||
@ -549,8 +546,6 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
|
||||
goto nomem;
|
||||
}
|
||||
|
||||
lru_cache_add_file(netpage);
|
||||
|
||||
/* install a monitor */
|
||||
page_cache_get(netpage);
|
||||
monitor->netfs_page = netpage;
|
||||
@ -613,8 +608,8 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
|
||||
backing_page_already_uptodate:
|
||||
_debug("- uptodate");
|
||||
|
||||
ret = add_to_page_cache(netpage, op->mapping, netpage->index,
|
||||
cachefiles_gfp);
|
||||
ret = add_to_page_cache_lru(netpage, op->mapping,
|
||||
netpage->index, cachefiles_gfp);
|
||||
if (ret < 0) {
|
||||
if (ret == -EEXIST) {
|
||||
page_cache_release(netpage);
|
||||
@ -631,8 +626,6 @@ static int cachefiles_read_backing_file(struct cachefiles_object *object,
|
||||
|
||||
fscache_mark_page_cached(op, netpage);
|
||||
|
||||
lru_cache_add_file(netpage);
|
||||
|
||||
/* the netpage is unlocked and marked up to date here */
|
||||
fscache_end_io(op, netpage, 0);
|
||||
page_cache_release(netpage);
|
||||
|
@ -286,7 +286,7 @@ cifs_destroy_inode(struct inode *inode)
|
||||
static void
|
||||
cifs_evict_inode(struct inode *inode)
|
||||
{
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
clear_inode(inode);
|
||||
cifs_fscache_release_inode_cookie(inode);
|
||||
}
|
||||
@ -1005,7 +1005,7 @@ cifs_init_once(void *inode)
|
||||
init_rwsem(&cifsi->lock_sem);
|
||||
}
|
||||
|
||||
static int
|
||||
static int __init
|
||||
cifs_init_inodecache(void)
|
||||
{
|
||||
cifs_inode_cachep = kmem_cache_create("cifs_inode_cache",
|
||||
|
@ -10,7 +10,7 @@ extern int coda_hard;
|
||||
extern int coda_fake_statfs;
|
||||
|
||||
void coda_destroy_inodecache(void);
|
||||
int coda_init_inodecache(void);
|
||||
int __init coda_init_inodecache(void);
|
||||
int coda_fsync(struct file *coda_file, loff_t start, loff_t end, int datasync);
|
||||
void coda_sysctl_init(void);
|
||||
void coda_sysctl_clean(void);
|
||||
|
@ -73,7 +73,7 @@ static void init_once(void *foo)
|
||||
inode_init_once(&ei->vfs_inode);
|
||||
}
|
||||
|
||||
int coda_init_inodecache(void)
|
||||
int __init coda_init_inodecache(void)
|
||||
{
|
||||
coda_inode_cachep = kmem_cache_create("coda_inode_cache",
|
||||
sizeof(struct coda_inode_info),
|
||||
@ -250,7 +250,7 @@ static void coda_put_super(struct super_block *sb)
|
||||
|
||||
static void coda_evict_inode(struct inode *inode)
|
||||
{
|
||||
truncate_inode_pages(&inode->i_data, 0);
|
||||
truncate_inode_pages_final(&inode->i_data);
|
||||
clear_inode(inode);
|
||||
coda_cache_clear_inode(inode);
|
||||
}
|
||||
|
@ -195,8 +195,7 @@ static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned i
|
||||
struct page *page = NULL;
|
||||
|
||||
if (blocknr + i < devsize) {
|
||||
page = read_mapping_page_async(mapping, blocknr + i,
|
||||
NULL);
|
||||
page = read_mapping_page(mapping, blocknr + i, NULL);
|
||||
/* synchronous error? */
|
||||
if (IS_ERR(page))
|
||||
page = NULL;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user