diff options
author | Varun Wadekar <vwadekar@nvidia.com> | 2011-03-13 17:40:30 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:52:10 -0800 |
commit | 14055fc6c7dd7e565f2904eb4d24f72e486b98aa (patch) | |
tree | 8729afab1f3bed7e7895fd828095eadc950ee46a /arch/arm/mach-tegra/tegra_odm_fuses.c | |
parent | 33938d6751f67911afcddf1e1eafbd5f850bfc97 (diff) |
ARM: tegra: fuse: expose fuses through sysfs (wakelock)
Add wakelocks to the fuse burning process.
fuses can be read/written via sysfs entries.
fuse sysfs entries will be present under /sys/firmware/fuse
Based on work done by Venu Byravarasu <vbyravarasu@nvidia.com>
Original-Change-Id: Iadb0a83671c8823c541f6bcc2f5f5583d750c1ed
Signed-off-by: Varun Wadekar <vwadekar@nvidia.com>
Reviewed-on: http://git-master/r/22763
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Rebase-Id: Rd61e3b7aca1d1019f581baedf1ec95772936b779
Diffstat (limited to 'arch/arm/mach-tegra/tegra_odm_fuses.c')
-rw-r--r-- | arch/arm/mach-tegra/tegra_odm_fuses.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/arm/mach-tegra/tegra_odm_fuses.c b/arch/arm/mach-tegra/tegra_odm_fuses.c index 96f69f4b0458..6f6d22362fd1 100644 --- a/arch/arm/mach-tegra/tegra_odm_fuses.c +++ b/arch/arm/mach-tegra/tegra_odm_fuses.c @@ -43,6 +43,7 @@ #include <linux/kobject.h> #include <linux/regulator/consumer.h> #include <linux/ctype.h> +#include <linux/wakelock.h> #include <linux/clk.h> #include <mach/tegra_odm_fuses.h> @@ -752,6 +753,7 @@ static ssize_t fuse_store(struct kobject *kobj, struct kobj_attribute *attr, struct fuse_data data = {0}; u32 *raw_data = ((u32 *)&data) + fuse_info_tbl[param].data_offset; u8 *raw_byte_data = (u8 *)raw_data; + struct wake_lock fuse_wk_lock; if ((param == -1) || (param == -ENODATA)) { pr_err("%s: invalid fuse\n", __func__); @@ -779,6 +781,10 @@ static ssize_t fuse_store(struct kobject *kobj, struct kobj_attribute *attr, buf += 2; } + /* wakelock to avoid device powering down while programming */ + wake_lock_init(&fuse_wk_lock, WAKE_LOCK_SUSPEND, "fuse_wk_lock"); + wake_lock(&fuse_wk_lock); + /* we need to fit each character into a single nibble */ raw_byte_data += DIV_ROUND_UP(count, 2) - 1; @@ -821,6 +827,8 @@ static ssize_t fuse_store(struct kobject *kobj, struct kobj_attribute *attr, } done: + wake_unlock(&fuse_wk_lock); + wake_lock_destroy(&fuse_wk_lock); return orig_count; } |