diff options
author | Robby Cai <R63905@freescale.com> | 2010-12-15 18:38:30 +0800 |
---|---|---|
committer | Robby Cai <R63905@freescale.com> | 2010-12-15 19:01:25 +0800 |
commit | d27fdc7b98277b981a7f493b7d8256a4f3fe313b (patch) | |
tree | f2fc49c06778d0dc80b262a1adb3f2e743c4baa4 | |
parent | a4bdc8d89725f891a1ae485be9feb22cdeb0589b (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.c | 39 |
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; } |