Commit 5a1bcbd9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull pin control updates from Linus Walleij:
 "The most interesting aspect is that we now have initial support for
  the Apple pin controller as used in the M1 laptops and the iPhones
  which is a step forward for using Linux efficiently on this Apple
  silicon.

  Core changes:

   - Add infrastructure for per-parent interrupt data to support the
     Apple pin controller.

  New drivers:

   - New combined pin control and GPIO driver for the Apple SoC. This is
     used in all modern Apple silicon such as the M1 laptops but also in
     at least recent iPhone variants.

   - New subdriver for the Qualcomm SM6350

   - New subdriver for the Qualcomm QCM2290

   - New subdriver for the Qualcomm PM6350

   - New subdriver for the Uniphier NX1

   - New subdriver for the Samsung ExynosAutoV9

   - New subdriver for the Mediatek MT7986

   - New subdriver for the nVidia Tegra194

  Improvements:

   - Improve power management in the Mediatek driver.

   - Improvements to the Renesas internal consistency checker.

   - Convert the Rockchip pin control device tree bindings to YAML.

   - Finally convert the Qualcomm PMIC SSBI and SPMI MPP GPIO driver to
     use hierarchical interrupts.

   - Convert the Qualcomm PMIC MPP device tree bindings to YAML"

* tag 'pinctrl-v5.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (55 commits)
  pinctrl: add pinctrl/GPIO driver for Apple SoCs
  dt-bindings: pinctrl: Add apple,npins property to apple,pinctrl
  dt-bindings: pinctrl: add #interrupt-cells to apple,pinctrl
  gpio: Allow per-parent interrupt data
  pinctrl: tegra: Fix warnings and error
  pinctrl: intel: Kconfig: Add configuration menu to Intel pin control
  pinctrl: tegra: Use correct offset for pin group
  pinctrl: core: fix possible memory leak in pinctrl_enable()
  pinctrl: bcm2835: Allow building driver as a module
  pinctrl: equilibrium: Fix function addition in multiple groups
  pinctrl: tegra: Add pinmux support for Tegra194
  pinctrl: tegra: include lpdr pin properties
  pinctrl: mediatek: add support for MT7986 SoC
  dt-bindings: pinctrl: update bindings for MT7986 SoC
  pinctrl: microchip sgpio: use reset driver
  dt-bindings: pinctrl: pinctrl-microchip-sgpio: Add reset binding
  dt-bindings: pinctrl: qcom,pmic-mpp: switch to #interrupt-cells
  pinctrl: qcom: spmi-mpp: add support for hierarchical IRQ chip
  pinctrl: qcom: spmi-mpp: hardcode IRQ counts
  pinctrl: qcom: ssbi-mpp: add support for hierarchical IRQ chip
  ...
parents a51e4a1a a0f160ff
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -34,6 +34,10 @@ properties:
  gpio-ranges:
    maxItems: 1

  apple,npins:
    $ref: /schemas/types.yaml#/definitions/uint32
    description: The number of pins in this GPIO controller.

  interrupts:
    description: One interrupt for each of the (up to 7) interrupt
      groups supported by the controller sorted by interrupt group
@@ -43,6 +47,9 @@ properties:

  interrupt-controller: true

  '#interrupt-cells':
    const: 2

patternProperties:
  '-pins$':
    type: object
@@ -66,6 +73,7 @@ required:
  - gpio-controller
  - '#gpio-cells'
  - gpio-ranges
  - apple,npins

additionalProperties: false

@@ -86,8 +94,10 @@ examples:
        gpio-controller;
        #gpio-cells = <2>;
        gpio-ranges = <&pinctrl 0 0 212>;
        apple,npins = <212>;

        interrupt-controller;
        #interrupt-cells = <2>;
        interrupt-parent = <&aic>;
        interrupts = <AIC_IRQ 16 IRQ_TYPE_LEVEL_HIGH>,
                     <AIC_IRQ 17 IRQ_TYPE_LEVEL_HIGH>,
+363 −0
Original line number Diff line number Diff line
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/mediatek,mt7986-pinctrl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#

title: Mediatek MT7986 Pin Controller Device Tree Bindings

maintainers:
  - Sean Wang <sean.wang@kernel.org>

description: |+
  The MediaTek's MT7986 Pin controller is used to control SoC pins.

properties:
  compatible:
    enum:
      - mediatek,mt7986a-pinctrl
      - mediatek,mt7986b-pinctrl

  reg:
    minItems: 8
    maxItems: 8

  reg-names:
    items:
      - const: gpio
      - const: iocfg_rt
      - const: iocfg_rb
      - const: iocfg_lt
      - const: iocfg_lb
      - const: iocfg_tr
      - const: iocfg_tl
      - const: eint

  gpio-controller: true

  "#gpio-cells":
    const: 2
    description: |
      Number of cells in GPIO specifier. Since the generic GPIO
      binding is used, the amount of cells must be specified as 2. See the below
      mentioned gpio binding representation for description of particular cells.

  gpio-ranges:
    minItems: 1
    maxItems: 5
    description: |
      GPIO valid number range.

  interrupt-controller: true

  interrupts:
    maxItems: 1

  "#interrupt-cells":
    const: 2

required:
  - compatible
  - reg
  - reg-names
  - gpio-controller
  - "#gpio-cells"

patternProperties:
  '-pins$':
    type: object
    additionalProperties: false

    patternProperties:
      '.*mux.*':
        type: object
        additionalProperties: false
        description: |
          pinmux configuration nodes.

          The following table shows the effective values of "group", "function"
          properties and chip pinout pins

          groups	    function    pins (in pin#)
          ---------------------------------------------------------------------
          "watchdog"        "watchdog"  0
          "wifi_led"        "led"       1, 2
          "i2c"             "i2c"       3, 4
          "uart1_0"         "uart"      7, 8, 9, 10
          "pcie_clk"        "pcie"      9
          "pcie_wake"       "pcie"      10
          "spi1_0"          "spi"       11, 12, 13, 14
          "pwm1_1"          "pwm"       20,
          "pwm0"            "pwm"       21,
          "pwm1_0"          "pwm"       22,
          "snfi"            "flash"     23, 24, 25, 26, 27, 28
          "spi1_2"          "spi"       29, 30, 31, 32
          "emmc_45"         "emmc"      22, 23, 24, 25, 26, 27, 28, 29, 30,
                                        31, 32
          "spi1_1"          "spi"       23, 24, 25, 26
          "uart1_2"         "uart"      29, 30, 31, 32
          "uart1_1"         "uart"      23, 24, 25, 26
          "uart2_0"         "uart"      29, 30, 31, 32
          "spi0"            "spi"       33, 34, 35, 36
          "spi0_wp_hold"    "spi"       37, 38
          "uart1_3_rx_tx"   "uart"      35, 36
          "uart1_3_cts_rts" "uart"      37, 38
          "uart2_1"         "uart"      33, 34, 35, 36
          "spi1_3"          "spi"       33, 34, 35, 36
          "uart0"           "uart"      39, 40
          "pcie_pereset"    "pcie"      41
          "uart1"           "uart"      42, 43, 44, 45
          "uart2"           "uart"      46, 47, 48, 49
          "emmc_51"         "emmc"      50, 51, 52, 53, 54, 55, 56, 57, 57,
                                        59, 60, 61
          "pcm"             "audio"     62, 63, 64, 65
          "i2s"             "audio"     62, 63, 64, 65
          "switch_int"      "eth"       66
          "mdc_mdio"        "eth"       67

        $ref: "/schemas/pinctrl/pinmux-node.yaml"
        properties:
          function:
            description: |
              A string containing the name of the function to mux to the group.
              There is no "audio", "pcie" functions on mt7986b, you can only use
              those functions on mt7986a.
            enum: [audio, emmc, eth, i2c, led, flash, pcie, pwm, spi, uart,
                   watchdog, wifi]
          groups:
            description: |
              An array of strings. Each string contains the name of a group.
              There is no "pcie_pereset", "uart1", "uart2" "emmc_51", "pcm",
              and "i2s" groups on mt7986b, you can only use those groups on
              mt7986a.
        required:
          - function
          - groups

        allOf:
          - if:
              properties:
                function:
                  const: audio
            then:
              properties:
                groups:
                  enum: [pcm, i2s]
          - if:
              properties:
                function:
                  const: emmc
            then:
              properties:
                groups:
                  enum: [emmc, emmc_rst]
          - if:
              properties:
                function:
                  const: eth
            then:
              properties:
                groups:
                  enum: [switch_int, mdc_mdio]
          - if:
              properties:
                function:
                  const: i2c
            then:
              properties:
                groups:
                  enum: [i2c]
          - if:
              properties:
                function:
                  const: led
            then:
              properties:
                groups:
                  enum: [wifi_led]
          - if:
              properties:
                function:
                  const: flash
            then:
              properties:
                groups:
                  enum: [snfi]
          - if:
              properties:
                function:
                  const: pcie
            then:
              properties:
                groups:
                  enum: [pcie_clk, pcie_wake, pcie_pereset]
          - if:
              properties:
                function:
                  const: pwm
            then:
              properties:
                groups:
                  enum: [pwm0, pwm1_0, pwm1_1]
          - if:
              properties:
                function:
                  const: spi
            then:
              properties:
                groups:
                  enum: [spi0, spi0_wp_hold, spi1_0, spi1_1, spi1_2, spi1_3]
          - if:
              properties:
                function:
                  const: uart
            then:
              properties:
                groups:
                  enum: [uart1_0, uart1_1, uart1_2, uart1_3_rx_tx,
                         uart1_3_cts_rts, uart2_0, uart2_1, uart0, uart1, uart2]
          - if:
              properties:
                function:
                  const: watchdog
            then:
              properties:
                groups:
                  enum: [watchdog]
          - if:
              properties:
                function:
                  const: wifi
            then:
              properties:
                groups:
                  enum: [wf_2g, wf_5g, wf_dbdc]
      '.*conf.*':
        type: object
        additionalProperties: false
        description: |
          pinconf configuration nodes.
        $ref: "/schemas/pinctrl/pincfg-node.yaml"

        properties:
          pins:
            description: |
              An array of strings. Each string contains the name of a pin.
              There is no PIN 41 to PIN 65 above on mt7686b, you can only use
              those pins on mt7986a.
            enum: [SYS_WATCHDOG, WF2G_LED, WF5G_LED, I2C_SCL, I2C_SDA, GPIO_0,
                   GPIO_1, GPIO_2, GPIO_3, GPIO_4, GPIO_5, GPIO_6, GPIO_7,
                   GPIO_8, GPIO_9, GPIO_10, GPIO_11, GPIO_12, GPIO_13, GPIO_14,
                   GPIO_15, PWM0, PWM1, SPI0_CLK, SPI0_MOSI, SPI0_MISO, SPI0_CS,
                   SPI0_HOLD, SPI0_WP, SPI1_CLK, SPI1_MOSI, SPI1_MISO, SPI1_CS,
                   SPI2_CLK, SPI2_MOSI, SPI2_MISO, SPI2_CS, SPI2_HOLD, SPI2_WP,
                   UART0_RXD, UART0_TXD, PCIE_PERESET_N, UART1_RXD, UART1_TXD,
                   UART1_CTS, UART1_RTS, UART2_RXD, UART2_TXD, UART2_CTS,
                   UART2_RTS, EMMC_DATA_0, EMMC_DATA_1, EMMC_DATA_2,
                   EMMC_DATA_3, EMMC_DATA_4, EMMC_DATA_5, EMMC_DATA_6,
                   EMMC_DATA_7, EMMC_CMD, EMMC_CK, EMMC_DSL, EMMC_RSTB, PCM_DTX,
                   PCM_DRX, PCM_CLK, PCM_FS, MT7531_INT, SMI_MDC, SMI_MDIO,
                   WF0_DIG_RESETB, WF0_CBA_RESETB, WF0_XO_REQ, WF0_TOP_CLK,
                   WF0_TOP_DATA, WF0_HB1, WF0_HB2, WF0_HB3, WF0_HB4, WF0_HB0,
                   WF0_HB0_B, WF0_HB5, WF0_HB6, WF0_HB7, WF0_HB8, WF0_HB9,
                   WF0_HB10, WF1_DIG_RESETB, WF1_CBA_RESETB, WF1_XO_REQ,
                   WF1_TOP_CLK, WF1_TOP_DATA, WF1_HB1, WF1_HB2, WF1_HB3,
                   WF1_HB4, WF1_HB0, WF1_HB0_B, WF1_HB5, WF1_HB6, WF1_HB7,
                   WF1_HB8]

          bias-disable: true

          bias-pull-up: true

          bias-pull-down: true

          input-enable: true

          input-disable: true

          output-enable: true

          output-low: true

          output-high: true

          input-schmitt-enable: true

          input-schmitt-disable: true

          drive-strength:
            enum: [2, 4, 6, 8, 10, 12, 14, 16]

          mediatek,pull-up-adv:
            description: |
              Valid arguments for 'mediatek,pull-up-adv' are '0', '1', '2', '3'
              Pull up setings for 2 pull resistors, R0 and R1. Valid arguments
              are described as below:
              0: (R1, R0) = (0, 0) which means R1 disabled and R0 disabled.
              1: (R1, R0) = (0, 1) which means R1 disabled and R0 enabled.
              2: (R1, R0) = (1, 0) which means R1 enabled and R0 disabled.
              3: (R1, R0) = (1, 1) which means R1 enabled and R0 enabled.
            $ref: /schemas/types.yaml#/definitions/uint32
            enum: [0, 1, 2, 3]

          mediatek,pull-down-adv:
            description: |
              Valid arguments for 'mediatek,pull-up-adv' are '0', '1', '2', '3'
              Pull down setings for 2 pull resistors, R0 and R1. Valid arguments
              are described as below:
              0: (R1, R0) = (0, 0) which means R1 disabled and R0 disabled.
              1: (R1, R0) = (0, 1) which means R1 disabled and R0 enabled.
              2: (R1, R0) = (1, 0) which means R1 enabled and R0 disabled.
              3: (R1, R0) = (1, 1) which means R1 enabled and R0 enabled.
            $ref: /schemas/types.yaml#/definitions/uint32
            enum: [0, 1, 2, 3]

        required:
          - pins

additionalProperties: false

examples:
  - |
    #include <dt-bindings/interrupt-controller/irq.h>
    #include <dt-bindings/interrupt-controller/arm-gic.h>

    soc {
      #address-cells = <2>;
      #size-cells = <2>;
      pio: pinctrl@1001f000 {
        compatible = "mediatek,mt7986a-pinctrl";
        reg = <0 0x1001f000 0 0x1000>,
              <0 0x11c30000 0 0x1000>,
              <0 0x11c40000 0 0x1000>,
              <0 0x11e20000 0 0x1000>,
              <0 0x11e30000 0 0x1000>,
              <0 0x11f00000 0 0x1000>,
              <0 0x11f10000 0 0x1000>,
              <0 0x1000b000 0 0x1000>;
        reg-names = "gpio", "iocfg_rt", "iocfg_rb", "iocfg_lt",
                    "iocfg_lb", "iocfg_tr", "iocfg_tl", "eint";
        gpio-controller;
        #gpio-cells = <2>;
        gpio-ranges = <&pio 0 0 100>;
        interrupt-controller;
        interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
        interrupt-parent = <&gic>;
        #interrupt-cells = <2>;

        uart1_pins: uart1-pins {
          mux {
            function = "uart";
            groups = "uart1";
          };
        };

        uart2_pins: uart2-pins {
          mux {
            function = "uart";
            groups = "uart2";
          };
        };

      };
    };
+7 −0
Original line number Diff line number Diff line
@@ -68,6 +68,13 @@ properties:
      clock, and larger than zero.
    default: 12500000

  resets:
    maxItems: 1

  reset-names:
    items:
      - const: switch

patternProperties:
  "^gpio@[0-1]$":
    type: object
+84 −2
Original line number Diff line number Diff line
@@ -49,6 +49,12 @@ properties:
    description: The interrupt outputs to sysirq.
    maxItems: 1

  mediatek,rsel_resistance_in_si_unit:
    type: boolean
    description: |
      Identifying i2c pins pull up/down type which is RSEL. It can support
      RSEL define or si unit value(ohm) to set different resistance.

#PIN CONFIGURATION NODES
patternProperties:
  '-pins$':
@@ -82,9 +88,85 @@ patternProperties:
      drive-strength:
        enum: [2, 4, 6, 8, 10, 12, 14, 16]

      bias-pull-down: true
      bias-pull-down:
        description: |
          For pull down type is normal, it don't need add RSEL & R1R0 define
          and resistance value.
          For pull down type is PUPD/R0/R1 type, it can add R1R0 define to
          set different resistance. It can support "MTK_PUPD_SET_R1R0_00" &
          "MTK_PUPD_SET_R1R0_01" & "MTK_PUPD_SET_R1R0_10" & "MTK_PUPD_SET_R1R0_11"
          define in mt8195.
          For pull down type is RSEL, it can add RSEL define & resistance value(ohm)
          to set different resistance by identifying property "mediatek,rsel_resistance_in_si_unit".
          It can support "MTK_PULL_SET_RSEL_000" & "MTK_PULL_SET_RSEL_001"
          & "MTK_PULL_SET_RSEL_010" & "MTK_PULL_SET_RSEL_011" & "MTK_PULL_SET_RSEL_100"
          & "MTK_PULL_SET_RSEL_101" & "MTK_PULL_SET_RSEL_110" & "MTK_PULL_SET_RSEL_111"
          define in mt8195. It can also support resistance value(ohm) "75000" & "5000" in mt8195.
          oneOf:
            - enum: [100, 101, 102, 103]
            - description: mt8195 pull down PUPD/R0/R1 type define value.
            - enum: [200, 201, 202, 203, 204, 205, 206, 207]
            - description: mt8195 pull down RSEL type define value.
            - enum: [75000, 5000]
            - description: mt8195 pull down RSEL type si unit value(ohm).

          An example of using RSEL define:
          pincontroller {
            i2c0_pin {
              pinmux = <PINMUX_GPIO8__FUNC_SDA0>;
              bias-pull-down = <MTK_PULL_SET_RSEL_001>;
            };
          };
          An example of using si unit resistance value(ohm):
          &pio {
            mediatek,rsel_resistance_in_si_unit;
          }
          pincontroller {
            i2c0_pin {
              pinmux = <PINMUX_GPIO8__FUNC_SDA0>;
              bias-pull-down = <75000>;
            };
          };

      bias-pull-up: true
      bias-pull-up:
        description: |
          For pull up type is normal, it don't need add RSEL & R1R0 define
          and resistance value.
          For pull up type is PUPD/R0/R1 type, it can add R1R0 define to
          set different resistance. It can support "MTK_PUPD_SET_R1R0_00" &
          "MTK_PUPD_SET_R1R0_01" & "MTK_PUPD_SET_R1R0_10" & "MTK_PUPD_SET_R1R0_11"
          define in mt8195.
          For pull up type is RSEL, it can add RSEL define & resistance value(ohm)
          to set different resistance by identifying property "mediatek,rsel_resistance_in_si_unit".
          It can support "MTK_PULL_SET_RSEL_000" & "MTK_PULL_SET_RSEL_001"
          & "MTK_PULL_SET_RSEL_010" & "MTK_PULL_SET_RSEL_011" & "MTK_PULL_SET_RSEL_100"
          & "MTK_PULL_SET_RSEL_101" & "MTK_PULL_SET_RSEL_110" & "MTK_PULL_SET_RSEL_111"
          define in mt8195. It can also support resistance value(ohm)
          "1000" & "1500" & "2000" & "3000" & "4000" & "5000" & "10000" & "75000" in mt8195.
          oneOf:
            - enum: [100, 101, 102, 103]
            - description: mt8195 pull up PUPD/R0/R1 type define value.
            - enum: [200, 201, 202, 203, 204, 205, 206, 207]
            - description: mt8195 pull up RSEL type define value.
            - enum: [1000, 1500, 2000, 3000, 4000, 5000, 10000, 75000]
            - description: mt8195 pull up RSEL type si unit value(ohm).
          An example of using RSEL define:
          pincontroller {
            i2c0_pin {
              pinmux = <PINMUX_GPIO8__FUNC_SDA0>;
              bias-pull-up = <MTK_PULL_SET_RSEL_001>;
            };
          };
          An example of using si unit resistance value(ohm):
          &pio {
            mediatek,rsel_resistance_in_si_unit;
          }
          pincontroller {
            i2c0_pin {
              pinmux = <PINMUX_GPIO8__FUNC_SDA0>;
              bias-pull-up = <1000>;
            };
          };

      bias-disable: true

+4 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ properties:
          - qcom,pm660l-gpio
          - qcom,pm6150-gpio
          - qcom,pm6150l-gpio
          - qcom,pm6350-gpio
          - qcom,pm7325-gpio
          - qcom,pm8005-gpio
          - qcom,pm8008-gpio
@@ -103,6 +104,7 @@ $defs:
          this subnode.  Valid pins are
                 - gpio1-gpio10 for pm6150
                 - gpio1-gpio12 for pm6150l
                 - gpio1-gpio9 for pm6350
                 - gpio1-gpio10 for pm7325
                 - gpio1-gpio4 for pm8005
                 - gpio1-gpio2 for pm8008
@@ -170,6 +172,8 @@ $defs:
      input-enable: true
      output-high: true
      output-low: true
      output-enable: true
      output-disable: true
      power-source: true

      qcom,drive-strength:
Loading