pinctrl: qcom: spmi-mpp: Add dtest route for digital input

Currently, the driver selects dtest rail specified in "qcom,dtest"
property as the output source in digital output mode. Add another
property "qcom,dtest-buffer" to specify which dtest rail to feed
when the pin is configured as a digital input.

Change-Id: I9e1ae5a64d633c7cdc6a1eb710932ca19ef5fe85
Signed-off-by: Fenglin Wu <fenglinw@codeaurora.org>
This commit is contained in:
Fenglin Wu 2016-07-19 17:03:42 +08:00
parent f090e5b7cc
commit f0629e4f28
2 changed files with 41 additions and 1 deletions

View file

@ -142,7 +142,7 @@ to specify in a pin configuration subnode:
- qcom,dtest: - qcom,dtest:
Usage: optional Usage: optional
Value type: <u32> Value type: <u32>
Definition: Selects which dtest rail to be routed in the various functions. Definition: Selects which dtest rail to be routed for digital output.
Valid values are 1-4 Valid values are 1-4
- qcom,amux-route: - qcom,amux-route:
@ -156,6 +156,16 @@ to specify in a pin configuration subnode:
Value type: <none> Value type: <none>
Definition: Indicates that the pin should be operating in paired mode. Definition: Indicates that the pin should be operating in paired mode.
- qcom,dtest-buffer:
Usage: optional
Value type: <u32>
Definition: Selects which dtest rail to be routed for digital input.
It's also valid when the pin is configured as digital
input and output.
4 dtest rails supported in total and more than one rail
could be selected simultaneously. Each bit of the 4 LSBs
represent one dtest rail, such as [3:0] = 0101 means both
dtest1 and dtest3 are selected. Valid values are 1-15.
Example: Example:
mpps@a000 { mpps@a000 {

View file

@ -111,6 +111,7 @@
#define PMIC_MPP_CONF_ANALOG_LEVEL (PIN_CONFIG_END + 2) #define PMIC_MPP_CONF_ANALOG_LEVEL (PIN_CONFIG_END + 2)
#define PMIC_MPP_CONF_DTEST_SELECTOR (PIN_CONFIG_END + 3) #define PMIC_MPP_CONF_DTEST_SELECTOR (PIN_CONFIG_END + 3)
#define PMIC_MPP_CONF_PAIRED (PIN_CONFIG_END + 4) #define PMIC_MPP_CONF_PAIRED (PIN_CONFIG_END + 4)
#define PMIC_MPP_CONF_DTEST_BUFFER (PIN_CONFIG_END + 5)
/** /**
* struct pmic_mpp_pad - keep current MPP settings * struct pmic_mpp_pad - keep current MPP settings
@ -129,6 +130,7 @@
* @function: See pmic_mpp_functions[]. * @function: See pmic_mpp_functions[].
* @drive_strength: Amount of current in sink mode * @drive_strength: Amount of current in sink mode
* @dtest: DTEST route selector * @dtest: DTEST route selector
* @dtest_buffer: the DTEST buffer selection for digital input mode
*/ */
struct pmic_mpp_pad { struct pmic_mpp_pad {
u16 base; u16 base;
@ -146,6 +148,7 @@ struct pmic_mpp_pad {
unsigned int function; unsigned int function;
unsigned int drive_strength; unsigned int drive_strength;
unsigned int dtest; unsigned int dtest;
unsigned int dtest_buffer;
}; };
struct pmic_mpp_state { struct pmic_mpp_state {
@ -160,6 +163,7 @@ static const struct pinconf_generic_params pmic_mpp_bindings[] = {
{"qcom,analog-level", PMIC_MPP_CONF_ANALOG_LEVEL, 0}, {"qcom,analog-level", PMIC_MPP_CONF_ANALOG_LEVEL, 0},
{"qcom,dtest", PMIC_MPP_CONF_DTEST_SELECTOR, 0}, {"qcom,dtest", PMIC_MPP_CONF_DTEST_SELECTOR, 0},
{"qcom,paired", PMIC_MPP_CONF_PAIRED, 0}, {"qcom,paired", PMIC_MPP_CONF_PAIRED, 0},
{"qcom,dtest-buffer", PMIC_MPP_CONF_DTEST_BUFFER, 0},
}; };
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
@ -168,6 +172,7 @@ static const struct pin_config_item pmic_conf_items[] = {
PCONFDUMP(PMIC_MPP_CONF_ANALOG_LEVEL, "analog level", NULL, true), PCONFDUMP(PMIC_MPP_CONF_ANALOG_LEVEL, "analog level", NULL, true),
PCONFDUMP(PMIC_MPP_CONF_DTEST_SELECTOR, "dtest", NULL, true), PCONFDUMP(PMIC_MPP_CONF_DTEST_SELECTOR, "dtest", NULL, true),
PCONFDUMP(PMIC_MPP_CONF_PAIRED, "paired", NULL, false), PCONFDUMP(PMIC_MPP_CONF_PAIRED, "paired", NULL, false),
PCONFDUMP(PMIC_MPP_CONF_DTEST_BUFFER, "dtest buffer", NULL, true),
}; };
#endif #endif
@ -397,6 +402,9 @@ static int pmic_mpp_config_get(struct pinctrl_dev *pctldev,
case PMIC_MPP_CONF_ANALOG_LEVEL: case PMIC_MPP_CONF_ANALOG_LEVEL:
arg = pad->aout_level; arg = pad->aout_level;
break; break;
case PMIC_MPP_CONF_DTEST_BUFFER:
arg = pad->dtest_buffer;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
@ -475,6 +483,15 @@ static int pmic_mpp_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
case PMIC_MPP_CONF_PAIRED: case PMIC_MPP_CONF_PAIRED:
pad->paired = !!arg; pad->paired = !!arg;
break; break;
case PMIC_MPP_CONF_DTEST_BUFFER:
/*
* 0xf is the max value which selects
* 4 dtest rails simultaneously
*/
if (arg > 0xf)
return -EINVAL;
pad->dtest_buffer = arg;
break;
default: default:
return -EINVAL; return -EINVAL;
} }
@ -486,6 +503,11 @@ static int pmic_mpp_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
if (ret < 0) if (ret < 0)
return ret; return ret;
val = pad->dtest_buffer;
ret = pmic_mpp_write(state, pad, PMIC_MPP_REG_DIG_IN_CTL, val);
if (ret < 0)
return ret;
val = pad->pullup << PMIC_MPP_REG_PULL_SHIFT; val = pad->pullup << PMIC_MPP_REG_PULL_SHIFT;
ret = pmic_mpp_write(state, pad, PMIC_MPP_REG_DIG_PULL_CTL, val); ret = pmic_mpp_write(state, pad, PMIC_MPP_REG_DIG_PULL_CTL, val);
@ -559,6 +581,8 @@ static void pmic_mpp_config_dbg_show(struct pinctrl_dev *pctldev,
seq_printf(s, " dtest%d", pad->dtest); seq_printf(s, " dtest%d", pad->dtest);
if (pad->paired) if (pad->paired)
seq_puts(s, " paired"); seq_puts(s, " paired");
if (pad->dtest_buffer)
seq_printf(s, " dtest buffer %d", pad->dtest_buffer);
} }
} }
@ -767,6 +791,12 @@ static int pmic_mpp_populate(struct pmic_mpp_state *state,
pad->power_source = val >> PMIC_MPP_REG_VIN_SHIFT; pad->power_source = val >> PMIC_MPP_REG_VIN_SHIFT;
pad->power_source &= PMIC_MPP_REG_VIN_MASK; pad->power_source &= PMIC_MPP_REG_VIN_MASK;
val = pmic_mpp_read(state, pad, PMIC_MPP_REG_DIG_IN_CTL);
if (val < 0)
return val;
pad->dtest_buffer = val;
val = pmic_mpp_read(state, pad, PMIC_MPP_REG_DIG_PULL_CTL); val = pmic_mpp_read(state, pad, PMIC_MPP_REG_DIG_PULL_CTL);
if (val < 0) if (val < 0)
return val; return val;