blob: 014ffbed71ceb54ca8370ae99c64c5d6d0776ddb [file] [log] [blame]
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: should be one of the following.
- "qcom,msm-tlmm-v3": for MSM with TLMM version 3.
- "qcom,msm-tlmm-v4": for MSM with TLMM version 4.
- 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. Each
pin type node must contain following properties:
Required Properties
- qcom,pin-type-*: identifies the pin type. Pin types supported are
qcom,pin-type-gp: General purpose
qcom,pin-type-sdc: SDC
- #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 feature version.
- "qcom,msm-tlmmv3-gp-intc": TLMM V3 interrupt chip.
- "qcom,msm-tlmmv4-gp-intc": TLMM V4 interrupt chip.
- 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.
For TLMMv3, 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-v3";
reg = <0xfd5110000 0x4000>;
/* General purpose pin type */
gp: gp {
qcom,pin-type-gp;
qcom,num-pins = <117>;
#qcom,pin-cells = <1>;
/* Supports Gpio controller */
msm_gpio: msm_gpio {
#gpio-controller;
#gpio-cells = <2>;
compatible = "msm_tlmm_v3_gpio";
#interrupt-controller;
#interrupt-cells <2>;
num_irqs = <117>;
apps_id = <4>;
};
};
/* Sdc pin type */
sdc: sdc {
qcom,pin-type-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>;
};