summaryrefslogtreecommitdiff
path: root/drivers/gpio/qpnp-pin.c
diff options
context:
space:
mode:
authorAnirudh Ghayal <aghayal@codeaurora.org>2016-01-24 16:33:59 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:19:17 -0700
commit808f8a8d082afaf5395672bc815e00201a31d75f (patch)
tree157b8ea8be63f7b7c1e34bc5a48a399a02939810 /drivers/gpio/qpnp-pin.c
parent33193859886dd8721260eea1cded995260a26c99 (diff)
gpio: qpnp-pin: Fix compilation error on enabling the debug option
Fix the incorrect mask/shift values specified for 'dtest-sel' debugfs entry. Also, add a special handling to enable/disable dtest-sel via debugfs. echo 0 > /d/qpnp_pin/pm8xxx_gpio/dtest-sel to disable DTEST echo 1...4 > /d/qpnp_pin/pm8xxx_gpio/dtest-sel to enable and select DTEST CRs-Fixed: 970023 Change-Id: I51e9af5d71bbf8b9b9023f6f3d747550e0fab0fa Signed-off-by: Anirudh Ghayal <aghayal@codeaurora.org>
Diffstat (limited to 'drivers/gpio/qpnp-pin.c')
-rw-r--r--drivers/gpio/qpnp-pin.c33
1 files changed, 29 insertions, 4 deletions
diff --git a/drivers/gpio/qpnp-pin.c b/drivers/gpio/qpnp-pin.c
index eeda1dd6f590..322e71d5ce6d 100644
--- a/drivers/gpio/qpnp-pin.c
+++ b/drivers/gpio/qpnp-pin.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -415,7 +415,7 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx,
return -EINVAL;
break;
case Q_PIN_CFG_DTEST_SEL:
- if (!val && val > QPNP_PIN_DTEST_SEL_INVALID)
+ if (val > QPNP_PIN_DTEST_SEL_INVALID)
return -EINVAL;
break;
default:
@@ -1243,8 +1243,8 @@ static int qpnp_pin_reg_attr(enum qpnp_pin_param_type type,
break;
case Q_PIN_CFG_DTEST_SEL:
if (is_gpio_lv_mv(q_spec)) {
- cfg->shift = Q_REG_LV_MV_DTEST_SEL_SHIFT;
- cfg->mask = Q_REG_LV_MV_DTEST_SEL_MASK;
+ cfg->shift = Q_REG_LV_MV_DTEST_SEL_CFG_SHIFT;
+ cfg->mask = Q_REG_LV_MV_DTEST_SEL_CFG_MASK;
} else {
cfg->shift = Q_REG_DTEST_SEL_SHIFT;
cfg->mask = Q_REG_DTEST_SEL_MASK;
@@ -1287,6 +1287,23 @@ static int qpnp_pin_debugfs_set(void *data, u64 val)
q_spec = container_of(idx, struct qpnp_pin_spec, params[*idx]);
q_chip = q_spec->q_chip;
+ /*
+ * special handling for GPIO_LV/MV 'dtest-sel'
+ * if (dtest_sel == 0) then disable dtest-sel
+ * else enable and set dtest.
+ */
+ if ((q_spec->subtype == Q_GPIO_SUBTYPE_GPIO_LV ||
+ q_spec->subtype == Q_GPIO_SUBTYPE_GPIO_MV) &&
+ *idx == Q_PIN_CFG_DTEST_SEL) {
+ /* enable/disable DTEST */
+ cfg.shift = Q_REG_LV_MV_DTEST_SEL_EN_SHIFT;
+ cfg.mask = Q_REG_LV_MV_DTEST_SEL_EN_MASK;
+ cfg.addr = Q_REG_DIG_IN_CTL;
+ cfg.idx = Q_REG_I_DIG_IN_CTL;
+ q_reg_clr_set(&q_spec->regs[cfg.idx],
+ cfg.shift, cfg.mask, !!val);
+ }
+
rc = qpnp_pin_check_config(*idx, q_spec, val);
if (rc)
return rc;
@@ -1294,6 +1311,14 @@ static int qpnp_pin_debugfs_set(void *data, u64 val)
rc = qpnp_pin_reg_attr(*idx, &cfg, q_spec);
if (rc)
return rc;
+
+ if (*idx == Q_PIN_CFG_DTEST_SEL && val) {
+ if (is_gpio_lv_mv(q_spec))
+ val -= 1;
+ else
+ val = BIT(val - 1);
+ }
+
q_reg_clr_set(&q_spec->regs[cfg.idx], cfg.shift, cfg.mask, val);
rc = regmap_write(q_chip->regmap, Q_REG_ADDR(q_spec, cfg.addr),
*&q_spec->regs[cfg.idx]);