summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJun Yan <juyan@nvidia.com>2013-08-08 15:19:19 -0700
committerRiham Haidar <rhaidar@nvidia.com>2013-09-30 18:46:17 -0700
commit2760fab4d93c12b30a249f192fe2ad984a0d5a07 (patch)
treeaf76239c62db7e5bcf05f84d651d6865647375f5
parent4d6dfc14d9d18c393e0cae2098deedc39f98129b (diff)
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 <juyan@nvidia.com> Reviewed-on: http://git-master/r/259787 Reviewed-by: Anshul Jain (SW) <anshulj@nvidia.com> Tested-by: Anshul Jain (SW) <anshulj@nvidia.com> Reviewed-on: http://git-master/r/279099 Reviewed-by: Automatic_Commit_Validation_User
-rw-r--r--drivers/misc/issp/issp.c87
1 files changed, 87 insertions, 0 deletions
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)