summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/tegra_odm_fuses.c
diff options
context:
space:
mode:
authorVarun Wadekar <vwadekar@nvidia.com>2011-03-13 17:40:30 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:52:10 -0800
commit14055fc6c7dd7e565f2904eb4d24f72e486b98aa (patch)
tree8729afab1f3bed7e7895fd828095eadc950ee46a /arch/arm/mach-tegra/tegra_odm_fuses.c
parent33938d6751f67911afcddf1e1eafbd5f850bfc97 (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.c8
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;
}