From 2760fab4d93c12b30a249f192fe2ad984a0d5a07 Mon Sep 17 00:00:00 2001 From: Jun Yan Date: Thu, 8 Aug 2013 15:19:19 -0700 Subject: misc: issp: add sysfs node to control issp pins issp_reset: toggle issp reset pin. issp_usbreset: reload usb driver and toggle issp reset pin issp_data: read and write the state of issp_data pin issp_clk: read and write the state of issp_clk pin Bug 1364476 Change-Id: I3b470f0745ed002b16bdc71f661e0d18629f796f Signed-off-by: Jun Yan Reviewed-on: http://git-master/r/259787 Reviewed-by: Anshul Jain (SW) Tested-by: Anshul Jain (SW) Reviewed-on: http://git-master/r/279099 Reviewed-by: Automatic_Commit_Validation_User --- drivers/misc/issp/issp.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/drivers/misc/issp/issp.c b/drivers/misc/issp/issp.c index f77fca7a62cc..675f30b823d1 100644 --- a/drivers/misc/issp/issp.c +++ b/drivers/misc/issp/issp.c @@ -181,6 +181,77 @@ void issp_start_recovery_work(void) } +static ssize_t issp_reset_set(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { + issp_uc_reset(); + pr_err("issp: toggling reset pin on uC!"); + return count; +} + +static ssize_t issp_usbreset_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { + roth_usb_unload(); + issp_uc_reset(); + roth_usb_reload(); + pr_err("issp: reset both usb and uC!"); + return count; +} + +static ssize_t issp_data_set(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { + int val; + struct issp_platform_data *pdata = dev->platform_data; + + if (!kstrtoul(buf, 10, &val)) { + if (val == 1 || val == 0) { + gpio_set_value(pdata->data_gpio, val); + pr_err("issp: set data gpio to %d", val); + } + } + return count; +} + +static ssize_t issp_data_show(struct device *dev, struct device_attribute *attr, + char *buf) { + unsigned int val; + struct issp_platform_data *pdata = dev->platform_data; + val = gpio_get_value(pdata->data_gpio); + + return sprintf(buf, "%u\n", val); +} + + +static ssize_t issp_clk_set(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { + int val; + struct issp_platform_data *pdata = dev->platform_data; + + if (!kstrtoul(buf, 10, &val)) { + if (val == 1 || val == 0) { + gpio_set_value(pdata->clk_gpio, val); + pr_err("issp: set clk gpio to %d", val); + } + } + return count; +} + +static ssize_t issp_clk_show(struct device *dev, struct device_attribute *attr, + char *buf) { + unsigned int val; + struct issp_platform_data *pdata = dev->platform_data; + val = gpio_get_value(pdata->clk_gpio); + + return sprintf(buf, "%u\n", val); +} + +static DEVICE_ATTR(issp_reset, S_IWGRP|S_IWUSR, NULL, issp_reset_set); +static DEVICE_ATTR(issp_usbreset, S_IWGRP|S_IWUSR, NULL, issp_usbreset_set); +static DEVICE_ATTR(issp_data, S_IWGRP|S_IWUSR|S_IRGRP|S_IRUSR, + issp_data_show, issp_data_set); +static DEVICE_ATTR(issp_clk, S_IWGRP|S_IWUSR|S_IRGRP|S_IRUSR, + issp_clk_show, issp_clk_set); + static int __init issp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; @@ -249,6 +320,22 @@ static int __init issp_probe(struct platform_device *pdev) dev_err(dev, "Firmware update failed!\n"); } + ret = device_create_file(dev, &dev_attr_issp_reset); + if (ret) + dev_err(dev, "ISSP sysfs node create failed\n"); + + ret = device_create_file(dev, &dev_attr_issp_usbreset); + if (ret) + dev_err(dev, "ISSP sysfs node create failed\n"); + + ret = device_create_file(dev, &dev_attr_issp_data); + if (ret) + dev_err(dev, "ISSP sysfs node create failed\n"); + + ret = device_create_file(dev, &dev_attr_issp_clk); + if (ret) + dev_err(dev, "ISSP sysfs node create failed\n"); + g_issp_wake_lock = devm_kzalloc(dev, sizeof(struct wake_lock), GFP_KERNEL); if (!g_issp_wake_lock) -- cgit v1.2.3