Commit 581dbc8b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'pinctrl-v4.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl

Pull pin control updates from Linus Walleij:
 "This is the bulk of pin control patches for the v4.5 series.

  Notably I have a patch to driver core from Stephen Boyd in the pull
  request, this has been ACKed by Greg so it should be OK.  The internal
  API needed some tweaking to allow modular Qualcomm pin controllers.

  There is a bit of development history in here but it should all add up
  nicely and has boiled in linux-next.  For example I merged in v4.4-rc5
  to get rid of some nasty merge conflicts.

  Summary:

   - New drivers:
      - PXA2xx pin controller support
      - Broadcom NSP pin controller support

   - New subdrivers:
      - Samsung EXYNOS5410 support
      - Qualcomm MSM8996 support
      - Qualcomm PM8994 support
      - Qualcomm PM8994 MPP support
      - Allwinner sunxi H3 support
      - Allwinner sunxi A80 support
      - Rockchip RK3228 support

   - Rename the Cygnus pinctrl driver to "iproc" as it is more generic
     than was originally thought.

   - A bunch of Lantiq/Xway updates especially from the OpenWRT people.

   - Several refactorings for the Super-H SH PFC pin controllers.
     Adding SCIF_CLK support.

   - Several fixes to the Atlas 7 driver.

   - Various fixes all over the place"

* tag 'pinctrl-v4.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (91 commits)
  pinctrl: mediatek: Modify pinctrl bindings for mt2701
  Revert "pinctrl: qcom: make PMIC drivers bool"
  pinctrl: qcom: Use platform_irq_count() instead of of_irq_count()
  driver-core: platform: Add platform_irq_count()
  pinctrl: lantiq: 2 pins have the wrong mux list
  pinctrl: qcom: make PMIC drivers bool
  pinctrl: nsp-gpio: forever loop in nsp_gpio_get_strength()
  pinctrl: mediatek: convert to arch_initcall
  pinctrl: bcm2835: Fix memory leak in error path
  pinctrl: mediatek: add missing of_node_put
  pinctrl: rockchip: add missing of_node_put
  pinctrl: sh-pfc: add missing of_node_put
  pinctrl: sirf: add missing of_node_put
  pinctrl-tegra: add missing of_node_put
  pinctrl: sunxi: Add A80 special pin controller
  pinctrl: bcm/cygnys/iproc: fixup rebase issue
  pinctrl: fixup problematic flag
  MAINTAINERS: Add co-maintainer for Renesas Pin Controllers
  pinctrl: sh-pfc: r8a7791: add EtherAVB pin groups
  pinctrl: sh-pfc: r8a7795: Add SATA support
  ...
parents fb591fbd 14da0a91
...@@ -17,7 +17,10 @@ Required properties: ...@@ -17,7 +17,10 @@ Required properties:
"allwinner,sun8i-a23-pinctrl" "allwinner,sun8i-a23-pinctrl"
"allwinner,sun8i-a23-r-pinctrl" "allwinner,sun8i-a23-r-pinctrl"
"allwinner,sun8i-a33-pinctrl" "allwinner,sun8i-a33-pinctrl"
"allwinner,sun9i-a80-pinctrl"
"allwinner,sun9i-a80-r-pinctrl"
"allwinner,sun8i-a83t-pinctrl" "allwinner,sun8i-a83t-pinctrl"
"allwinner,sun8i-h3-pinctrl"
- reg: Should contain the register physical address and length for the - reg: Should contain the register physical address and length for the
pin controller. pin controller.
......
Broadcom Cygnus GPIO/PINCONF Controller Broadcom iProc GPIO/PINCONF Controller
Required properties: Required properties:
...@@ -7,9 +7,12 @@ Required properties: ...@@ -7,9 +7,12 @@ Required properties:
"brcm,cygnus-crmu-gpio" or "brcm,iproc-gpio" "brcm,cygnus-crmu-gpio" or "brcm,iproc-gpio"
- reg: - reg:
Define the base and range of the I/O address space that contains the Cygnus Define the base and range of the I/O address space that contains SoC
GPIO/PINCONF controller registers GPIO/PINCONF controller registers
- ngpios:
Total number of in-use slots in GPIO controller
- #gpio-cells: - #gpio-cells:
Must be two. The first cell is the GPIO pin number (within the Must be two. The first cell is the GPIO pin number (within the
controller's pin space) and the second cell is used for the following: controller's pin space) and the second cell is used for the following:
...@@ -57,6 +60,7 @@ Example: ...@@ -57,6 +60,7 @@ Example:
compatible = "brcm,cygnus-ccm-gpio"; compatible = "brcm,cygnus-ccm-gpio";
reg = <0x1800a000 0x50>, reg = <0x1800a000 0x50>,
<0x0301d164 0x20>; <0x0301d164 0x20>;
ngpios = <24>;
#gpio-cells = <2>; #gpio-cells = <2>;
gpio-controller; gpio-controller;
interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 84 IRQ_TYPE_LEVEL_HIGH>;
...@@ -78,6 +82,7 @@ Example: ...@@ -78,6 +82,7 @@ Example:
gpio_asiu: gpio@180a5000 { gpio_asiu: gpio@180a5000 {
compatible = "brcm,cygnus-asiu-gpio"; compatible = "brcm,cygnus-asiu-gpio";
reg = <0x180a5000 0x668>; reg = <0x180a5000 0x668>;
ngpios = <146>;
#gpio-cells = <2>; #gpio-cells = <2>;
gpio-controller; gpio-controller;
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
......
Broadcom Northstar plus (NSP) GPIO/PINCONF Controller
Required properties:
- compatible:
Must be "brcm,nsp-gpio-a"
- reg:
Should contain the register physical address and length for each of
GPIO base, IO control registers
- #gpio-cells:
Must be two. The first cell is the GPIO pin number (within the
controller's pin space) and the second cell is used for the following:
bit[0]: polarity (0 for active high and 1 for active low)
- gpio-controller:
Specifies that the node is a GPIO controller
- ngpios:
Number of gpios supported (58x25 supports 32 and 58x23 supports 24)
Optional properties:
- interrupts:
Interrupt ID
- interrupt-controller:
Specifies that the node is an interrupt controller
- gpio-ranges:
Specifies the mapping between gpio controller and pin-controllers pins.
This requires 4 fields in cells defined as -
1. Phandle of pin-controller.
2. GPIO base pin offset.
3 Pin-control base pin offset.
4. number of gpio pins which are linearly mapped from pin base.
Supported generic PINCONF properties in child nodes:
- pins:
The list of pins (within the controller's own pin space) that properties
in the node apply to. Pin names are "gpio-<pin>"
- bias-disable:
Disable pin bias
- bias-pull-up:
Enable internal pull up resistor
- bias-pull-down:
Enable internal pull down resistor
- drive-strength:
Valid drive strength values include 2, 4, 6, 8, 10, 12, 14, 16 (mA)
Example:
gpioa: gpio@18000020 {
compatible = "brcm,nsp-gpio-a";
reg = <0x18000020 0x100>,
<0x1803f1c4 0x1c>;
#gpio-cells = <2>;
gpio-controller;
ngpios = <32>;
gpio-ranges = <&pinctrl 0 0 31>;
interrupt-controller;
interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
/* Hog a few default settings */
pinctrl-names = "default";
pinctrl-0 = <&led>;
led: led {
pins = "gpio-1";
bias-pull-up;
};
pwr: pwr {
gpio-hog;
gpios = <3 1>;
output-high;
};
};
Lantiq XWAY pinmux controller Lantiq XWAY pinmux controller
Required properties: Required properties:
- compatible: "lantiq,pinctrl-xway" or "lantiq,pinctrl-xr9" - compatible: "lantiq,pinctrl-xway", (DEPRECATED: Use "lantiq,pinctrl-danube")
"lantiq,pinctrl-xr9", (DEPRECATED: Use "lantiq,xrx100-pinctrl" or
"lantiq,xrx200-pinctrl")
"lantiq,pinctrl-ase", (DEPRECATED: Use "lantiq,ase-pinctrl")
"lantiq,<chip>-pinctrl", where <chip> is:
"ase" (XWAY AMAZON Family)
"danube" (XWAY DANUBE Family)
"xrx100" (XWAY xRX100 Family)
"xrx200" (XWAY xRX200 Family)
"xrx300" (XWAY xRX300 Family)
- reg: Should contain the physical address and length of the gpio/pinmux - reg: Should contain the physical address and length of the gpio/pinmux
register range register range
...@@ -36,19 +45,87 @@ Required subnode-properties: ...@@ -36,19 +45,87 @@ Required subnode-properties:
Valid values for group and function names: Valid values for group and function names:
XWAY: (DEPRECATED: Use DANUBE)
mux groups: mux groups:
exin0, exin1, exin2, jtag, ebu a23, ebu a24, ebu a25, ebu clk, ebu cs1, exin0, exin1, exin2, jtag, ebu a23, ebu a24, ebu a25, ebu clk, ebu cs1,
ebu wait, nand ale, nand cs1, nand cle, spi, spi_cs1, spi_cs2, spi_cs3, ebu wait, nand ale, nand cs1, nand cle, spi, spi_cs1, spi_cs2, spi_cs3,
spi_cs4, spi_cs5, spi_cs6, asc0, asc0 cts rts, stp, nmi , gpt1, gpt2, spi_cs4, spi_cs5, spi_cs6, asc0, asc0 cts rts, stp, nmi, gpt1, gpt2,
gpt3, clkout0, clkout1, clkout2, clkout3, gnt1, gnt2, gnt3, req1, req2, gpt3, clkout0, clkout1, clkout2, clkout3, gnt1, gnt2, gnt3, req1, req2,
req3 req3
additional mux groups (XR9 only): functions:
mdio, nand rdy, nand rd, exin3, exin4, gnt4, req4 spi, asc, cgu, jtag, exin, stp, gpt, nmi, pci, ebu
XR9: ( DEPRECATED: Use xRX100/xRX200)
mux groups:
exin0, exin1, exin2, exin3, exin4, jtag, ebu a23, ebu a24, ebu a25,
ebu clk, ebu cs1, ebu wait, nand ale, nand cs1, nand cle, nand rdy,
nand rd, spi, spi_cs1, spi_cs2, spi_cs3, spi_cs4, spi_cs5, spi_cs6,
asc0, asc0 cts rts, stp, nmi, gpt1, gpt2, gpt3, clkout0, clkout1,
clkout2, clkout3, gnt1, gnt2, gnt3, gnt4, req1, req2, req3, req4, mdio,
gphy0 led0, gphy0 led1, gphy0 led2, gphy1 led0, gphy1 led1, gphy1 led2
functions:
spi, asc, cgu, jtag, exin, stp, gpt, nmi, pci, ebu, mdio, gphy
AMAZON:
mux groups:
exin0, exin1, exin2, jtag, spi_di, spi_do, spi_clk, spi_cs1, spi_cs2,
spi_cs3, spi_cs4, spi_cs5, spi_cs6, asc, stp, gpt1, gpt2, gpt3, clkout0,
clkout1, clkout2, mdio, dfe led0, dfe led1, ephy led0, ephy led1, ephy led2
functions:
spi, asc, cgu, jtag, exin, stp, gpt, mdio, ephy, dfe
DANUBE:
mux groups:
exin0, exin1, exin2, jtag, ebu a23, ebu a24, ebu a25, ebu clk, ebu cs1,
ebu wait, nand ale, nand cs1, nand cle, spi_di, spi_do, spi_clk, spi_cs1,
spi_cs2, spi_cs3, spi_cs4, spi_cs5, spi_cs6, asc0, asc0 cts rts, stp, nmi,
gpt1, gpt2, gpt3, clkout0, clkout1, clkout2, clkout3, gnt1, gnt2, gnt3,
req1, req2, req3, dfe led0, dfe led1
functions: functions:
spi, asc, cgu, jtag, exin, stp, gpt, nmi, pci, ebu, mdio spi, asc, cgu, jtag, exin, stp, gpt, nmi, pci, ebu, dfe
xRX100:
mux groups:
exin0, exin1, exin2, exin3, exin4, ebu a23, ebu a24, ebu a25, ebu clk,
ebu cs1, ebu wait, nand ale, nand cs1, nand cle, nand rdy, nand rd,
spi_di, spi_do, spi_clk, spi_cs1, spi_cs2, spi_cs3, spi_cs4, spi_cs5,
spi_cs6, asc0, asc0 cts rts, stp, nmi, gpt1, gpt2, gpt3, clkout0, clkout1,
clkout2, clkout3, gnt1, gnt2, gnt3, gnt4, req1, req2, req3, req4, mdio,
dfe led0, dfe led1
functions:
spi, asc, cgu, exin, stp, gpt, nmi, pci, ebu, mdio, dfe
xRX200:
mux groups:
exin0, exin1, exin2, exin3, exin4, ebu a23, ebu a24, ebu a25, ebu clk,
ebu cs1, ebu wait, nand ale, nand cs1, nand cle, nand rdy, nand rd,
spi_di, spi_do, spi_clk, spi_cs1, spi_cs2, spi_cs3, spi_cs4, spi_cs5,
spi_cs6, usif uart_rx, usif uart_tx, usif uart_rts, usif uart_cts,
usif uart_dtr, usif uart_dsr, usif uart_dcd, usif uart_ri, usif spi_di,
usif spi_do, usif spi_clk, usif spi_cs0, usif spi_cs1, usif spi_cs2,
stp, nmi, gpt1, gpt2, gpt3, clkout0, clkout1, clkout2, clkout3, gnt1,
gnt2, gnt3, gnt4, req1, req2, req3, req4, mdio, dfe led0, dfe led1,
gphy0 led0, gphy0 led1, gphy0 led2, gphy1 led0, gphy1 led1, gphy1 led2
functions:
spi, usif, cgu, exin, stp, gpt, nmi, pci, ebu, mdio, dfe, gphy
xRX300:
mux groups:
exin0, exin1, exin2, exin4, nand ale, nand cs0, nand cs1, nand cle,
nand rdy, nand rd, nand_d0, nand_d1, nand_d2, nand_d3, nand_d4, nand_d5,
nand_d6, nand_d7, nand_d1, nand wr, nand wp, nand se, spi_di, spi_do,
spi_clk, spi_cs1, spi_cs4, spi_cs6, usif uart_rx, usif uart_tx,
usif spi_di, usif spi_do, usif spi_clk, usif spi_cs0, stp, clkout2,
mdio, dfe led0, dfe led1, ephy0 led0, ephy0 led1, ephy1 led0, ephy1 led1
functions:
spi, usif, cgu, exin, stp, ebu, mdio, dfe, ephy
Definition of pin configurations: Definition of pin configurations:
...@@ -62,15 +139,32 @@ Optional subnode-properties: ...@@ -62,15 +139,32 @@ Optional subnode-properties:
0: none, 1: down, 2: up. 0: none, 1: down, 2: up.
- lantiq,open-drain: Boolean, enables open-drain on the defined pin. - lantiq,open-drain: Boolean, enables open-drain on the defined pin.
Valid values for XWAY pin names: Valid values for XWAY pin names: (DEPRECATED: Use DANUBE)
Pinconf pins can be referenced via the names io0-io31. Pinconf pins can be referenced via the names io0-io31.
Valid values for XR9 pin names: Valid values for XR9 pin names: (DEPRECATED: Use xrX100/xRX200)
Pinconf pins can be referenced via the names io0-io55. Pinconf pins can be referenced via the names io0-io55.
Valid values for AMAZON pin names:
Pinconf pins can be referenced via the names io0-io31.
Valid values for DANUBE pin names:
Pinconf pins can be referenced via the names io0-io31.
Valid values for xRX100 pin names:
Pinconf pins can be referenced via the names io0-io55.
Valid values for xRX200 pin names:
Pinconf pins can be referenced via the names io0-io49.
Valid values for xRX300 pin names:
Pinconf pins can be referenced via the names io0-io1,io3-io6,io8-io11,
io13-io19,io23-io27,io34-io36,
io42-io43,io48-io61.
Example: Example:
gpio: pinmux@E100B10 { gpio: pinmux@E100B10 {
compatible = "lantiq,pinctrl-xway"; compatible = "lantiq,danube-pinctrl";
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&state_default>; pinctrl-0 = <&state_default>;
......
...@@ -4,10 +4,11 @@ The Mediatek's Pin controller is used to control SoC pins. ...@@ -4,10 +4,11 @@ The Mediatek's Pin controller is used to control SoC pins.
Required properties: Required properties:
- compatible: value should be one of the following. - compatible: value should be one of the following.
(a) "mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl. "mediatek,mt2701-pinctrl", compatible with mt2701 pinctrl.
(b) "mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl. "mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl.
(c) "mediatek,mt6397-pinctrl", compatible with mt6397 pinctrl. "mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl.
(d) "mediatek,mt8127-pinctrl", compatible with mt8127 pinctrl. "mediatek,mt8135-pinctrl", compatible with mt8135 pinctrl.
"mediatek,mt8173-pinctrl", compatible with mt8173 pinctrl.
- pins-are-numbered: Specify the subnodes are using numbered pinmux to - pins-are-numbered: Specify the subnodes are using numbered pinmux to
specify pins. specify pins.
- gpio-controller : Marks the device node as a gpio controller. - gpio-controller : Marks the device node as a gpio controller.
......
Qualcomm MSM8996 TLMM block
This binding describes the Top Level Mode Multiplexer block found in the
MSM8996 platform.
- compatible:
Usage: required
Value type: <string>
Definition: must be "qcom,msm8996-pinctrl"
- reg:
Usage: required
Value type: <prop-encoded-array>
Definition: the base address and size of the TLMM register space.
- interrupts:
Usage: required
Value type: <prop-encoded-array>
Definition: should specify the TLMM summary IRQ.
- interrupt-controller:
Usage: required
Value type: <none>
Definition: identifies this node as an interrupt controller
- #interrupt-cells:
Usage: required
Value type: <u32>
Definition: must be 2. Specifying the pin number and flags, as defined
in <dt-bindings/interrupt-controller/irq.h>
- gpio-controller:
Usage: required
Value type: <none>
Definition: identifies this node as a gpio controller
- #gpio-cells:
Usage: required
Value type: <u32>
Definition: must be 2. Specifying the pin number and flags, as defined
in <dt-bindings/gpio/gpio.h>
Please refer to ../gpio/gpio.txt and ../interrupt-controller/interrupts.txt for
a general description of GPIO and interrupt bindings.
Please refer to pinctrl-bindings.txt in this directory for details of the
common pinctrl bindings used by client devices, including the meaning of the
phrase "pin configuration node".
The pin configuration nodes act as a container for an arbitrary number of
subnodes. Each of these subnodes represents some desired configuration for a
pin, a group, or a list of pins or groups. This configuration can include the
mux function to select on those pin(s)/group(s), and various pin configuration
parameters, such as pull-up, drive strength, etc.
PIN CONFIGURATION NODES:
The name of each subnode is not important; all subnodes should be enumerated
and processed purely based on their content.
Each subnode only affects those parameters that are explicitly listed. In
other words, a subnode that lists a mux function but no pin configuration
parameters implies no information about any pin configuration parameters.
Similarly, a pin subnode that describes a pullup parameter implies no
information about e.g. the mux function.
The following generic properties as defined in pinctrl-bindings.txt are valid
to specify in a pin configuration subnode:
- pins:
Usage: required
Value type: <string-array>
Definition: List of gpio pins affected by the properties specified in
this subnode.
Valid pins are:
gpio0-gpio149
Supports mux, bias and drive-strength
sdc1_clk, sdc1_cmd, sdc1_data sdc2_clk, sdc2_cmd,
sdc2_data sdc1_rclk
Supports bias and drive-strength
- function:
Usage: required
Value type: <string>
Definition: Specify the alternative function to be configured for the
specified pins. Functions are only valid for gpio pins.
Valid values are:
blsp_uart1, blsp_spi1, blsp_i2c1, blsp_uim1, atest_tsens,
bimc_dte1, dac_calib0, blsp_spi8, blsp_uart8, blsp_uim8,
qdss_cti_trig_out_b, bimc_dte0, dac_calib1, qdss_cti_trig_in_b,
dac_calib2, atest_tsens2, atest_usb1, blsp_spi10, blsp_uart10,
blsp_uim10, atest_bbrx1, atest_usb13, atest_bbrx0, atest_usb12,
mdp_vsync, edp_lcd, blsp_i2c10, atest_gpsadc1, atest_usb11,
atest_gpsadc0, edp_hot, atest_usb10, m_voc, dac_gpio, atest_char,
cam_mclk, pll_bypassnl, qdss_stm7, blsp_i2c8, qdss_tracedata_b,
pll_reset, qdss_stm6, qdss_stm5, qdss_stm4, atest_usb2, cci_i2c,
qdss_stm3, dac_calib3, atest_usb23, atest_char3, dac_calib4,
qdss_stm2, atest_usb22, atest_char2, qdss_stm1, dac_calib5,
atest_usb21, atest_char1, dbg_out, qdss_stm0, dac_calib6,
atest_usb20, atest_char0, dac_calib10, qdss_stm10,
qdss_cti_trig_in_a, cci_timer4, blsp_spi6, blsp_uart6, blsp_uim6,
blsp2_spi, qdss_stm9, qdss_cti_trig_out_a, dac_calib11,
qdss_stm8, cci_timer0, qdss_stm13, dac_calib7, cci_timer1,
qdss_stm12, dac_calib8, cci_timer2, blsp1_spi, qdss_stm11,
dac_calib9, cci_timer3, cci_async, dac_calib12, blsp_i2c6,
qdss_tracectl_a, dac_calib13, qdss_traceclk_a, dac_calib14,
dac_calib15, hdmi_rcv, dac_calib16, hdmi_cec, pwr_modem,
dac_calib17, hdmi_ddc, pwr_nav, dac_calib18, pwr_crypto,
dac_calib19, hdmi_hot, dac_calib20, dac_calib21, pci_e0,
dac_calib22, dac_calib23, dac_calib24, tsif1_sync, dac_calib25,
sd_write, tsif1_error, blsp_spi2, blsp_uart2, blsp_uim2,
qdss_cti, blsp_i2c2, blsp_spi3, blsp_uart3, blsp_uim3, blsp_i2c3,
uim3, blsp_spi9, blsp_uart9, blsp_uim9, blsp10_spi, blsp_i2c9,
blsp_spi7, blsp_uart7, blsp_uim7, qdss_tracedata_a, blsp_i2c7,
qua_mi2s, gcc_gp1_clk_a, ssc_irq, uim4, blsp_spi11, blsp_uart11,
blsp_uim11, gcc_gp2_clk_a, gcc_gp3_clk_a, blsp_i2c11, cri_trng0,
cri_trng1, cri_trng, qdss_stm18, pri_mi2s, qdss_stm17, blsp_spi4,
blsp_uart4, blsp_uim4, qdss_stm16, qdss_stm15, blsp_i2c4,
qdss_stm14, dac_calib26, spkr_i2s, audio_ref, lpass_slimbus,
isense_dbg, tsense_pwm1, tsense_pwm2, btfm_slimbus, ter_mi2s,
qdss_stm22, qdss_stm21, qdss_stm20, qdss_stm19, gcc_gp1_clk_b,
sec_mi2s, blsp_spi5, blsp_uart5, blsp_uim5, gcc_gp2_clk_b,
gcc_gp3_clk_b, blsp_i2c5, blsp_spi12, blsp_uart12, blsp_uim12,
qdss_stm25, qdss_stm31, blsp_i2c12, qdss_stm30, qdss_stm29,
tsif1_clk, qdss_stm28, tsif1_en, tsif1_data, sdc4_cmd, qdss_stm27,
qdss_traceclk_b, tsif2_error, sdc43, vfr_1, qdss_stm26, tsif2_clk,
sdc4_clk, qdss_stm24, tsif2_en, sdc42, qdss_stm23, qdss_tracectl_b,
sd_card, tsif2_data, sdc41, tsif2_sync, sdc40, mdp_vsync_p_b,
ldo_en, mdp_vsync_s_b, ldo_update, blsp11_uart_tx_b, blsp11_uart_rx_b,
blsp11_i2c_sda_b, prng_rosc, blsp11_i2c_scl_b, uim2, uim1, uim_batt,
pci_e2, pa_indicator, adsp_ext, ddr_bist, qdss_tracedata_11,
qdss_tracedata_12, modem_tsync, nav_dr, nav_pps, pci_e1, gsm_tx,
qspi_cs, ssbi2, ssbi1, mss_lte, qspi_clk, qspi0, qspi1, qspi2, qspi3,
gpio
- bias-disable:
Usage: optional
Value type: <none>
Definition: The specified pins should be configued as no pull.
- bias-pull-down:
Usage: optional
Value type: <none>
Definition: The specified pins should be configued as pull down.
- bias-pull-up:
Usage: optional
Value type: <none>
Definition: The specified pins should be configued as pull up.
- output-high:
Usage: optional
Value type: <none>
Definition: The specified pins are configured in output mode, driven
high.
Not valid for sdc pins.
- output-low:
Usage: optional
Value type: <none>
Definition: The specified pins are configured in output mode, driven
low.
Not valid for sdc pins.
- drive-strength:
Usage: optional
Value type: <u32>
Definition: Selects the drive strength for the specified pins, in mA.
Valid values are: 2, 4, 6, 8, 10, 12, 14 and 16
Example:
tlmm: pinctrl@01010000 {
compatible = "qcom,msm8996-pinctrl";
reg = <0x01010000 0x300000>;
interrupts = <0 208 0>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
uart_console_active: uart_console_active {
mux {
pins = "gpio4", "gpio5";
function = "blsp_uart8";
};
config {
pins = "gpio4", "gpio5";
drive-strength = <2>;
bias-disable;
};
};
};
...@@ -14,6 +14,7 @@ PMIC's from Qualcomm. ...@@ -14,6 +14,7 @@ PMIC's from Qualcomm.
"qcom,pm8917-gpio" "qcom,pm8917-gpio"
"qcom,pm8921-gpio" "qcom,pm8921-gpio"
"qcom,pm8941-gpio" "qcom,pm8941-gpio"
"qcom,pm8994-gpio"
"qcom,pma8084-gpio" "qcom,pma8084-gpio"
- reg: - reg:
...@@ -79,6 +80,7 @@ to specify in a pin configuration subnode: ...@@ -79,6 +80,7 @@ to specify in a pin configuration subnode:
gpio1-gpio38 for pm8917 gpio1-gpio38 for pm8917
gpio1-gpio44 for pm8921 gpio1-gpio44 for pm8921
gpio1-gpio36 for pm8941 gpio1-gpio36 for pm8941
gpio1-gpio22 for pm8994
gpio1-gpio22 for pma8084 gpio1-gpio22 for pma8084
- function: - function:
......
...@@ -15,6 +15,7 @@ of PMIC's from Qualcomm. ...@@ -15,6 +15,7 @@ of PMIC's from Qualcomm.
"qcom,pm8917-mpp", "qcom,pm8917-mpp",
"qcom,pm8921-mpp", "qcom,pm8921-mpp",
"qcom,pm8941-mpp", "qcom,pm8941-mpp",
"qcom,pm8994-mpp",
"qcom,pma8084-mpp", "qcom,pma8084-mpp",
- reg: - reg:
......
...@@ -21,7 +21,8 @@ defined as gpio sub-nodes of the pinmux controller. ...@@ -21,7 +21,8 @@ defined as gpio sub-nodes of the pinmux controller.
Required properties for iomux controller: Required properties for iomux controller:
- compatible: one of "rockchip,rk2928-pinctrl", "rockchip,rk3066a-pinctrl" - compatible: one of "rockchip,rk2928-pinctrl", "rockchip,rk3066a-pinctrl"
"rockchip,rk3066b-pinctrl", "rockchip,rk3188-pinctrl" "rockchip,rk3066b-pinctrl", "rockchip,rk3188-pinctrl"
"rockchip,rk3288-pinctrl", "rockchip,rk3368-pinctrl" "rockchip,rk3228-pinctrl", "rockchip,rk3288-pinctrl"
"rockchip,rk3368-pinctrl"
- rockchip,grf: phandle referencing a syscon providing the - rockchip,grf: phandle referencing a syscon providing the
"general register files" "general register files"
......
...@@ -17,6 +17,7 @@ Required Properties: ...@@ -17,6 +17,7 @@ Required Properties:
- "samsung,exynos4x12-pinctrl": for Exynos4x12 compatible pin-controller. - "samsung,exynos4x12-pinctrl": for Exynos4x12 compatible pin-controller.
- "samsung,exynos5250-pinctrl": for Exynos5250 compatible pin-controller. - "samsung,exynos5250-pinctrl": for Exynos5250 compatible pin-controller.
- "samsung,exynos5260-pinctrl": for Exynos5260 compatible pin-controller. - "samsung,exynos5260-pinctrl": for Exynos5260 compatible pin-controller.
- "samsung,exynos5410-pinctrl": for Exynos5410 compatible pin-controller.
- "samsung,exynos5420-pinctrl": for Exynos5420 compatible pin-controller. - "samsung,exynos5420-pinctrl": for Exynos5420 compatible pin-controller.
- "samsung,exynos7-pinctrl": for Exynos7 compatible pin-controller. - "samsung,exynos7-pinctrl": for Exynos7 compatible pin-controller.
......
...@@ -8366,6 +8366,7 @@ F: drivers/pinctrl/intel/ ...@@ -8366,6 +8366,7 @@ F: drivers/pinctrl/intel/
PIN CONTROLLER - RENESAS PIN CONTROLLER - RENESAS
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com> M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
M: Geert Uytterhoeven <geert+renesas@glider.be>
L: linux-sh@vger.kernel.org L: linux-sh@vger.kernel.org
S: Maintained S: Maintained
F: drivers/pinctrl/sh-pfc/ F: drivers/pinctrl/sh-pfc/
...@@ -8636,6 +8637,7 @@ S: Maintained ...@@ -8636,6 +8637,7 @@ S: Maintained
F: arch/arm/mach-pxa/ F: arch/arm/mach-pxa/
F: drivers/dma/pxa* F: drivers/dma/pxa*
F: drivers/pcmcia/pxa2xx* F: drivers/pcmcia/pxa2xx*
F: drivers/pinctrl/pxa/
F: drivers/spi/spi-pxa2xx* F: drivers/spi/spi-pxa2xx*
F: drivers/usb/gadget/udc/pxa2* F: drivers/usb/gadget/udc/pxa2*
F: include/sound/pxa2xx-lib.h F: include/sound/pxa2xx-lib.h
......
...@@ -116,6 +116,26 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) ...@@ -116,6 +116,26 @@ int platform_get_irq(struct platform_device *dev, unsigned int num)
} }
EXPORT_SYMBOL_GPL(platform_get_irq); EXPORT_SYMBOL_GPL(platform_get_irq);
/**
* platform_irq_count - Count the number of IRQs a platform device uses
* @dev: platform device
*
* Return: Number of IRQs a platform device uses or EPROBE_DEFER
*/
int platform_irq_count(struct platform_device *dev)
{
int ret, nr = 0;
while ((ret = platform_get_irq(dev, nr)) >= 0)
nr++;
if (ret == -EPROBE_DEFER)
return ret;
return nr;
}
EXPORT_SYMBOL_GPL(platform_irq_count);
/** /**
* platform_get_resource_byname - get a resource for a device by name * platform_get_resource_byname - get a resource for a device by name
* @dev: platform device * @dev: platform device
......
...@@ -244,7 +244,7 @@ config PINCTRL_ZYNQ ...@@ -244,7 +244,7 @@ config PINCTRL_ZYNQ
select PINMUX select PINMUX
select GENERIC_PINCONF select GENERIC_PINCONF
help help
This selectes the pinctrl driver for Xilinx Zynq. This selects the pinctrl driver for Xilinx Zynq.
source "drivers/pinctrl/bcm/Kconfig" source "drivers/pinctrl/bcm/Kconfig"
source "drivers/pinctrl/berlin/Kconfig" source "drivers/pinctrl/berlin/Kconfig"
...@@ -252,6 +252,7 @@ source "drivers/pinctrl/freescale/Kconfig" ...@@ -252,6 +252,7 @@ source "drivers/pinctrl/freescale/Kconfig"
source "drivers/pinctrl/intel/Kconfig" source "drivers/pinctrl/intel/Kconfig"
source "drivers/pinctrl/mvebu/Kconfig" source "drivers/pinctrl/mvebu/Kconfig"
source "drivers/pinctrl/nomadik/Kconfig" source "drivers/pinctrl/nomadik/Kconfig"
source "drivers/pinctrl/pxa/Kconfig"
source "drivers/pinctrl/qcom/Kconfig" source "drivers/pinctrl/qcom/Kconfig"
source "drivers/pinctrl/samsung/Kconfig" source "drivers/pinctrl/samsung/Kconfig"
source "drivers/pinctrl/sh-pfc/Kconfig" source "drivers/pinctrl/sh-pfc/Kconfig"
......
...@@ -41,15 +41,16 @@ obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o ...@@ -41,15 +41,16 @@ obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o
obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o
obj-$(CONFIG_ARCH_BCM) += bcm/ obj-$(CONFIG_ARCH_BCM) += bcm/
obj-$(CONFIG_ARCH_BERLIN) += berlin/ obj-$(CONFIG_PINCTRL_BERLIN) += berlin/
obj-y += freescale/ obj-y += freescale/
obj-$(CONFIG_X86) += intel/ obj-$(CONFIG_X86) += intel/
obj-$(CONFIG_PLAT_ORION) += mvebu/ obj-$(CONFIG_PINCTRL_MVEBU) += mvebu/
obj-y += nomadik/ obj-y += nomadik/
obj-$(CONFIG_ARCH_PXA) += pxa/
obj-$(CONFIG_ARCH_QCOM) += qcom/ obj-$(CONFIG_ARCH_QCOM) += qcom/
obj-$(CONFIG_PINCTRL_SAMSUNG) += samsung/ obj-$(CONFIG_PINCTRL_SAMSUNG) += samsung/
obj-$(CONFIG_PINCTRL_SH_PFC) += sh-pfc/ obj-$(CONFIG_PINCTRL_SH_PFC) += sh-pfc/
obj-$(CONFIG_PLAT_SPEAR) += spear/ obj-$(CONFIG_PINCTRL_SPEAR) += spear/
obj-$(CONFIG_ARCH_SUNXI) += sunxi/ obj-$(CONFIG_ARCH_SUNXI) += sunxi/
obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/ obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
obj-$(CONFIG_ARCH_VT8500) += vt8500/ obj-$(CONFIG_ARCH_VT8500) += vt8500/
......
...@@ -9,6 +9,7 @@ config PINCTRL_BCM281XX ...@@ -9,6 +9,7 @@ config PINCTRL_BCM281XX
select PINCONF select PINCONF
select GENERIC_PINCONF select GENERIC_PINCONF
select REGMAP_MMIO select REGMAP_MMIO
default ARCH_BCM_MOBILE
help help
Say Y here to support Broadcom BCM281xx pinctrl driver, which is used Say Y here to support Broadcom BCM281xx pinctrl driver, which is used
for the BCM281xx SoC family, including BCM11130, BCM11140, BCM11351, for the BCM281xx SoC family, including BCM11130, BCM11140, BCM11351,
...@@ -20,27 +21,41 @@ config PINCTRL_BCM2835 ...@@ -20,27 +21,41 @@ config PINCTRL_BCM2835
select PINMUX select PINMUX
select PINCONF select PINCONF
config PINCTRL_CYGNUS_GPIO config PINCTRL_IPROC_GPIO
bool "Broadcom Cygnus GPIO (with PINCONF) driver" bool "Broadcom iProc GPIO (with PINCONF) driver"
depends on OF_GPIO && ARCH_BCM_CYGNUS depends on OF_GPIO && (ARCH_BCM_IPROC || COMPILE_TEST)
select GPIOLIB_IRQCHIP select GPIOLIB_IRQCHIP
select PINCONF select PINCONF
select GENERIC_PINCONF select GENERIC_PINCONF
default ARCH_BCM_CYGNUS default ARCH_BCM_IPROC
help help
Say yes here to enable the Broadcom Cygnus GPIO driver. Say yes here to enable the Broadcom iProc GPIO driver.
The Broadcom iProc based SoCs- Cygnus, NS2, NSP and Stingray, use
same GPIO Controller IP hence this driver could be used for all.
The Broadcom Cygnus SoC has 3 GPIO controllers including the ASIU The Broadcom Cygnus SoC has 3 GPIO controllers including the ASIU
GPIO controller (ASIU), the chipCommonG GPIO controller (CCM), and GPIO controller (ASIU), the chipCommonG GPIO controller (CCM), and
the always-ON GPIO controller (CRMU/AON). All 3 GPIO controllers are the always-ON GPIO controller (CRMU/AON). All 3 GPIO controllers are
supported by this driver. supported by this driver.
All 3 Cygnus GPIO controllers support basic PINCONF functions such The Broadcom NSP has two GPIO controllers including the ChipcommonA
GPIO, the ChipcommonB GPIO. Later controller is supported by this
driver.
The Broadcom NS2 has two GPIO controller including the CRMU GPIO,
the ChipcommonG GPIO. Both controllers are supported by this driver.
The Broadcom Stingray GPIO controllers are supported by this driver.
All above SoCs GPIO controllers support basic PINCONF functions such
as bias pull up, pull down, and drive strength configurations, when as bias pull up, pull down, and drive strength configurations, when
these pins are muxed to GPIO. these pins are muxed to GPIO.
Pins from the ASIU GPIO can be individually muxed to GPIO function, It provides the framework where pins from the individual GPIO can be
through interaction with the Cygnus IOMUX controller. individually muxed to GPIO function, through interaction with the
SoCs IOMUX controller. This features could be used only on SoCs which
support individual pin muxing.
config PINCTRL_CYGNUS_MUX config PINCTRL_CYGNUS_MUX
bool "Broadcom Cygnus IOMUX driver" bool "Broadcom Cygnus IOMUX driver"
...@@ -54,3 +69,20 @@ config PINCTRL_CYGNUS_MUX ...@@ -54,3 +69,20 @@ config PINCTRL_CYGNUS_MUX
The Broadcom Cygnus IOMUX driver supports group based IOMUX The Broadcom Cygnus IOMUX driver supports group based IOMUX
configuration, with the exception that certain individual pins configuration, with the exception that certain individual pins
can be overrided to GPIO function can be overrided to GPIO function
config PINCTRL_NSP_GPIO
bool "Broadcom NSP GPIO (with PINCONF) driver"
depends on OF_GPIO && (ARCH_BCM_NSP || COMPILE_TEST)
select GPIOLIB_IRQCHIP
select PINCONF
select GENERIC_PINCONF
default ARCH_BCM_NSP
help
Say yes here to enable the Broadcom NSP GPIO driver.
The Broadcom Northstar Plus SoC ChipcommonA GPIO controller is
supported by this driver.
The ChipcommonA GPIO controller support basic PINCONF functions such
as bias pull up, pull down, and drive strength configurations, when
these pins are muxed to GPIO.
...@@ -2,5 +2,6 @@ ...@@ -2,5 +2,6 @@
obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o
obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o
obj-$(CONFIG_PINCTRL_CYGNUS_GPIO) += pinctrl-cygnus-gpio.o obj-$(CONFIG_PINCTRL_IPROC_GPIO) += pinctrl-iproc-gpio.o
obj-$(CONFIG_PINCTRL_CYGNUS_MUX) += pinctrl-cygnus-mux.o obj-$(CONFIG_PINCTRL_CYGNUS_MUX) += pinctrl-cygnus-mux.o
obj-$(CONFIG_PINCTRL_NSP_GPIO) += pinctrl-nsp-gpio.o
...@@ -795,7 +795,7 @@ static int bcm2835_pctl_dt_node_to_map(struct pinctrl_dev *pctldev, ...@@ -795,7 +795,7 @@ static int bcm2835_pctl_dt_node_to_map(struct pinctrl_dev *pctldev,
return 0; return 0;
out: out:
kfree(maps); bcm2835_pctl_dt_free_map(pctldev, maps, num_pins * maps_per_pin);
return err; return err;
} }
......
This diff is collapsed.
obj-$(CONFIG_PINCTRL_BERLIN) += berlin.o obj-y += berlin.o
obj-$(CONFIG_PINCTRL_BERLIN_BG2) += berlin-bg2.o obj-$(CONFIG_PINCTRL_BERLIN_BG2) += berlin-bg2.o
obj-$(CONFIG_PINCTRL_BERLIN_BG2CD) += berlin-bg2cd.o obj-$(CONFIG_PINCTRL_BERLIN_BG2CD) += berlin-bg2cd.o
obj-$(CONFIG_PINCTRL_BERLIN_BG2Q) += berlin-bg2q.o obj-$(CONFIG_PINCTRL_BERLIN_BG2Q) += berlin-bg2q.o
......
...@@ -351,7 +351,7 @@ static int __init mtk_pinctrl_init(void) ...@@ -351,7 +351,7 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver); return platform_driver_register(&mtk_pinctrl_driver);
} }
module_init(mtk_pinctrl_init); arch_initcall(mtk_pinctrl_init);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("MediaTek MT8127 Pinctrl Driver"); MODULE_DESCRIPTION("MediaTek MT8127 Pinctrl Driver");
......
...@@ -366,7 +366,7 @@ static int __init mtk_pinctrl_init(void) ...@@ -366,7 +366,7 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver); return platform_driver_register(&mtk_pinctrl_driver);
} }
module_init(mtk_pinctrl_init); arch_initcall(mtk_pinctrl_init);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MediaTek Pinctrl Driver"); MODULE_DESCRIPTION("MediaTek Pinctrl Driver");
......
...@@ -394,7 +394,7 @@ static int __init mtk_pinctrl_init(void) ...@@ -394,7 +394,7 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver); return platform_driver_register(&mtk_pinctrl_driver);
} }
module_init(mtk_pinctrl_init); arch_initcall(mtk_pinctrl_init);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("MediaTek Pinctrl Driver"); MODULE_DESCRIPTION("MediaTek Pinctrl Driver");
......
...@@ -509,6 +509,9 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -509,6 +509,9 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
err = pinconf_generic_parse_dt_config(node, pctldev, &configs, err = pinconf_generic_parse_dt_config(node, pctldev, &configs,
&num_configs); &num_configs);
if (err)
return err;
if (num_configs) if (num_configs)
has_config = 1; has_config = 1;
...@@ -520,21 +523,23 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -520,21 +523,23 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
if (has_config && num_pins >= 1) if (has_config && num_pins >= 1)
maps_per_pin++; maps_per_pin++;
if (!num_pins || !maps_per_pin) if (!num_pins || !maps_per_pin) {
return -EINVAL; err = -EINVAL;
goto exit;
}
reserve = num_pins * maps_per_pin; reserve = num_pins * maps_per_pin;
err = pinctrl_utils_reserve_map(pctldev, map, err = pinctrl_utils_reserve_map(pctldev, map,
reserved_maps, num_maps, reserve); reserved_maps, num_maps, reserve);
if (err < 0) if (err < 0)
goto fail; goto exit;
for (i = 0; i < num_pins; i++) { for (i = 0; i < num_pins; i++) {
err = of_property_read_u32_index(node, "pinmux", err = of_property_read_u32_index(node, "pinmux",
i, &pinfunc); i, &pinfunc);
if (err) if (err)
goto fail; goto exit;
pin = MTK_GET_PIN_NO(pinfunc); pin = MTK_GET_PIN_NO(pinfunc);
func = MTK_GET_PIN_FUNC(pinfunc); func = MTK_GET_PIN_FUNC(pinfunc);
...@@ -543,20 +548,21 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -543,20 +548,21 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
func >= ARRAY_SIZE(mtk_gpio_functions)) { func >= ARRAY_SIZE(mtk_gpio_functions)) {
dev_err(pctl->dev, "invalid pins value.\n"); dev_err(pctl->dev, "invalid pins value.\n");
err = -EINVAL; err = -EINVAL;
goto fail; goto exit;
} }
grp = mtk_pctrl_find_group_by_pin(pctl, pin); grp = mtk_pctrl_find_group_by_pin(pctl, pin);
if (!grp) { if (!grp) {
dev_err(pctl->dev, "unable to match pin %d to group\n", dev_err(pctl->dev, "unable to match pin %d to group\n",
pin); pin);
return -EINVAL; err = -EINVAL;
goto exit;
} }
err = mtk_pctrl_dt_node_to_map_func(pctl, pin, func, grp, map, err = mtk_pctrl_dt_node_to_map_func(pctl, pin, func, grp, map,
reserved_maps, num_maps); reserved_maps, num_maps);
if (err < 0) if (err < 0)
goto fail; goto exit;
if (has_config) { if (has_config) {
err = pinctrl_utils_add_map_configs(pctldev, map, err = pinctrl_utils_add_map_configs(pctldev, map,
...@@ -564,13 +570,14 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -564,13 +570,14 @@ static int mtk_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
configs, num_configs, configs, num_configs,
PIN_MAP_TYPE_CONFIGS_GROUP); PIN_MAP_TYPE_CONFIGS_GROUP);
if (err < 0) if (err < 0)
goto fail; goto exit;
} }
} }
return 0; err = 0;
fail: exit:
kfree(configs);
return err; return err;
} }
...@@ -591,6 +598,7 @@ static int mtk_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev, ...@@ -591,6 +598,7 @@ static int mtk_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
&reserved_maps, num_maps); &reserved_maps, num_maps);
if (ret < 0) { if (ret < 0) {
pinctrl_utils_dt_free_map(pctldev, *map, *num_maps); pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
of_node_put(np);
return ret; return ret;
} }
} }
......
obj-$(CONFIG_PINCTRL_MVEBU) += pinctrl-mvebu.o obj-y += pinctrl-mvebu.o
obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o obj-$(CONFIG_PINCTRL_DOVE) += pinctrl-dove.o
obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o obj-$(CONFIG_PINCTRL_KIRKWOOD) += pinctrl-kirkwood.o
obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o obj-$(CONFIG_PINCTRL_ARMADA_370) += pinctrl-armada-370.o
......
...@@ -663,28 +663,20 @@ int mvebu_pinctrl_probe(struct platform_device *pdev) ...@@ -663,28 +663,20 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
/* assign mpp modes to groups */ /* assign mpp modes to groups */
for (n = 0; n < soc->nmodes; n++) { for (n = 0; n < soc->nmodes; n++) {
struct mvebu_mpp_mode *mode = &soc->modes[n]; struct mvebu_mpp_mode *mode = &soc->modes[n];
struct mvebu_pinctrl_group *grp = struct mvebu_mpp_ctrl_setting *set = &mode->settings[0];
mvebu_pinctrl_find_group_by_pid(pctl, mode->pid); struct mvebu_pinctrl_group *grp;
unsigned num_settings; unsigned num_settings;
if (!grp) { for (num_settings = 0; ; set++) {
dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
mode->pid);
continue;
}
for (num_settings = 0; ;) {
struct mvebu_mpp_ctrl_setting *set =
&mode->settings[num_settings];
if (!set->name) if (!set->name)
break; break;
num_settings++;
/* skip unsupported settings for this variant */ /* skip unsupported settings for this variant */
if (pctl->variant && !(pctl->variant & set->variant)) if (pctl->variant && !(pctl->variant & set->variant))
continue; continue;
num_settings++;
/* find gpio/gpo/gpi settings */ /* find gpio/gpo/gpi settings */
if (strcmp(set->name, "gpio") == 0) if (strcmp(set->name, "gpio") == 0)
set->flags = MVEBU_SETTING_GPI | set->flags = MVEBU_SETTING_GPI |
...@@ -695,6 +687,17 @@ int mvebu_pinctrl_probe(struct platform_device *pdev) ...@@ -695,6 +687,17 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
set->flags = MVEBU_SETTING_GPI; set->flags = MVEBU_SETTING_GPI;
} }
/* skip modes with no settings for this variant */
if (!num_settings)
continue;
grp = mvebu_pinctrl_find_group_by_pid(pctl, mode->pid);
if (!grp) {
dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
mode->pid);
continue;
}
grp->settings = mode->settings; grp->settings = mode->settings;
grp->num_settings = num_settings; grp->num_settings = num_settings;
} }
......
...@@ -220,6 +220,7 @@ static void parse_dt_cfg(struct device_node *np, ...@@ -220,6 +220,7 @@ static void parse_dt_cfg(struct device_node *np,
* parse the config properties into generic pinconfig values. * parse the config properties into generic pinconfig values.
* @np: node containing the pinconfig properties * @np: node containing the pinconfig properties
* @configs: array with nconfigs entries containing the generic pinconf values * @configs: array with nconfigs entries containing the generic pinconf values
* must be freed when no longer necessary.
* @nconfigs: umber of configurations * @nconfigs: umber of configurations
*/ */
int pinconf_generic_parse_dt_config(struct device_node *np, int pinconf_generic_parse_dt_config(struct device_node *np,
......
...@@ -1102,32 +1102,24 @@ static struct platform_driver adi_gpio_driver = { ...@@ -1102,32 +1102,24 @@ static struct platform_driver adi_gpio_driver = {
}, },
}; };
static struct platform_driver * const drivers[] = {
&adi_pinctrl_driver,
&adi_gpio_pint_driver,
&adi_gpio_driver,
};
static int __init adi_pinctrl_setup(void) static int __init adi_pinctrl_setup(void)
{ {
int ret; int ret;
ret = platform_driver_register(&adi_pinctrl_driver); ret = platform_register_drivers(drivers, ARRAY_SIZE(drivers));
if (ret) if (ret)
return ret; return ret;
ret = platform_driver_register(&adi_gpio_pint_driver);
if (ret)
goto pint_error;
ret = platform_driver_register(&adi_gpio_driver);
if (ret)
goto gpio_error;
#ifdef CONFIG_PM #ifdef CONFIG_PM
register_syscore_ops(&gpio_pm_syscore_ops); register_syscore_ops(&gpio_pm_syscore_ops);
#endif #endif
return ret; return 0;
gpio_error:
platform_driver_unregister(&adi_gpio_pint_driver);
pint_error:
platform_driver_unregister(&adi_pinctrl_driver);
return ret;
} }
arch_initcall(adi_pinctrl_setup); arch_initcall(adi_pinctrl_setup);
......
...@@ -500,7 +500,8 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -500,7 +500,8 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
if (!num_pins) { if (!num_pins) {
dev_err(pctldev->dev, "no pins found in node %s\n", dev_err(pctldev->dev, "no pins found in node %s\n",
of_node_full_name(np)); of_node_full_name(np));
return -EINVAL; ret = -EINVAL;
goto exit;
} }
/* /*
...@@ -514,19 +515,19 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -514,19 +515,19 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps, ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, num_maps,
reserve); reserve);
if (ret < 0) if (ret < 0)
return ret; goto exit;
for (i = 0; i < num_pins; i++) { for (i = 0; i < num_pins; i++) {
const char *group, *func; const char *group, *func;
ret = of_property_read_u32_index(np, "pinmux", i, &pinfunc); ret = of_property_read_u32_index(np, "pinmux", i, &pinfunc);
if (ret) if (ret)
return ret; goto exit;
ret = atmel_pctl_xlate_pinfunc(pctldev, np, pinfunc, &group, ret = atmel_pctl_xlate_pinfunc(pctldev, np, pinfunc, &group,
&func); &func);
if (ret) if (ret)
return ret; goto exit;
pinctrl_utils_add_map_mux(pctldev, map, reserved_maps, num_maps, pinctrl_utils_add_map_mux(pctldev, map, reserved_maps, num_maps,
group, func); group, func);
...@@ -537,11 +538,13 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev, ...@@ -537,11 +538,13 @@ static int atmel_pctl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
configs, num_configs, configs, num_configs,
PIN_MAP_TYPE_CONFIGS_GROUP); PIN_MAP_TYPE_CONFIGS_GROUP);
if (ret < 0) if (ret < 0)
return ret; goto exit;
} }
} }
return 0; exit:
kfree(configs);
return ret;
} }
static int atmel_pctl_dt_node_to_map(struct pinctrl_dev *pctldev, static int atmel_pctl_dt_node_to_map(struct pinctrl_dev *pctldev,
...@@ -1000,7 +1003,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev) ...@@ -1000,7 +1003,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
atmel_pioctrl->irqs[i] = res->start; atmel_pioctrl->irqs[i] = res->start;
irq_set_chained_handler(res->start, atmel_gpio_irq_handler); irq_set_chained_handler(res->start, atmel_gpio_irq_handler);
irq_set_handler_data(res->start, atmel_pioctrl); irq_set_handler_data(res->start, atmel_pioctrl);
dev_dbg(dev, "bank %i: hwirq=%u\n", i, res->start); dev_dbg(dev, "bank %i: irq=%pr\n", i, res);
} }
atmel_pioctrl->irq_domain = irq_domain_add_linear(dev->of_node, atmel_pioctrl->irq_domain = irq_domain_add_linear(dev->of_node,
......
...@@ -1828,20 +1828,20 @@ static struct platform_driver at91_pinctrl_driver = { ...@@ -1828,20 +1828,20 @@ static struct platform_driver at91_pinctrl_driver = {
.remove = at91_pinctrl_remove, .remove = at91_pinctrl_remove,
}; };
static struct platform_driver * const drivers[] = {
&at91_gpio_driver,
&at91_pinctrl_driver,
};
static int __init at91_pinctrl_init(void) static int __init at91_pinctrl_init(void)
{ {
int ret; return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
ret = platform_driver_register(&at91_gpio_driver);
if (ret)
return ret;
return platform_driver_register(&at91_pinctrl_driver);
} }
arch_initcall(at91_pinctrl_init); arch_initcall(at91_pinctrl_init);
static void __exit at91_pinctrl_exit(void) static void __exit at91_pinctrl_exit(void)
{ {
platform_driver_unregister(&at91_pinctrl_driver); platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
} }
module_exit(at91_pinctrl_exit); module_exit(at91_pinctrl_exit);
......
...@@ -162,6 +162,14 @@ enum ltq_pin { ...@@ -162,6 +162,14 @@ enum ltq_pin {
GPIO53, GPIO53,
GPIO54, GPIO54,
GPIO55, GPIO55,
GPIO56,
GPIO57,
GPIO58,
GPIO59,
GPIO60, /* 60 */
GPIO61,
GPIO62,
GPIO63,
GPIO64, GPIO64,
GPIO65, GPIO65,
......
...@@ -614,6 +614,40 @@ static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank, ...@@ -614,6 +614,40 @@ static void rk3288_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
} }
} }
#define RK3228_PULL_OFFSET 0x100
static void rk3228_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank,
int pin_num, struct regmap **regmap,
int *reg, u8 *bit)
{
struct rockchip_pinctrl *info = bank->drvdata;
*regmap = info->regmap_base;
*reg = RK3228_PULL_OFFSET;
*reg += bank->bank_num * RK3188_PULL_BANK_STRIDE;
*reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4);
*bit = (pin_num % RK3188_PULL_PINS_PER_REG);
*bit *= RK3188_PULL_BITS_PER_PIN;
}
#define RK3228_DRV_GRF_OFFSET 0x200
static void rk3228_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
int pin_num, struct regmap **regmap,
int *reg, u8 *bit)
{
struct rockchip_pinctrl *info = bank->drvdata;
*regmap = info->regmap_base;
*reg = RK3228_DRV_GRF_OFFSET;
*reg += bank->bank_num * RK3288_DRV_BANK_STRIDE;
*reg += ((pin_num / RK3288_DRV_PINS_PER_REG) * 4);
*bit = (pin_num % RK3288_DRV_PINS_PER_REG);
*bit *= RK3288_DRV_BITS_PER_PIN;
}
#define RK3368_PULL_GRF_OFFSET 0x100 #define RK3368_PULL_GRF_OFFSET 0x100
#define RK3368_PULL_PMU_OFFSET 0x10 #define RK3368_PULL_PMU_OFFSET 0x10
...@@ -1258,8 +1292,10 @@ static int rockchip_pinctrl_parse_functions(struct device_node *np, ...@@ -1258,8 +1292,10 @@ static int rockchip_pinctrl_parse_functions(struct device_node *np,
func->groups[i] = child->name; func->groups[i] = child->name;
grp = &info->groups[grp_index++]; grp = &info->groups[grp_index++];
ret = rockchip_pinctrl_parse_groups(child, grp, info, i++); ret = rockchip_pinctrl_parse_groups(child, grp, info, i++);
if (ret) if (ret) {
of_node_put(child);
return ret; return ret;
}
} }
return 0; return 0;
...@@ -1304,6 +1340,7 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev, ...@@ -1304,6 +1340,7 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
ret = rockchip_pinctrl_parse_functions(child, info, i++); ret = rockchip_pinctrl_parse_functions(child, info, i++);
if (ret) { if (ret) {
dev_err(&pdev->dev, "failed to parse function\n"); dev_err(&pdev->dev, "failed to parse function\n");
of_node_put(child);
return ret; return ret;
} }
} }
...@@ -2143,6 +2180,23 @@ static struct rockchip_pin_ctrl rk3188_pin_ctrl = { ...@@ -2143,6 +2180,23 @@ static struct rockchip_pin_ctrl rk3188_pin_ctrl = {
.pull_calc_reg = rk3188_calc_pull_reg_and_bit, .pull_calc_reg = rk3188_calc_pull_reg_and_bit,
}; };
static struct rockchip_pin_bank rk3228_pin_banks[] = {
PIN_BANK(0, 32, "gpio0"),
PIN_BANK(1, 32, "gpio1"),
PIN_BANK(2, 32, "gpio2"),
PIN_BANK(3, 32, "gpio3"),
};
static struct rockchip_pin_ctrl rk3228_pin_ctrl = {
.pin_banks = rk3228_pin_banks,
.nr_banks = ARRAY_SIZE(rk3228_pin_banks),
.label = "RK3228-GPIO",
.type = RK3288,
.grf_mux_offset = 0x0,
.pull_calc_reg = rk3228_calc_pull_reg_and_bit,
.drv_calc_reg = rk3228_calc_drv_reg_and_bit,
};
static struct rockchip_pin_bank rk3288_pin_banks[] = { static struct rockchip_pin_bank rk3288_pin_banks[] = {
PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU, PIN_BANK_IOMUX_FLAGS(0, 24, "gpio0", IOMUX_SOURCE_PMU,
IOMUX_SOURCE_PMU, IOMUX_SOURCE_PMU,
...@@ -2220,6 +2274,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = { ...@@ -2220,6 +2274,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
.data = (void *)&rk3066b_pin_ctrl }, .data = (void *)&rk3066b_pin_ctrl },
{ .compatible = "rockchip,rk3188-pinctrl", { .compatible = "rockchip,rk3188-pinctrl",
.data = (void *)&rk3188_pin_ctrl }, .data = (void *)&rk3188_pin_ctrl },
{ .compatible = "rockchip,rk3228-pinctrl",
.data = (void *)&rk3228_pin_ctrl },
{ .compatible = "rockchip,rk3288-pinctrl", { .compatible = "rockchip,rk3288-pinctrl",
.data = (void *)&rk3288_pin_ctrl }, .data = (void *)&rk3288_pin_ctrl },
{ .compatible = "rockchip,rk3368-pinctrl", { .compatible = "rockchip,rk3368-pinctrl",
......
...@@ -1484,10 +1484,7 @@ static void pcs_irq_free(struct pcs_device *pcs) ...@@ -1484,10 +1484,7 @@ static void pcs_irq_free(struct pcs_device *pcs)
static void pcs_free_resources(struct pcs_device *pcs) static void pcs_free_resources(struct pcs_device *pcs)
{ {
pcs_irq_free(pcs); pcs_irq_free(pcs);
pinctrl_unregister(pcs->pctl);
if (pcs->pctl)
pinctrl_unregister(pcs->pctl);
pcs_free_funcs(pcs); pcs_free_funcs(pcs);
pcs_free_pingroups(pcs); pcs_free_pingroups(pcs);
} }
......
...@@ -253,8 +253,10 @@ static int tegra_xusb_padctl_dt_node_to_map(struct pinctrl_dev *pinctrl, ...@@ -253,8 +253,10 @@ static int tegra_xusb_padctl_dt_node_to_map(struct pinctrl_dev *pinctrl,
err = tegra_xusb_padctl_parse_subnode(padctl, np, maps, err = tegra_xusb_padctl_parse_subnode(padctl, np, maps,
&reserved_maps, &reserved_maps,
num_maps); num_maps);
if (err < 0) if (err < 0) {
of_node_put(np);
return err; return err;
}
} }
return 0; return 0;
......
...@@ -217,6 +217,7 @@ static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, ...@@ -217,6 +217,7 @@ static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
if (ret < 0) { if (ret < 0) {
pinctrl_utils_dt_free_map(pctldev, *map, pinctrl_utils_dt_free_map(pctldev, *map,
*num_maps); *num_maps);
of_node_put(np);
return ret; return ret;
} }
} }
......
This diff is collapsed.
if (ARCH_PXA || COMPILE_TEST)
config PINCTRL_PXA
bool
select PINMUX
select PINCONF
select GENERIC_PINCONF
config PINCTRL_PXA27X
tristate "Marvell PXA27x pin controller driver"
select PINCTRL_PXA
default y if PXA27x
help
This is the pinctrl, pinmux, pinconf driver for the Marvell
PXA2xx block found in the pxa25x and pxa27x platforms.
endif
# Marvell PXA pin control drivers
obj-$(CONFIG_PINCTRL_PXA27X) += pinctrl-pxa2xx.o pinctrl-pxa27x.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -63,6 +63,14 @@ config PINCTRL_MSM8916 ...@@ -63,6 +63,14 @@ config PINCTRL_MSM8916
This is the pinctrl, pinmux, pinconf and gpiolib driver for the This is the pinctrl, pinmux, pinconf and gpiolib driver for the
Qualcomm TLMM block found on the Qualcomm 8916 platform. Qualcomm TLMM block found on the Qualcomm 8916 platform.
config PINCTRL_MSM8996
tristate "Qualcomm MSM8996 pin controller driver"
depends on GPIOLIB && OF
select PINCTRL_MSM
help
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
Qualcomm TLMM block found in the Qualcomm MSM8996 platform.
config PINCTRL_QDF2XXX config PINCTRL_QDF2XXX
tristate "Qualcomm Technologies QDF2xxx pin controller driver" tristate "Qualcomm Technologies QDF2xxx pin controller driver"
depends on GPIOLIB && ACPI depends on GPIOLIB && ACPI
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment