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:
parent
f090e5b7cc
commit
f0629e4f28
2 changed files with 41 additions and 1 deletions
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue