368 lines
11 KiB
Plaintext
368 lines
11 KiB
Plaintext
|
MSM TLMM pinmux controller
|
||
|
|
||
|
Qualcomm MSM integrates a GPIO and Pin mux/config hardware, (TOP Level Mode
|
||
|
Multiplexer in short TLMM). It controls the input/output settings on the
|
||
|
available pads/pins and also provides ability to multiplex and configure the
|
||
|
output of various on-chip controllers onto these pads. The pins are also of
|
||
|
different types, encapsulating different functions and having differing register
|
||
|
semantics.
|
||
|
|
||
|
Required Properties:
|
||
|
- compatible: identifies TLMM hardware version. should be one of the following
|
||
|
"qcom,msm-tlmm-8916"
|
||
|
"qcom,msm-tlmm-8226"
|
||
|
"qcom,msm-tlmm-8974"
|
||
|
"qcom,msm-tlmm-mdm9640"
|
||
|
"qcom,msm-tlmm-vpipa"
|
||
|
- reg: Base address of the pin controller hardware module and length of
|
||
|
the address space it occupies.
|
||
|
|
||
|
- Pin types as child nodes: Pin types supported by a particular controller
|
||
|
instance are represented as child nodes of the
|
||
|
controller node. This is optional.
|
||
|
|
||
|
Each pin type nodes' name must be unique and one of followings. Also each pin
|
||
|
type nodes can be present only when the specific pin type is supported by
|
||
|
SoC's TLMM :
|
||
|
- gp : General purpose pins
|
||
|
- sdc : SDC pins
|
||
|
- qdsc : QDSC pins
|
||
|
|
||
|
Each pin type node must contain following properties:
|
||
|
|
||
|
Required Properties
|
||
|
- #qcom,pin-cells: number of cells in the pin type specifier.
|
||
|
- qcom,num-pins: number of pins of given type present on the MSM.
|
||
|
Optional: A pintype may support gpio operations. In that case, a pintype
|
||
|
node can have an additional child node representing a gpio controller.
|
||
|
Additionally the pintype may also support using pins as interrupt triggers.
|
||
|
In this case we augment the gpio controller node with interrupt controller
|
||
|
attributes. The interrupt controller node, if present, needs to specify the
|
||
|
number of pins that can be used as interrupts as well as the id of the
|
||
|
processor core to which they need to be routed. Generally the apps id is
|
||
|
fixed for a given TLMM block in all SOCs that use that TLMM block.
|
||
|
However in some SOCs, the processor id can change. Override the default
|
||
|
value in that case.
|
||
|
- gpio-controller: Can be used as a gpio controller
|
||
|
- #gpio-cells: Should be two. The first cell is the pin number and the
|
||
|
second cell is used to specify optional parameters
|
||
|
- interrupt-controller: Can be used as an interrupt controller
|
||
|
- compatible: identifies the interrupt controller.
|
||
|
- This should be "qcom,msm-tlmm-gp".
|
||
|
- num_irqs: number of pins that can be used as an interrupt source.
|
||
|
- apps_id: if present, override the default core id for given TLMM block.
|
||
|
- #interrupt-cells: Should be two. The first cell is the pin number used as
|
||
|
irq and the second cell is used to specify optional
|
||
|
flags
|
||
|
|
||
|
- Pin groups as child nodes: The pin mux (selecting pin function
|
||
|
mode) and pin config (pull up/down, driver strength, direction) settings are
|
||
|
represented as child nodes of the pin-controller node. There is no limit on
|
||
|
the count of these child nodes.
|
||
|
|
||
|
Required Properties
|
||
|
-qcom,pins: phandle specifying pin type and a pin number.
|
||
|
-qcom,num-grp-pins: number of pins in the group.
|
||
|
-label: name to identify the pin group to be used by a client.
|
||
|
|
||
|
Optional Properties
|
||
|
-qcom,pin-func: function setting for the pin group.
|
||
|
|
||
|
The child node should contain a list of pin(s) on which a particular pin
|
||
|
function selection or pin configuration (or both) have to applied. This
|
||
|
list of pins is specified using the property name "qcom,pins". There
|
||
|
should be atleast one pin specified for this property and there is no upper
|
||
|
limit on the count of pins that can be specified. The pins are specified
|
||
|
using the pintype phandle and the pin number within that pintype.
|
||
|
|
||
|
The pin function selection that should be applied on the pins listed in the
|
||
|
child node is specified using the "qcom,pin-func" property. The value
|
||
|
of this property that should be applied to each of the pins listed in the
|
||
|
"qcom,pins" property, should be picked from the hardware manual of the SoC.
|
||
|
This property is optional in the child node if no specific function
|
||
|
selection is desired for the pins listed in the child node or if the pin is
|
||
|
to be used for bit banging.
|
||
|
|
||
|
The pin group node must additionally have a pin configuration node as its own
|
||
|
child node. There can be more then one such configuration node for a pin group
|
||
|
node. There can be one or more configurations within the configuration
|
||
|
node. These configurations are applied to all pins mentioned above using the
|
||
|
"qcom,pins" property. These configurations are specific to the pintype of the
|
||
|
pins.
|
||
|
|
||
|
For the pin configuration properties supported by both pin types lookup
|
||
|
Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
|
||
|
|
||
|
The values specified by these config properties should be derived from the
|
||
|
hardware manual and these values are programmed as-is into the pin config
|
||
|
register of the pin-controller.
|
||
|
|
||
|
NOTE: A pin group node should be formed for all pins that are going to have
|
||
|
the same function and configuration settings. If a subset of pins to be used
|
||
|
by a client require different function or configuration settings or both
|
||
|
then they should be modelled as a separate pin group node to be used by
|
||
|
the client.
|
||
|
|
||
|
The client nodes that require a particular pin function selection and/or
|
||
|
pin configuration should use the bindings listed in the "pinctrl-bindings txt"
|
||
|
file.
|
||
|
|
||
|
In case of SDC pintype, we model it as containing 6 pins. 3 each for SDC1 and
|
||
|
SDC2. Pins 0-2 corresponds to clock, data and command lines of
|
||
|
SDC1 and Pins 3-5 correspond to clock, data and command lines of SDC2.
|
||
|
|
||
|
Example 1: A pin-controller node with pin types
|
||
|
|
||
|
pinctrl@fd5110000 {
|
||
|
compatible = "qcom,msm-tlmm-8974";
|
||
|
reg = <0xfd5110000 0x4000>;
|
||
|
|
||
|
/* General purpose pin type */
|
||
|
gp: gp {
|
||
|
qcom,num-pins = <117>;
|
||
|
#qcom,pin-cells = <1>;
|
||
|
/* Supports Gpio controller */
|
||
|
msm_gpio: msm_gpio {
|
||
|
gpio-controller;
|
||
|
#gpio-cells = <2>;
|
||
|
compatible = "qcom,msm-tlmm-gp";
|
||
|
interrupt-controller;
|
||
|
#interrupt-cells <2>;
|
||
|
num_irqs = <117>;
|
||
|
apps_id = <4>;
|
||
|
};
|
||
|
};
|
||
|
/* Sdc pin type */
|
||
|
sdc: sdc {
|
||
|
qcom,num-pins = <6>;
|
||
|
#qcom,pin-cells = <1>;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
Example 2: Spi pin entries within the pincontroller node
|
||
|
pinctrl@fd511000 {
|
||
|
....
|
||
|
..
|
||
|
pmx-spi-bus {
|
||
|
/*
|
||
|
* MOSI, MISO and CLK lines
|
||
|
* all sharing same function and config
|
||
|
* settings for each configuration node.
|
||
|
*/
|
||
|
qcom,pins = <&gp 0>, <&gp 1>, <&gp 3>;
|
||
|
qcom,num-grp-pins = <3>;
|
||
|
qcom,pin-func = <1>;
|
||
|
label = "spi-bus";
|
||
|
|
||
|
/* Active configuration of bus pins */
|
||
|
spi-bus-active: spi-bus-active {
|
||
|
/*
|
||
|
* Property names as specified in
|
||
|
* pinctrl-bindings.txt
|
||
|
*/
|
||
|
drive-strength = <8>; /* 8 MA */
|
||
|
bias-disable; /* No PULL */
|
||
|
};
|
||
|
/* Sleep configuration of bus pins */
|
||
|
spi-bus-sleep: spi-bus-sleep {
|
||
|
/*
|
||
|
* Property values as specified in HW
|
||
|
* manual.
|
||
|
*/
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
bias-disable;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
pmx-spi-cs {
|
||
|
/*
|
||
|
* Chip select for SPI
|
||
|
* different config
|
||
|
* settings as compared to bus pins.
|
||
|
*/
|
||
|
qcom,pins = <&gp 2>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
qcom,pin-func = <1>;
|
||
|
label = "spi-cs"
|
||
|
|
||
|
/* Active configuration of cs pin */
|
||
|
spi-cs-active: spi-cs-active {
|
||
|
/*
|
||
|
* Property names as specified in
|
||
|
* pinctrl-bindings.txt
|
||
|
*/
|
||
|
drive-strength = <4>; /* 4 MA */
|
||
|
bias-disable; /* No PULL */
|
||
|
};
|
||
|
/* Sleep configuration of cs pin */
|
||
|
spi-cs-sleep: spi-cs-sleep {
|
||
|
/*
|
||
|
* Property values as specified in HW
|
||
|
* manual.
|
||
|
*/
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
bias-disable = <0>; /* No PULL */
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
Example 3: Same pin group with different pin function settings modelled as
|
||
|
separate nodes
|
||
|
pinctrl@fd511000 {
|
||
|
...
|
||
|
..
|
||
|
pmx-wcnss-5wire-active {
|
||
|
qcom,pins = <&gp 40>, <&gp 41>, <&gp 42>, <&gp 43>.
|
||
|
<&gp 44>;
|
||
|
qcom,pin-func = <1>;
|
||
|
qcom,num-grp-pins = <5>;
|
||
|
label = "wcnss-5wire-active";
|
||
|
wcnss-5wire-active: wcnss-active {
|
||
|
drive-strength = <6>; / * 6MA */
|
||
|
bias-pull-up;
|
||
|
};
|
||
|
};
|
||
|
pmx-wcnss-5wire-suspend {
|
||
|
qcom,pins = <&gp 40>, <&gp 41>, <&gp 42>, <&gp 43>.
|
||
|
<&gp 44>;
|
||
|
qcom,pin-func = <0>;
|
||
|
qcom,num-grp-pins = <5>;
|
||
|
label = "wcnss-5wire-suspend";
|
||
|
wcnss-5wire-sleep: wcnss-sleep {
|
||
|
drive-strength = <6>; / * 6MA */
|
||
|
bias-pull-down;
|
||
|
};
|
||
|
};
|
||
|
};
|
||
|
|
||
|
Example 4: SDC pins
|
||
|
|
||
|
pinctrl@0xfd511000 {
|
||
|
...
|
||
|
..
|
||
|
pmx-sdc1_clk {
|
||
|
qcom,pins = <&sdc 0>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
label = "sdc1-clk";
|
||
|
sdc1_clk_on: clk_on {
|
||
|
bias-disable; /* NO pull */
|
||
|
drive-strength = <12>; /* 12 MA */
|
||
|
};
|
||
|
sdc1_clk_off: clk_off {
|
||
|
bias-disable; /* NO pull */
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
};
|
||
|
};
|
||
|
pmx-sdc1_cmd {
|
||
|
qcom,pins = <&sdc 1>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
label = "sdc1-cmd";
|
||
|
sdc1_cmd_on: clk_on {
|
||
|
bias-disable; /* NO pull */
|
||
|
drive-strength = <12>; /* 12 MA */
|
||
|
};
|
||
|
sdc1_cmd_off: cmd_off {
|
||
|
bias-pull-up = <0x3>; /* pull up */
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
};
|
||
|
};
|
||
|
pmx-sdc1_data {
|
||
|
qcom,pins = <&sdc 2>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
label = "sdc1-data";
|
||
|
sdc1_data_on: data_on {
|
||
|
bias-pull-up; /* NO pull */
|
||
|
drive-strength = <12>; /* 12 MA */
|
||
|
};
|
||
|
sdc1_data_off: data_off {
|
||
|
bias-pull-up; /* pull up */
|
||
|
drive-strength = <0>; /* 2 MA */
|
||
|
};
|
||
|
};
|
||
|
pmx-sdc2_clk {
|
||
|
qcom,pins = <&sdc 3>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
label = "sdc2-clk";
|
||
|
sdc2_clk_on: clk_on {
|
||
|
bias-disable; /* NO pull */
|
||
|
drive-strength = <12>; /* 12 MA */
|
||
|
};
|
||
|
sdc2_clk_off: clk_off {
|
||
|
bias-disable; /* NO pull */
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
};
|
||
|
};
|
||
|
pmx-sdc2_cmd {
|
||
|
qcom,pins = <&sdc 4>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
label = "sdc2-cmd";
|
||
|
sdc2_cmd_on: cmd_on {
|
||
|
bias-disable; /* NO pull */
|
||
|
drive-strength = <12>; /* 12 MA */
|
||
|
};
|
||
|
sdc2_cmd_off: cmd_off {
|
||
|
bias-pull-up; /* pull up */
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
};
|
||
|
};
|
||
|
pmx-sdc2_data {
|
||
|
qcom,pins = <&sdc 5>;
|
||
|
qcom,num-grp-pins = <1>;
|
||
|
label = "sdc2-data";
|
||
|
sdc2_data_on: data_on {
|
||
|
bias-pull-up; /* NO pull */
|
||
|
drive-strength = <12>; /* 12 MA */
|
||
|
};
|
||
|
sdc2_data_off: data_off {
|
||
|
bias-pull-up; /* pull up */
|
||
|
drive-strength = <2>; /* 2 MA */
|
||
|
};
|
||
|
};
|
||
|
|
||
|
Example 5: A SPI client node that supports 'active' and 'sleep' states.
|
||
|
|
||
|
spi_0: spi@f9923000 { /* BLSP1 QUP1 */
|
||
|
.....
|
||
|
...
|
||
|
/* pins used by spi controllers */
|
||
|
pinctrl-names = "default", "sleep";
|
||
|
pinctrl-0 = <&spi-bus-active &spi-cs-active>;
|
||
|
pinctrl-1 = <&spi-bus-sleep &spi-cs-sleep>;
|
||
|
...
|
||
|
..
|
||
|
};
|
||
|
|
||
|
Example 6: A wcnss node with active and sleep states
|
||
|
|
||
|
qcom,wcnss-wlan@fb000000 {
|
||
|
....
|
||
|
..
|
||
|
/* pins used by wlan controllers */
|
||
|
pinctrl-names = "default", "sleep";
|
||
|
pinctrl-0 = <&wcnss-5wire-active>;
|
||
|
pinctrl-1 = <&wcnss-5wire-sleep>;
|
||
|
...
|
||
|
};
|
||
|
|
||
|
Example 7: SDC1 and SDC2 nodes with on and off states.
|
||
|
|
||
|
&sdhc_1 {
|
||
|
....
|
||
|
..
|
||
|
/* pins used by SDCC1 */
|
||
|
pinctrl-names = "on", "off";
|
||
|
pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on>;
|
||
|
pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off>;
|
||
|
...
|
||
|
..
|
||
|
};
|
||
|
|
||
|
&sdhc_2 {
|
||
|
....
|
||
|
..
|
||
|
pinctrl-names = "on", "off";
|
||
|
pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on>;
|
||
|
pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>;
|
||
|
};
|
||
|
|