summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobby Cai <R63905@freescale.com>2010-12-15 18:38:30 +0800
committerRobby Cai <R63905@freescale.com>2010-12-15 19:01:25 +0800
commitd27fdc7b98277b981a7f493b7d8256a4f3fe313b (patch)
treef2fc49c06778d0dc80b262a1adb3f2e743c4baa4
parenta4bdc8d89725f891a1ae485be9feb22cdeb0589b (diff)
ENGR00136990-2 MX50: Add sys interface to control ZQ calib run interval
By default, dynamic ZQ calibration runs by interval of 10 seconds. This interval can be changed via Sys, for example 5 seconds, echo 5 > /sys/devices/platform/mxc_zq_calib/interval Signed-off-by: Robby Cai <R63905@freescale.com>
-rw-r--r--arch/arm/plat-mxc/zq_calib.c39
1 files changed, 36 insertions, 3 deletions
diff --git a/arch/arm/plat-mxc/zq_calib.c b/arch/arm/plat-mxc/zq_calib.c
index db9a6697745d..8b1b741eb087 100644
--- a/arch/arm/plat-mxc/zq_calib.c
+++ b/arch/arm/plat-mxc/zq_calib.c
@@ -29,8 +29,8 @@
#include <mach/hardware.h>
-/* 10 secs, shall support changing this value in use-space later */
-#define ZQ_INTERVAL (10 * 1000)
+/* 10 secs by default, users can change it via sys */
+static int interval = 10;
static struct device *zq_calib_dev;
@@ -332,16 +332,48 @@ static void mxc_zq_main(struct work_struct *dummy)
/* zq_sw_load(pu, pd); */
spin_unlock(&zq_lock);
- queue_delayed_work(zq_queue, &zq_work, msecs_to_jiffies(ZQ_INTERVAL));
+ queue_delayed_work(zq_queue, &zq_work,
+ msecs_to_jiffies(interval * 1000));
}
+static ssize_t interval_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sprintf(buf, "%d\n", interval);
+}
+
+static ssize_t interval_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ int val;
+ if (sscanf(buf, "%d", &val) > 0) {
+ interval = val;
+ return count;
+ }
+ return -EINVAL;
+}
+
+static DEVICE_ATTR(interval, 0644, interval_show,
+ interval_store);
+
static int __devinit mxc_zq_calib_probe(struct platform_device *pdev)
{
+ int err = 0;
+
zq_calib_dev = &pdev->dev;
zq_queue = create_singlethread_workqueue("zq_calib");;
if (!zq_queue)
return -ENOMEM;
+ err = device_create_file(&pdev->dev, &dev_attr_interval);
+ if (err) {
+ dev_err(&pdev->dev,
+ "Unable to create file from interval\n");
+ destroy_workqueue(zq_queue);
+ return err;
+ }
+
mxc_zq_main(NULL);
return 0;
@@ -352,6 +384,7 @@ static int __devexit mxc_zq_calib_remove(struct platform_device *pdev)
cancel_delayed_work(&zq_work);
flush_workqueue(zq_queue);
destroy_workqueue(zq_queue);
+ device_remove_file(&pdev->dev, &dev_attr_interval);
return 0;
}