Pin control changes for the v6.14 kernel cycle:

No core changes this time
 
 New drivers:
 
 - New subdriver for the Qualcomm MSM8917 SoC TLMM
 
 - New subdriver for the Mediatek MT7988 SoC
 
 - New subdriver for the Rockchip RK3562 SoC
 
 - New subdriver for the Renesas RZ/G3E SoC
 
 Improvements:
 
 - Fix some missing pins in the Qualcomm IPQ5424 TLMM
 
 - Fix some missing LVDS pins in the Sunxi A100/A133
 
 - Support Sunxi V853 (simple compatible string)
 
 - Cleanups in the Samsung driver
 
 - Fix some AMD suspend behaviour
 
 - Cleanups
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCAAdFiEElDRnuGcz/wPCXQWMQRCzN7AZXXMFAmeR+5IACgkQQRCzN7AZ
 XXNkTQ/7Blf3alkeaUTjTj3LYFfaky2UjV8i2QLtRiznaLsNitNzRAOq8VYWFKHl
 ysDB8Bheal0vmUEig5I+CboTq2cTt5M5abcQHccOzq29Ln0O9nhlEgds2VjqRgxc
 6rD5TtbeXISkaLBUQdOQ0CkfmoAq0ihH8krFT8gOP01iiiGdLMq3g+v0F6g+wgOX
 0YV6v10wDTsxyh0xlBlshcEt+wTe4EC85WsQf9EerCnSbAqMk32lGLRGeIkazZyX
 l0mTm/JuB7m1UKS2eaZiyOpikK7aq7NirtFTdb5EGa3KYwlwYueiI0AjqCkx//NF
 0txtrk83EU+ApQuP3cXt5mCm19BBpSbIMMuv5qmz1EiX3kBEK++NM7L00ERatHDV
 LXwWObedtkMwzLPmOSPW/RXg7LhnoO34HgbEjznJQ6vV06a9hCMyJZCcIXOrxIP+
 +M5HHbVNrEt5MpcG5Q0FCTALiEKd7cmkQDoZAM9tracl4g5NdZawi4A+PwMdX6UO
 YYnAMYEdJGlCEvcpKNjTebdHz1PDRThk/bLtNNEJ9X8k0inA2H6XIOKW2LFjfR9c
 jNVBxQyOc6o2SKTWdzJm6+F4b/Rzo7awZzXFvURSguCRnbiJ81hIOwooE/o5+IJF
 Fg1N+7cC5AQdtKCy4rh7Hy0H+132XIFPSdeknk5BxUMtXpSGjh8=
 =qLiC
 -----END PGP SIGNATURE-----

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

Pull pin control updates from Linus Walleij:
 "No core changes this time

  New drivers:

   - New subdriver for the Qualcomm MSM8917 SoC TLMM

   - New subdriver for the Mediatek MT7988 SoC

   - New subdriver for the Rockchip RK3562 SoC

   - New subdriver for the Renesas RZ/G3E SoC

  Improvements:

   - Fix some missing pins in the Qualcomm IPQ5424 TLMM

   - Fix some missing LVDS pins in the Sunxi A100/A133

   - Support Sunxi V853 (simple compatible string)

   - Cleanups in the Samsung driver

   - Fix some AMD suspend behaviour

   - Cleanups"

* tag 'pinctrl-v6.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (29 commits)
  dt-bindings: pinctrl: sunxi: add compatible for V853
  pinctrl: Use str_enable_disable-like helpers
  dt-bindings: pinctrl: Correct indentation and style in DTS example
  pinctrl: amd: Take suspend type into consideration which pins are non-wake
  pinctrl: stm32: Add check for clk_enable()
  pinctrl: renesas: rzg2l: Fix PFC_MASK for RZ/V2H and RZ/G3E
  pinctrl: sunxi: add missed lvds pins for a100/a133
  pinctrl: mediatek: Drop mtk_pinconf_bias_set_pd()
  pinctrl: renesas: rzg2l: Add support for RZ/G3E SoC
  pinctrl: renesas: rzg2l: Update r9a09g057_variable_pin_cfg table
  dt-bindings: pinctrl: renesas: Document RZ/G3E SoC
  dt-bindings: pinctrl: renesas: Add alpha-numerical port support for RZ/V2H
  pinctrl: rockchip: add rk3562 support
  dt-bindings: pinctrl: Add rk3562 pinctrl support
  pinctrl: Fix the clean up on pinconf_apply_setting failure
  dt-bindings: pinctrl: add binding for MT7988 SoC
  pinctrl: mediatek: add MT7988 pinctrl driver
  pinctrl: mediatek: add support for MTK_PULL_PD_TYPE
  pinctrl: ocelot: Constify some structures
  pinctrl: renesas: rzg2l: Add audio clock pins on RZ/G3S
  ...
This commit is contained in:
Linus Torvalds 2025-01-24 07:38:50 -08:00
commit b746043cb3
46 changed files with 4789 additions and 287 deletions

View file

@ -44,6 +44,7 @@ properties:
- allwinner,sun8i-r40-pinctrl - allwinner,sun8i-r40-pinctrl
- allwinner,sun8i-v3-pinctrl - allwinner,sun8i-v3-pinctrl
- allwinner,sun8i-v3s-pinctrl - allwinner,sun8i-v3s-pinctrl
- allwinner,sun8i-v853-pinctrl
- allwinner,sun9i-a80-pinctrl - allwinner,sun9i-a80-pinctrl
- allwinner,sun9i-a80-r-pinctrl - allwinner,sun9i-a80-r-pinctrl
- allwinner,sun20i-d1-pinctrl - allwinner,sun20i-d1-pinctrl
@ -179,6 +180,18 @@ allOf:
minItems: 7 minItems: 7
maxItems: 7 maxItems: 7
- if:
properties:
compatible:
enum:
- allwinner,sun8i-v853-pinctrl
then:
properties:
interrupts:
minItems: 8
maxItems: 8
- if: - if:
properties: properties:
compatible: compatible:

View file

@ -145,40 +145,40 @@ additionalProperties:
examples: examples:
- | - |
#include <dt-bindings/clock/at91.h> #include <dt-bindings/clock/at91.h>
#include <dt-bindings/interrupt-controller/irq.h> #include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/pinctrl/at91.h> #include <dt-bindings/pinctrl/at91.h>
pinctrl@fffff400 { pinctrl@fffff400 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
compatible = "atmel,at91rm9200-pinctrl", "simple-mfd"; compatible = "atmel,at91rm9200-pinctrl", "simple-mfd";
ranges = <0xfffff400 0xfffff400 0x600>; ranges = <0xfffff400 0xfffff400 0x600>;
atmel,mux-mask = < atmel,mux-mask = <
/* A B */ /* A B */
0xffffffff 0xffc00c3b /* pioA */ 0xffffffff 0xffc00c3b /* pioA */
0xffffffff 0x7fff3ccf /* pioB */ 0xffffffff 0x7fff3ccf /* pioB */
0xffffffff 0x007fffff /* pioC */ 0xffffffff 0x007fffff /* pioC */
>; >;
dbgu { dbgu {
pinctrl_dbgu: dbgu-0 { dbgu-0 {
atmel,pins = atmel,pins =
<AT91_PIOB 14 AT91_PERIPH_A AT91_PINCTRL_PULL_UP <AT91_PIOB 14 AT91_PERIPH_A AT91_PINCTRL_PULL_UP
AT91_PIOB 15 AT91_PERIPH_A AT91_PINCTRL_NONE>; AT91_PIOB 15 AT91_PERIPH_A AT91_PINCTRL_NONE>;
}; };
}; };
pioA: gpio@fffff400 { gpio@fffff400 {
compatible = "atmel,at91rm9200-gpio"; compatible = "atmel,at91rm9200-gpio";
reg = <0xfffff400 0x200>; reg = <0xfffff400 0x200>;
interrupts = <2 IRQ_TYPE_LEVEL_HIGH 1>; interrupts = <2 IRQ_TYPE_LEVEL_HIGH 1>;
#gpio-cells = <2>; #gpio-cells = <2>;
gpio-controller; gpio-controller;
interrupt-controller; interrupt-controller;
#interrupt-cells = <2>; #interrupt-cells = <2>;
clocks = <&pmc PMC_TYPE_PERIPHERAL 2>; clocks = <&pmc PMC_TYPE_PERIPHERAL 2>;
}; };
}; };
... ...

View file

@ -0,0 +1,575 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/mediatek,mt7988-pinctrl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MediaTek MT7988 Pin Controller
maintainers:
- Sean Wang <sean.wang@kernel.org>
description:
The MediaTek's MT7988 Pin controller is used to control SoC pins.
properties:
compatible:
enum:
- mediatek,mt7988-pinctrl
reg:
minItems: 7
maxItems: 7
reg-names:
items:
- const: gpio
- const: iocfg_tr
- const: iocfg_br
- const: iocfg_rb
- const: iocfg_lb
- const: iocfg_tl
- const: eint
gpio-controller: true
"#gpio-cells":
const: 2
gpio-ranges:
minItems: 1
maxItems: 5
description:
GPIO valid number range.
interrupt-controller: true
interrupts:
maxItems: 1
"#interrupt-cells":
const: 2
allOf:
- $ref: pinctrl.yaml#
required:
- compatible
- reg
- reg-names
- gpio-controller
- "#gpio-cells"
patternProperties:
'-pins$':
type: object
additionalProperties: false
properties:
mux:
type: object
additionalProperties: false
$ref: /schemas/pinctrl/pinmux-node.yaml
description: |
pinmux configuration nodes.
The following table shows the effective values of "group", "function"
properties and chip pinout pins
groups function pins (in pin#)
---------------------------------------------------------------------
"tops_jtag0_0" "jtag" 0, 1, 2, 3, 4
"wo0_jtag" "jtag" 50, 51, 52, 53, 54
"wo1_jtag" "jtag" 50, 51, 52, 53, 54
"wo2_jtag" "jtag" 50, 51, 52, 53, 54
"jtag" "jtag" 58, 59, 60, 61, 62
"tops_jtag0_1" "jtag" 58, 59, 60, 61, 62
"int_usxgmii" "int_usxgmii" 2, 3
"pwm0" "pwm" 57
"pwm1" "pwm" 21
"pwm2" "pwm" 80
"pwm2_0" "pwm" 58
"pwm3" "pwm" 81
"pwm3_0" "pwm" 59
"pwm4" "pwm" 82
"pwm4_0" "pwm" 60
"pwm5" "pwm" 83
"pwm5_0" "pwm" 61
"pwm6" "pwm" 69
"pwm6_0" "pwm" 62
"pwm7" "pwm" 70
"pwm7_0" "pwm" 4
"dfd" "dfd" 0, 1, 2, 3, 4
"xfi_phy0_i2c0" "i2c" 0, 1
"xfi_phy1_i2c0" "i2c" 0, 1
"xfi_phy_pll_i2c0" "i2c" 3, 4
"xfi_phy_pll_i2c1" "i2c" 3, 4
"i2c0_0" "i2c" 5, 6
"i2c1_sfp" "i2c" 5, 6
"xfi_pextp_phy0_i2c" "i2c" 5, 6
"xfi_pextp_phy1_i2c" "i2c" 5, 6
"i2c0_1" "i2c" 15, 16
"u30_phy_i2c0" "i2c" 15, 16
"u32_phy_i2c0" "i2c" 15, 16
"xfi_phy0_i2c1" "i2c" 15, 16
"xfi_phy1_i2c1" "i2c" 15, 16
"xfi_phy_pll_i2c2" "i2c" 15, 16
"i2c1_0" "i2c" 17, 18
"u30_phy_i2c1" "i2c" 17, 18
"u32_phy_i2c1" "i2c" 17, 18
"xfi_phy_pll_i2c3" "i2c" 17, 18
"sgmii0_i2c" "i2c" 17, 18
"sgmii1_i2c" "i2c" 17, 18
"i2c1_2" "i2c" 69, 70
"i2c2_0" "i2c" 69, 70
"i2c2_1" "i2c" 71, 72
"mdc_mdio0" "eth" 5, 6
"2p5g_ext_mdio" "eth" 28, 29
"gbe_ext_mdio" "eth" 30, 31
"mdc_mdio1" "eth" 69, 70
"pcie_wake_n0_0" "pcie" 7
"pcie_clk_req_n0_0" "pcie" 8
"pcie_wake_n3_0" "pcie" 9
"pcie_clk_req_n3" "pcie" 10
"pcie_clk_req_n0_1" "pcie" 10
"pcie_p0_phy_i2c" "pcie" 7, 8
"pcie_p1_phy_i2c" "pcie" 7, 8
"pcie_p3_phy_i2c" "pcie" 9, 10
"pcie_p2_phy_i2c" "pcie" 7, 8
"ckm_phy_i2c" "pcie" 9, 10
"pcie_wake_n0_1" "pcie" 13
"pcie_wake_n3_1" "pcie" 14
"pcie_2l_0_pereset" "pcie" 19
"pcie_1l_1_pereset" "pcie" 20
"pcie_clk_req_n2_1" "pcie" 63
"pcie_2l_1_pereset" "pcie" 73
"pcie_1l_0_pereset" "pcie" 74
"pcie_wake_n1_0" "pcie" 75
"pcie_clk_req_n1" "pcie" 76
"pcie_wake_n2_0" "pcie" 77
"pcie_clk_req_n2_0" "pcie" 78
"pcie_wake_n2_1" "pcie" 79
"pmic" "pmic" 11
"watchdog" "watchdog" 12
"spi0_wp_hold" "spi" 22, 23
"spi0" "spi" 24, 25, 26, 27
"spi1" "spi" 28, 29, 30, 31
"spi2" "spi" 32, 33, 34, 35
"spi2_wp_hold" "spi" 36, 37
"snfi" "flash" 22, 23, 24, 25, 26, 27
"emmc_45" "flash" 21, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37
"sdcard" "flash" 32, 33, 34, 35, 36, 37
"emmc_51" "flash" 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49
"uart2" "uart" 0, 1, 2, 3
"tops_uart0_0" "uart" 22, 23
"uart2_0" "uart" 28, 29, 30, 31
"uart1_0" "uart" 32, 33, 34, 35
"uart2_1" "uart" 32, 33, 34, 35
"net_wo0_uart_txd_0" "uart" 28
"net_wo1_uart_txd_0" "uart" 29
"net_wo2_uart_txd_0" "uart" 30
"tops_uart1_0" "uart" 28, 29
"tops_uart0_1" "uart" 30, 31
"tops_uart1_1" "uart" 36, 37
"uart0" "uart" 55, 56
"tops_uart0_2" "uart" 55, 56
"uart2_2" "uart" 50, 51, 52, 53
"uart1_1" "uart" 58, 59, 60, 61
"uart2_3" "uart" 58, 59, 60, 61
"uart1_2" "uart" 80, 81, 82, 83
"uart1_2_lite" "uart" 80, 81
"tops_uart1_2" "uart" 80, 81
"net_wo0_uart_txd_1" "uart" 80
"net_wo1_uart_txd_1" "uart" 81
"net_wo2_uart_txd_1" "uart" 82
"udi" "udi" 32, 33, 34, 35, 36
"i2s" "audio" 50, 51, 52, 53, 54
"pcm" "audio" 50, 51, 52, 53
"gbe0_led1" "led" 58
"gbe1_led1" "led" 59
"gbe2_led1" "led" 60
"gbe3_led1" "led" 61
"2p5gbe_led1" "led" 62
"gbe0_led0" "led" 64
"gbe1_led0" "led" 65
"gbe2_led0" "led" 66
"gbe3_led0" "led" 67
"2p5gbe_led0" "led" 68
"drv_vbus_p1" "usb" 63
"drv_vbus" "usb" 79
properties:
function:
description:
A string containing the name of the function to mux to the group.
enum: [audio, dfd, eth, flash, i2c, int_usxgmii, jtag, led, pcie, pmic, pwm, spi,
uart, udi, usb, watchdog]
groups:
description:
An array of strings. Each string contains the name of a group.
required:
- function
- groups
allOf:
- if:
properties:
function:
const: audio
then:
properties:
groups:
enum: [i2s, pcm]
- if:
properties:
function:
const: jtag
then:
properties:
groups:
enum: [jtag, tops_jtag0_0, tops_jtag0_1, wo0_jtag, wo1_jtag, wo2_jtag]
- if:
properties:
function:
const: int_usxgmii
then:
properties:
groups:
const: int_usxgmii
- if:
properties:
function:
const: dfd
then:
properties:
groups:
const: dfd
- if:
properties:
function:
const: flash
then:
properties:
groups:
enum: [emmc_45, emmc_51, sdcard, snfi]
- if:
properties:
function:
const: eth
then:
properties:
groups:
enum: [2p5g_ext_mdio, gbe_ext_mdio, mdc_mdio0, mdc_mdio1]
- if:
properties:
function:
const: i2c
then:
properties:
groups:
enum: [xfi_phy0_i2c0, xfi_phy1_i2c0, xfi_phy_pll_i2c0,
xfi_phy_pll_i2c1, i2c0_0, i2c1_sfp, xfi_pextp_phy0_i2c,
xfi_pextp_phy1_i2c, i2c0_1, u30_phy_i2c0, u32_phy_i2c0,
xfi_phy0_i2c1, xfi_phy1_i2c1, xfi_phy_pll_i2c2, i2c1_0,
u30_phy_i2c1, u32_phy_i2c1, xfi_phy_pll_i2c3, sgmii0_i2c,
sgmii1_i2c, i2c1_2, i2c2_0, i2c2_1]
- if:
properties:
function:
const: led
then:
properties:
groups:
enum: [2p5gbe_led0, 2p5gbe_led1, gbe0_led0, gbe0_led1, gbe1_led0, gbe1_led1,
gbe2_led0, gbe2_led1, gbe3_led0, gbe3_led1, wf5g_led0, wf5g_led1]
- if:
properties:
function:
const: pcie
then:
properties:
groups:
items:
enum: [pcie_wake_n0_0, pcie_clk_req_n0_0, pcie_wake_n3_0,
pcie_clk_req_n3, pcie_p0_phy_i2c, pcie_p1_phy_i2c,
pcie_p3_phy_i2c, pcie_p2_phy_i2c, ckm_phy_i2c,
pcie_wake_n0_1, pcie_wake_n3_1, pcie_2l_0_pereset,
pcie_1l_1_pereset, pcie_clk_req_n2_1, pcie_2l_1_pereset,
pcie_1l_0_pereset, pcie_wake_n1_0, pcie_clk_req_n1,
pcie_wake_n2_0, pcie_clk_req_n2_0, pcie_wake_n2_1,
pcie_clk_req_n0_1]
maxItems: 3
- if:
properties:
function:
const: pmic
then:
properties:
groups:
const: pmic
- if:
properties:
function:
const: pwm
then:
properties:
groups:
items:
enum: [pwm0, pwm1, pwm2, pwm2_0, pwm3, pwm3_0, pwm4, pwm4_0, pwm5, pwm5_0,
pwm6, pwm6_0, pwm7, pwm7_0]
maxItems: 2
- if:
properties:
function:
const: spi
then:
properties:
groups:
items:
enum: [spi0, spi0_wp_hold, spi1, spi2, spi2_wp_hold]
maxItems: 2
- if:
properties:
function:
const: uart
then:
properties:
groups:
items:
enum: [net_wo0_uart_txd_0, net_wo0_uart_txd_1, net_wo1_uart_txd_0,
net_wo1_uart_txd_1, net_wo2_uart_txd_0, net_wo2_uart_txd_1,
tops_uart0_0, tops_uart0_1, tops_uart0_2, tops_uart1_0,
tops_uart1_1, tops_uart1_2, uart0, uart1_0, uart1_1, uart1_2,
uart1_2_lite, uart2, uart2_0, uart2_1, uart2_3]
maxItems: 2
- if:
properties:
function:
const: watchdog
then:
properties:
groups:
const: watchdog
- if:
properties:
function:
const: udi
then:
properties:
groups:
const: udi
- if:
properties:
function:
const: usb
then:
properties:
groups:
items:
enum: [drv_vbus, drv_vbus_p1]
maxItems: 1
patternProperties:
'^conf(-[-a-z]*)?$':
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.
items:
enum: [UART2_RXD, UART2_TXD, UART2_CTS, UART2_RTS, GPIO_A, SMI_0_MDC,
SMI_0_MDIO, PCIE30_2L_0_WAKE_N, PCIE30_2L_0_CLKREQ_N,
PCIE30_1L_1_WAKE_N, PCIE30_1L_1_CLKREQ_N, GPIO_P, WATCHDOG,
GPIO_RESET, GPIO_WPS, PMIC_I2C_SCL, PMIC_I2C_SDA, I2C_1_SCL,
I2C_1_SDA, PCIE30_2L_0_PRESET_N, PCIE30_1L_1_PRESET_N, PWMD1,
SPI0_WP, SPI0_HOLD, SPI0_CSB, SPI0_MISO, SPI0_MOSI, SPI0_CLK,
SPI1_CSB, SPI1_MISO, SPI1_MOSI, SPI1_CLK, SPI2_CLK, SPI2_MOSI,
SPI2_MISO, SPI2_CSB, SPI2_HOLD, SPI2_WP, EMMC_RSTB, EMMC_DSL,
EMMC_CK, EMMC_CMD, EMMC_DATA_7, EMMC_DATA_6, EMMC_DATA_5,
EMMC_DATA_4, EMMC_DATA_3, EMMC_DATA_2, EMMC_DATA_1,
EMMC_DATA_0, PCM_FS_I2S_LRCK, PCM_CLK_I2S_BCLK,
PCM_DRX_I2S_DIN, PCM_DTX_I2S_DOUT, PCM_MCK_I2S_MCLK,
UART0_RXD, UART0_TXD, PWMD0, JTAG_JTDI, JTAG_JTDO, JTAG_JTMS,
JTAG_JTCLK, JTAG_JTRST_N, USB_DRV_VBUS_P1, LED_A, LED_B, LED_C,
LED_D, LED_E, GPIO_B, GPIO_C, I2C_2_SCL, I2C_2_SDA,
PCIE30_2L_1_PRESET_N, PCIE30_1L_0_PRESET_N,
PCIE30_2L_1_WAKE_N, PCIE30_2L_1_CLKREQ_N,
PCIE30_1L_0_WAKE_N, PCIE30_1L_0_CLKREQ_N, USB_DRV_VBUS_P0,
UART1_RXD, UART1_TXD, UART1_CTS, UART1_RTS]
maxItems: 84
bias-disable: true
bias-pull-up:
oneOf:
- type: boolean
description: normal pull up.
- enum: [100, 101, 102, 103]
description:
PUPD/R1/R0 pull down type. See MTK_PUPD_SET_R1R0 defines in
dt-bindings/pinctrl/mt65xx.h.
bias-pull-down:
oneOf:
- type: boolean
description: normal pull down.
- enum: [100, 101, 102, 103]
description:
PUPD/R1/R0 pull down type. See MTK_PUPD_SET_R1R0 defines in
dt-bindings/pinctrl/mt65xx.h.
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 settings 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 settings 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>
#include <dt-bindings/pinctrl/mt65xx.h>
soc {
#address-cells = <2>;
#size-cells = <2>;
pio: pinctrl@1001f000 {
compatible = "mediatek,mt7988-pinctrl";
reg = <0 0x1001f000 0 0x1000>,
<0 0x11c10000 0 0x1000>,
<0 0x11d00000 0 0x1000>,
<0 0x11d20000 0 0x1000>,
<0 0x11e00000 0 0x1000>,
<0 0x11f00000 0 0x1000>,
<0 0x1000b000 0 0x1000>;
reg-names = "gpio", "iocfg_tr",
"iocfg_br", "iocfg_rb",
"iocfg_lb", "iocfg_tl", "eint";
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&pio 0 0 84>;
interrupt-controller;
interrupts = <GIC_SPI 225 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&gic>;
#interrupt-cells = <2>;
i2c0_pins: i2c0-g0-pins {
mux {
function = "i2c";
groups = "i2c0_1";
};
};
mdio0_pins: mdio0-pins {
mux {
function = "eth";
groups = "mdc_mdio0";
};
conf {
pins = "SMI_0_MDC", "SMI_0_MDIO";
drive-strength = <8>;
};
};
mmc0_pins_emmc_51: mmc0-emmc-51-pins {
mux {
function = "flash";
groups = "emmc_51";
};
};
mmc0_pins_sdcard: mmc0-sdcard-pins {
mux {
function = "flash";
groups = "sdcard";
};
};
pcie0_pins: pcie0-pins {
mux {
function = "pcie";
groups = "pcie_2l_0_pereset", "pcie_clk_req_n0_0",
"pcie_wake_n0_0";
};
};
pcie1_pins: pcie1-pins {
mux {
function = "pcie";
groups = "pcie_2l_1_pereset", "pcie_clk_req_n1",
"pcie_wake_n1_0";
};
};
pcie2_pins: pcie2-pins {
mux {
function = "pcie";
groups = "pcie_1l_0_pereset", "pcie_clk_req_n2_0",
"pcie_wake_n2_0";
};
};
pcie3_pins: pcie3-pins {
mux {
function = "pcie";
groups = "pcie_1l_1_pereset", "pcie_clk_req_n3",
"pcie_wake_n3_0";
};
};
uart0_pins: uart0-pins {
mux {
function = "uart";
groups = "uart0";
};
};
};
};

View file

@ -79,8 +79,8 @@ $defs:
qdss_cti_trig_out_b0, qdss_cti_trig_in_b1, qdss_cti_trig_out_b1, qdss_cti_trig_out_b0, qdss_cti_trig_in_b1, qdss_cti_trig_out_b1,
qdss_traceclk_a, qdss_tracectl_a, qdss_tracedata_a, qspi_clk, qdss_traceclk_a, qdss_tracectl_a, qdss_tracedata_a, qspi_clk,
qspi_cs, qspi_data, resout, rx0, rx1, rx2, sdc_clk, sdc_cmd, qspi_cs, qspi_data, resout, rx0, rx1, rx2, sdc_clk, sdc_cmd,
sdc_data, spi0, spi1, spi10, spi11, tsens_max, uart0, uart1, sdc_data, spi0_cs, spi0_clk, spi0_miso, spi0_mosi, spi1, spi10,
wci_txd, wci_rxd, wsi_clk, wsi_data ] spi11, tsens_max, uart0, uart1, wci_txd, wci_rxd, wsi_clk, wsi_data ]
required: required:
- pins - pins

View file

@ -0,0 +1,160 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/qcom,msm8917-pinctrl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Qualcomm MSM8917 TLMM pin controller
maintainers:
- Barnabas Czeman <barnabas.czeman@mainlining.org>
description:
Top Level Mode Multiplexer pin controller in Qualcomm MSM8917 SoC.
properties:
compatible:
const: qcom,msm8917-pinctrl
reg:
maxItems: 1
interrupts:
maxItems: 1
gpio-reserved-ranges:
minItems: 1
maxItems: 66
gpio-line-names:
maxItems: 134
patternProperties:
"-state$":
oneOf:
- $ref: "#/$defs/qcom-msm8917-tlmm-state"
- patternProperties:
"-pins$":
$ref: "#/$defs/qcom-msm8917-tlmm-state"
additionalProperties: false
$defs:
qcom-msm8917-tlmm-state:
type: object
description:
Pinctrl node's client devices use subnodes for desired pin configuration.
Client device subnodes use below standard properties.
$ref: qcom,tlmm-common.yaml#/$defs/qcom-tlmm-state
unevaluatedProperties: false
properties:
pins:
description:
List of gpio pins affected by the properties specified in this
subnode.
items:
oneOf:
- pattern: "^gpio([0-9]|[1-9][0-9]|1[0-2][0-9]|13[0-3])$"
- enum: [ sdc1_clk, sdc1_cmd, sdc1_data, sdc1_rclk, sdc2_clk,
sdc2_cmd, sdc2_data, qdsd_clk, qdsd_cmd, qdsd_data0,
qdsd_data1, qdsd_data2, qdsd_data3 ]
minItems: 1
maxItems: 16
function:
description:
Specify the alternative function to be configured for the specified
pins.
enum: [ accel_int, adsp_ext, alsp_int, atest_bbrx0, atest_bbrx1,
atest_char, atest_char0, atest_char1, atest_char2,
atest_char3, atest_combodac_to_gpio_native,
atest_gpsadc_dtest0_native, atest_gpsadc_dtest1_native,
atest_tsens, atest_wlan0, atest_wlan1, audio_ref,
audio_reset, bimc_dte0, bimc_dte1, blsp6_spi, blsp8_spi,
blsp_i2c1, blsp_i2c2, blsp_i2c3, blsp_i2c4, blsp_i2c5,
blsp_i2c6, blsp_i2c7, blsp_i2c8, blsp_spi1, blsp_spi2,
blsp_spi3, blsp_spi4, blsp_spi5, blsp_spi6, blsp_spi7,
blsp_spi8, blsp_uart1, blsp_uart2, blsp_uart3, blsp_uart4,
blsp_uart5, blsp_uart6, blsp_uart7, blsp_uart8, cam0_ldo,
cam1_rst, cam1_standby, cam2_rst, cam2_standby, cam_mclk,
cci_async, cci_i2c, cci_timer0, cci_timer1, cdc_pdm0,
codec_int1, codec_int2, codec_mad, coex_uart, cri_trng,
cri_trng0, cri_trng1, dbg_out, dmic0_clk, dmic0_data,
ebi_cdc, ebi_ch0, ext_lpass, forced_usb, fp_gpio, fp_int,
gcc_gp1_clk_a, gcc_gp1_clk_b, gcc_gp2_clk_a, gcc_gp2_clk_b,
gcc_gp3_clk_a, gcc_gp3_clk_b, gcc_plltest, gcc_tlmm, gpio,
gsm0_tx, key_focus, key_snapshot, key_volp, ldo_en,
ldo_update, lpass_slimbus, lpass_slimbus0, lpass_slimbus1,
m_voc, mag_int, mdp_vsync, mipi_dsi0, modem_tsync, nav_pps,
nav_pps_in_a, nav_pps_in_b, nav_tsync, nfc_pwr, ov_ldo,
pa_indicator, pbs0, pbs1, pbs2, pri_mi2s, pri_mi2s_mclk_a,
pri_mi2s_mclk_b, pri_mi2s_ws, prng_rosc,
pwr_crypto_enabled_a, pwr_crypto_enabled_b,
pwr_modem_enabled_a, pwr_modem_enabled_b, pwr_nav_enabled_a,
pwr_nav_enabled_b, qdss_cti_trig_in_a0, qdss_cti_trig_in_a1,
qdss_cti_trig_in_b0, qdss_cti_trig_in_b1,
qdss_cti_trig_out_a0, qdss_cti_trig_out_a1,
qdss_cti_trig_out_b0, qdss_cti_trig_out_b1, qdss_traceclk_a,
qdss_traceclk_b, qdss_tracectl_a, qdss_tracectl_b,
qdss_tracedata_a, qdss_tracedata_b, sd_write, sdcard_det,
sec_mi2s, sec_mi2s_mclk_a, sec_mi2s_mclk_b, sensor_rst,
smb_int, ssbi_wtr1, ts_resout, ts_sample, uim1_clk,
uim1_data, uim1_present, uim1_reset, uim2_clk, uim2_data,
uim2_present, uim2_reset, uim_batt, us_emitter, us_euro,
wcss_bt, wcss_fm, wcss_wlan, wcss_wlan0, wcss_wlan1,
wcss_wlan2, webcam_rst, webcam_standby, wsa_io, wsa_irq ]
required:
- pins
allOf:
- $ref: /schemas/pinctrl/qcom,tlmm-common.yaml#
required:
- compatible
- reg
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
tlmm: pinctrl@1000000 {
compatible = "qcom,msm8917-pinctrl";
reg = <0x01000000 0x300000>;
interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
gpio-ranges = <&tlmm 0 0 134>;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
blsp1-uart2-sleep-state {
pins = "gpio4", "gpio5";
function = "gpio";
drive-strength = <2>;
bias-pull-down;
};
spi1-default-state {
spi-pins {
pins = "gpio0", "gpio1", "gpio3";
function = "blsp_spi1";
drive-strength = <12>;
bias-disable;
};
cs-pins {
pins = "gpio2";
function = "gpio";
drive-strength = <16>;
bias-disable;
output-high;
};
};
};

View file

@ -159,30 +159,30 @@ additionalProperties: false
examples: examples:
- | - |
pinctrl@4e000 { pinctrl@4e000 {
compatible = "realtek,rtd1315e-pinctrl"; compatible = "realtek,rtd1315e-pinctrl";
reg = <0x4e000 0x130>; reg = <0x4e000 0x130>;
emmc-hs200-pins { emmc-hs200-pins {
pins = "emmc_clk", pins = "emmc_clk",
"emmc_cmd", "emmc_cmd",
"emmc_data_0", "emmc_data_0",
"emmc_data_1", "emmc_data_1",
"emmc_data_2", "emmc_data_2",
"emmc_data_3", "emmc_data_3",
"emmc_data_4", "emmc_data_4",
"emmc_data_5", "emmc_data_5",
"emmc_data_6", "emmc_data_6",
"emmc_data_7"; "emmc_data_7";
function = "emmc"; function = "emmc";
realtek,drive-strength-p = <0x2>; realtek,drive-strength-p = <0x2>;
realtek,drive-strength-n = <0x2>; realtek,drive-strength-n = <0x2>;
}; };
i2c-0-pins { i2c-0-pins {
pins = "gpio_12", pins = "gpio_12",
"gpio_13"; "gpio_13";
function = "i2c0"; function = "i2c0";
drive-strength = <4>; drive-strength = <4>;
}; };
}; };

View file

@ -158,30 +158,30 @@ additionalProperties: false
examples: examples:
- | - |
pinctrl@4e000 { pinctrl@4e000 {
compatible = "realtek,rtd1319d-pinctrl"; compatible = "realtek,rtd1319d-pinctrl";
reg = <0x4e000 0x130>; reg = <0x4e000 0x130>;
emmc-hs200-pins { emmc-hs200-pins {
pins = "emmc_clk", pins = "emmc_clk",
"emmc_cmd", "emmc_cmd",
"emmc_data_0", "emmc_data_0",
"emmc_data_1", "emmc_data_1",
"emmc_data_2", "emmc_data_2",
"emmc_data_3", "emmc_data_3",
"emmc_data_4", "emmc_data_4",
"emmc_data_5", "emmc_data_5",
"emmc_data_6", "emmc_data_6",
"emmc_data_7"; "emmc_data_7";
function = "emmc"; function = "emmc";
realtek,drive-strength-p = <0x2>; realtek,drive-strength-p = <0x2>;
realtek,drive-strength-n = <0x2>; realtek,drive-strength-n = <0x2>;
}; };
i2c-0-pins { i2c-0-pins {
pins = "gpio_12", pins = "gpio_12",
"gpio_13"; "gpio_13";
function = "i2c0"; function = "i2c0";
drive-strength = <4>; drive-strength = <4>;
}; };
}; };

View file

@ -157,30 +157,30 @@ additionalProperties: false
examples: examples:
- | - |
pinctrl@4e000 { pinctrl@4e000 {
compatible = "realtek,rtd1619b-pinctrl"; compatible = "realtek,rtd1619b-pinctrl";
reg = <0x4e000 0x130>; reg = <0x4e000 0x130>;
emmc-hs200-pins { emmc-hs200-pins {
pins = "emmc_clk", pins = "emmc_clk",
"emmc_cmd", "emmc_cmd",
"emmc_data_0", "emmc_data_0",
"emmc_data_1", "emmc_data_1",
"emmc_data_2", "emmc_data_2",
"emmc_data_3", "emmc_data_3",
"emmc_data_4", "emmc_data_4",
"emmc_data_5", "emmc_data_5",
"emmc_data_6", "emmc_data_6",
"emmc_data_7"; "emmc_data_7";
function = "emmc"; function = "emmc";
realtek,drive-strength-p = <0x2>; realtek,drive-strength-p = <0x2>;
realtek,drive-strength-n = <0x2>; realtek,drive-strength-n = <0x2>;
}; };
i2c-0-pins { i2c-0-pins {
pins = "gpio_12", pins = "gpio_12",
"gpio_13"; "gpio_13";
function = "i2c0"; function = "i2c0";
drive-strength = <4>; drive-strength = <4>;
}; };
}; };

View file

@ -26,6 +26,7 @@ properties:
- renesas,r9a07g043-pinctrl # RZ/G2UL{Type-1,Type-2} and RZ/Five - renesas,r9a07g043-pinctrl # RZ/G2UL{Type-1,Type-2} and RZ/Five
- renesas,r9a07g044-pinctrl # RZ/G2{L,LC} - renesas,r9a07g044-pinctrl # RZ/G2{L,LC}
- renesas,r9a08g045-pinctrl # RZ/G3S - renesas,r9a08g045-pinctrl # RZ/G3S
- renesas,r9a09g047-pinctrl # RZ/G3E
- renesas,r9a09g057-pinctrl # RZ/V2H(P) - renesas,r9a09g057-pinctrl # RZ/V2H(P)
- items: - items:
@ -125,7 +126,7 @@ additionalProperties:
drive-push-pull: true drive-push-pull: true
renesas,output-impedance: renesas,output-impedance:
description: description:
Output impedance for pins on the RZ/V2H(P) SoC. The value provided by this Output impedance for pins on the RZ/{G3E,V2H(P)} SoC. The value provided by this
property corresponds to register bit values that can be set in the PFC_IOLH_mn property corresponds to register bit values that can be set in the PFC_IOLH_mn
register, which adjusts the drive strength value and is pin-dependent. register, which adjusts the drive strength value and is pin-dependent.
$ref: /schemas/types.yaml#/definitions/uint32 $ref: /schemas/types.yaml#/definitions/uint32
@ -142,7 +143,9 @@ allOf:
properties: properties:
compatible: compatible:
contains: contains:
const: renesas,r9a09g057-pinctrl enum:
- renesas,r9a09g047-pinctrl
- renesas,r9a09g057-pinctrl
then: then:
properties: properties:
resets: resets:

View file

@ -44,6 +44,7 @@ properties:
- rockchip,rk3328-pinctrl - rockchip,rk3328-pinctrl
- rockchip,rk3368-pinctrl - rockchip,rk3368-pinctrl
- rockchip,rk3399-pinctrl - rockchip,rk3399-pinctrl
- rockchip,rk3562-pinctrl
- rockchip,rk3568-pinctrl - rockchip,rk3568-pinctrl
- rockchip,rk3576-pinctrl - rockchip,rk3576-pinctrl
- rockchip,rk3588-pinctrl - rockchip,rk3588-pinctrl

View file

@ -180,38 +180,31 @@ additionalProperties: false
examples: examples:
- | - |
#include <dt-bindings/pinctrl/pinctrl-zynq.h> #include <dt-bindings/pinctrl/pinctrl-zynq.h>
pinctrl0: pinctrl@700 { pinctrl@700 {
compatible = "xlnx,pinctrl-zynq"; compatible = "xlnx,pinctrl-zynq";
reg = <0x700 0x200>; reg = <0x700 0x200>;
syscon = <&slcr>; syscon = <&slcr>;
pinctrl_uart1_default: uart1-default { uart1-default {
mux { mux {
groups = "uart1_10_grp"; groups = "uart1_10_grp";
function = "uart1"; function = "uart1";
}; };
conf { conf {
groups = "uart1_10_grp"; groups = "uart1_10_grp";
slew-rate = <0>; slew-rate = <0>;
power-source = <IO_STANDARD_LVCMOS18>; power-source = <IO_STANDARD_LVCMOS18>;
}; };
conf-rx { conf-rx {
pins = "MIO49"; pins = "MIO49";
bias-high-impedance; bias-high-impedance;
}; };
conf-tx { conf-tx {
pins = "MIO48"; pins = "MIO48";
bias-disable; bias-disable;
}; };
}; };
}; };
uart1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart1_default>;
};
...

View file

@ -21,6 +21,7 @@
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include "../pinctrl-utils.h" #include "../pinctrl-utils.h"
@ -254,7 +255,7 @@ static int nsp_gpio_irq_set_type(struct irq_data *d, unsigned int type)
raw_spin_unlock_irqrestore(&chip->lock, flags); raw_spin_unlock_irqrestore(&chip->lock, flags);
dev_dbg(chip->dev, "gpio:%u level_low:%s falling:%s\n", gpio, dev_dbg(chip->dev, "gpio:%u level_low:%s falling:%s\n", gpio,
level_low ? "true" : "false", falling ? "true" : "false"); str_true_false(level_low), str_true_false(falling));
return 0; return 0;
} }

View file

@ -15,6 +15,7 @@
#include <linux/of.h> #include <linux/of.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/string_choices.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
@ -1068,7 +1069,7 @@ static void lochnagar_gpio_set(struct gpio_chip *chip,
value = !!value; value = !!value;
dev_dbg(priv->dev, "Set GPIO %s to %s\n", dev_dbg(priv->dev, "Set GPIO %s to %s\n",
pin->name, value ? "high" : "low"); pin->name, str_high_low(value));
switch (pin->type) { switch (pin->type) {
case LN_PTYPE_MUX: case LN_PTYPE_MUX:

View file

@ -1256,6 +1256,20 @@ static void pinctrl_link_add(struct pinctrl_dev *pctldev,
DL_FLAG_AUTOREMOVE_CONSUMER); DL_FLAG_AUTOREMOVE_CONSUMER);
} }
static void pinctrl_cond_disable_mux_setting(struct pinctrl_state *state,
struct pinctrl_setting *target_setting)
{
struct pinctrl_setting *setting;
list_for_each_entry(setting, &state->settings, node) {
if (target_setting && (&setting->node == &target_setting->node))
break;
if (setting->type == PIN_MAP_TYPE_MUX_GROUP)
pinmux_disable_setting(setting);
}
}
/** /**
* pinctrl_commit_state() - select/activate/program a pinctrl state to HW * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
* @p: the pinctrl handle for the device that requests configuration * @p: the pinctrl handle for the device that requests configuration
@ -1263,7 +1277,7 @@ static void pinctrl_link_add(struct pinctrl_dev *pctldev,
*/ */
static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state) static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
{ {
struct pinctrl_setting *setting, *setting2; struct pinctrl_setting *setting;
struct pinctrl_state *old_state = READ_ONCE(p->state); struct pinctrl_state *old_state = READ_ONCE(p->state);
int ret; int ret;
@ -1274,11 +1288,7 @@ static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
* still owned by the new state will be re-acquired by the call * still owned by the new state will be re-acquired by the call
* to pinmux_enable_setting() in the loop below. * to pinmux_enable_setting() in the loop below.
*/ */
list_for_each_entry(setting, &old_state->settings, node) { pinctrl_cond_disable_mux_setting(old_state, NULL);
if (setting->type != PIN_MAP_TYPE_MUX_GROUP)
continue;
pinmux_disable_setting(setting);
}
} }
p->state = NULL; p->state = NULL;
@ -1322,7 +1332,7 @@ static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
} }
if (ret < 0) { if (ret < 0) {
goto unapply_new_state; goto unapply_mux_setting;
} }
/* Do not link hogs (circular dependency) */ /* Do not link hogs (circular dependency) */
@ -1334,23 +1344,23 @@ static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
return 0; return 0;
unapply_mux_setting:
pinctrl_cond_disable_mux_setting(state, NULL);
goto restore_old_state;
unapply_new_state: unapply_new_state:
dev_err(p->dev, "Error applying setting, reverse things back\n"); dev_err(p->dev, "Error applying setting, reverse things back\n");
list_for_each_entry(setting2, &state->settings, node) { /*
if (&setting2->node == &setting->node) * All we can do here is pinmux_disable_setting.
break; * That means that some pins are muxed differently now
/* * than they were before applying the setting (We can't
* All we can do here is pinmux_disable_setting. * "unmux a pin"!), but it's not a big deal since the pins
* That means that some pins are muxed differently now * are free to be muxed by another apply_setting.
* than they were before applying the setting (We can't */
* "unmux a pin"!), but it's not a big deal since the pins pinctrl_cond_disable_mux_setting(state, setting);
* are free to be muxed by another apply_setting.
*/
if (setting2->type == PIN_MAP_TYPE_MUX_GROUP)
pinmux_disable_setting(setting2);
}
restore_old_state:
/* There's no infinite recursive loop here because p->state is NULL */ /* There's no infinite recursive loop here because p->state is NULL */
if (old_state) if (old_state)
pinctrl_select_state(p, old_state); pinctrl_select_state(p, old_state);

View file

@ -202,6 +202,13 @@ config PINCTRL_MT7986
default ARM64 && ARCH_MEDIATEK default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_MOORE select PINCTRL_MTK_MOORE
config PINCTRL_MT7988
bool "Mediatek MT7988 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_MOORE
config PINCTRL_MT8167 config PINCTRL_MT8167
bool "MediaTek MT8167 pin control" bool "MediaTek MT8167 pin control"
depends on OF depends on OF

View file

@ -28,6 +28,7 @@ obj-$(CONFIG_PINCTRL_MT7623) += pinctrl-mt7623.o
obj-$(CONFIG_PINCTRL_MT7629) += pinctrl-mt7629.o obj-$(CONFIG_PINCTRL_MT7629) += pinctrl-mt7629.o
obj-$(CONFIG_PINCTRL_MT7981) += pinctrl-mt7981.o obj-$(CONFIG_PINCTRL_MT7981) += pinctrl-mt7981.o
obj-$(CONFIG_PINCTRL_MT7986) += pinctrl-mt7986.o obj-$(CONFIG_PINCTRL_MT7986) += pinctrl-mt7986.o
obj-$(CONFIG_PINCTRL_MT7988) += pinctrl-mt7988.o
obj-$(CONFIG_PINCTRL_MT8167) += pinctrl-mt8167.o obj-$(CONFIG_PINCTRL_MT8167) += pinctrl-mt8167.o
obj-$(CONFIG_PINCTRL_MT8173) += pinctrl-mt8173.o obj-$(CONFIG_PINCTRL_MT8173) += pinctrl-mt8173.o
obj-$(CONFIG_PINCTRL_MT8183) += pinctrl-mt8183.o obj-$(CONFIG_PINCTRL_MT8183) += pinctrl-mt8183.o

File diff suppressed because it is too large Load diff

View file

@ -573,7 +573,7 @@ EXPORT_SYMBOL_GPL(mtk_pinconf_bias_get_rev1);
*/ */
static int mtk_pinconf_bias_set_pu_pd(struct mtk_pinctrl *hw, static int mtk_pinconf_bias_set_pu_pd(struct mtk_pinctrl *hw,
const struct mtk_pin_desc *desc, const struct mtk_pin_desc *desc,
u32 pullup, u32 arg) u32 pullup, u32 arg, bool pd_only)
{ {
int err, pu, pd; int err, pu, pd;
@ -587,18 +587,16 @@ static int mtk_pinconf_bias_set_pu_pd(struct mtk_pinctrl *hw,
pu = 0; pu = 0;
pd = 1; pd = 1;
} else { } else {
err = -EINVAL; return -EINVAL;
goto out;
} }
err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PU, pu); if (!pd_only) {
if (err) err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PU, pu);
goto out; if (err)
return err;
}
err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PD, pd); return mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_PD, pd);
out:
return err;
} }
static int mtk_pinconf_bias_set_pullsel_pullen(struct mtk_pinctrl *hw, static int mtk_pinconf_bias_set_pullsel_pullen(struct mtk_pinctrl *hw,
@ -737,7 +735,7 @@ static int mtk_pinconf_bias_set_pu_pd_rsel(struct mtk_pinctrl *hw,
return err; return err;
} }
return mtk_pinconf_bias_set_pu_pd(hw, desc, pullup, enable); return mtk_pinconf_bias_set_pu_pd(hw, desc, pullup, enable, false);
} }
int mtk_pinconf_bias_set_combo(struct mtk_pinctrl *hw, int mtk_pinconf_bias_set_combo(struct mtk_pinctrl *hw,
@ -758,8 +756,14 @@ int mtk_pinconf_bias_set_combo(struct mtk_pinctrl *hw,
return 0; return 0;
} }
if (try_all_type & MTK_PULL_PD_TYPE) {
err = mtk_pinconf_bias_set_pu_pd(hw, desc, pullup, arg, true);
if (!err)
return err;
}
if (try_all_type & MTK_PULL_PU_PD_TYPE) { if (try_all_type & MTK_PULL_PU_PD_TYPE) {
err = mtk_pinconf_bias_set_pu_pd(hw, desc, pullup, arg); err = mtk_pinconf_bias_set_pu_pd(hw, desc, pullup, arg, false);
if (!err) if (!err)
return 0; return 0;
} }
@ -878,6 +882,29 @@ out:
return err; return err;
} }
static int mtk_pinconf_bias_get_pd(struct mtk_pinctrl *hw,
const struct mtk_pin_desc *desc,
u32 *pullup, u32 *enable)
{
int err, pd;
err = mtk_hw_get_value(hw, desc, PINCTRL_PIN_REG_PD, &pd);
if (err)
goto out;
if (pd == 0) {
*pullup = 0;
*enable = MTK_DISABLE;
} else if (pd == 1) {
*pullup = 0;
*enable = MTK_ENABLE;
} else
err = -EINVAL;
out:
return err;
}
static int mtk_pinconf_bias_get_pullsel_pullen(struct mtk_pinctrl *hw, static int mtk_pinconf_bias_get_pullsel_pullen(struct mtk_pinctrl *hw,
const struct mtk_pin_desc *desc, const struct mtk_pin_desc *desc,
u32 *pullup, u32 *enable) u32 *pullup, u32 *enable)
@ -947,6 +974,12 @@ int mtk_pinconf_bias_get_combo(struct mtk_pinctrl *hw,
return 0; return 0;
} }
if (try_all_type & MTK_PULL_PD_TYPE) {
err = mtk_pinconf_bias_get_pd(hw, desc, pullup, enable);
if (!err)
return err;
}
if (try_all_type & MTK_PULL_PU_PD_TYPE) { if (try_all_type & MTK_PULL_PU_PD_TYPE) {
err = mtk_pinconf_bias_get_pu_pd(hw, desc, pullup, enable); err = mtk_pinconf_bias_get_pu_pd(hw, desc, pullup, enable);
if (!err) if (!err)

View file

@ -24,6 +24,7 @@
* turned on/off itself. But it can't be selected pull up/down * turned on/off itself. But it can't be selected pull up/down
*/ */
#define MTK_PULL_RSEL_TYPE BIT(3) #define MTK_PULL_RSEL_TYPE BIT(3)
#define MTK_PULL_PD_TYPE BIT(4)
/* MTK_PULL_PU_PD_RSEL_TYPE is a type which is controlled by /* MTK_PULL_PU_PD_RSEL_TYPE is a type which is controlled by
* MTK_PULL_PU_PD_TYPE and MTK_PULL_RSEL_TYPE. * MTK_PULL_PU_PD_TYPE and MTK_PULL_RSEL_TYPE.
*/ */

View file

@ -22,6 +22,7 @@
#include <linux/property.h> #include <linux/property.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/mfd/abx500.h> #include <linux/mfd/abx500.h>
@ -496,7 +497,7 @@ static void abx500_gpio_dbg_show_one(struct seq_file *s,
seq_printf(s, " %-9s", pull_up_down[pd]); seq_printf(s, " %-9s", pull_up_down[pd]);
} else } else
seq_printf(s, " %-9s", chip->get(chip, offset) ? "hi" : "lo"); seq_printf(s, " %-9s", str_hi_lo(chip->get(chip, offset)));
mode = abx500_get_mode(pctldev, chip, offset); mode = abx500_get_mode(pctldev, chip, offset);
@ -865,7 +866,7 @@ static int abx500_pin_config_set(struct pinctrl_dev *pctldev,
pin, configs[i], pin, configs[i],
(param == PIN_CONFIG_OUTPUT) ? "output " : "input", (param == PIN_CONFIG_OUTPUT) ? "output " : "input",
(param == PIN_CONFIG_OUTPUT) ? (param == PIN_CONFIG_OUTPUT) ?
(argument ? "high" : "low") : str_high_low(argument) :
(argument ? "pull up" : "pull down")); (argument ? "pull up" : "pull down"));
/* on ABx500, there is no GPIO0, so adjust the offset */ /* on ABx500, there is no GPIO0, so adjust the offset */

View file

@ -28,6 +28,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/string_choices.h>
#include <linux/types.h> #include <linux/types.h>
/* Since we request GPIOs from ourself */ /* Since we request GPIOs from ourself */
@ -438,9 +439,9 @@ static void nmk_prcm_altcx_set_mode(struct nmk_pinctrl *npct,
* - Any spurious wake up event during switch sequence to be ignored and * - Any spurious wake up event during switch sequence to be ignored and
* cleared * cleared
*/ */
static void nmk_gpio_glitch_slpm_init(unsigned int *slpm) static int nmk_gpio_glitch_slpm_init(unsigned int *slpm)
{ {
int i; int i, j, ret;
for (i = 0; i < NMK_MAX_BANKS; i++) { for (i = 0; i < NMK_MAX_BANKS; i++) {
struct nmk_gpio_chip *chip = nmk_gpio_chips[i]; struct nmk_gpio_chip *chip = nmk_gpio_chips[i];
@ -449,11 +450,21 @@ static void nmk_gpio_glitch_slpm_init(unsigned int *slpm)
if (!chip) if (!chip)
break; break;
clk_enable(chip->clk); ret = clk_enable(chip->clk);
if (ret) {
for (j = 0; j < i; j++) {
chip = nmk_gpio_chips[j];
clk_disable(chip->clk);
}
return ret;
}
slpm[i] = readl(chip->addr + NMK_GPIO_SLPC); slpm[i] = readl(chip->addr + NMK_GPIO_SLPC);
writel(temp, chip->addr + NMK_GPIO_SLPC); writel(temp, chip->addr + NMK_GPIO_SLPC);
} }
return 0;
} }
static void nmk_gpio_glitch_slpm_restore(unsigned int *slpm) static void nmk_gpio_glitch_slpm_restore(unsigned int *slpm)
@ -923,7 +934,9 @@ static int nmk_pmx_set(struct pinctrl_dev *pctldev, unsigned int function,
slpm[nmk_chip->bank] &= ~BIT(bit); slpm[nmk_chip->bank] &= ~BIT(bit);
} }
nmk_gpio_glitch_slpm_init(slpm); ret = nmk_gpio_glitch_slpm_init(slpm);
if (ret)
goto out_pre_slpm_init;
} }
for (i = 0; i < g->grp.npins; i++) { for (i = 0; i < g->grp.npins; i++) {
@ -940,7 +953,10 @@ static int nmk_pmx_set(struct pinctrl_dev *pctldev, unsigned int function,
dev_dbg(npct->dev, "setting pin %d to altsetting %d\n", dev_dbg(npct->dev, "setting pin %d to altsetting %d\n",
g->grp.pins[i], g->altsetting); g->grp.pins[i], g->altsetting);
clk_enable(nmk_chip->clk); ret = clk_enable(nmk_chip->clk);
if (ret)
goto out_glitch;
/* /*
* If the pin is switching to altfunc, and there was an * If the pin is switching to altfunc, and there was an
* interrupt installed on it which has been lazy disabled, * interrupt installed on it which has been lazy disabled,
@ -988,6 +1004,7 @@ static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev,
struct nmk_gpio_chip *nmk_chip; struct nmk_gpio_chip *nmk_chip;
struct gpio_chip *chip; struct gpio_chip *chip;
unsigned int bit; unsigned int bit;
int ret;
if (!range) { if (!range) {
dev_err(npct->dev, "invalid range\n"); dev_err(npct->dev, "invalid range\n");
@ -1004,7 +1021,9 @@ static int nmk_gpio_request_enable(struct pinctrl_dev *pctldev,
find_nmk_gpio_from_pin(pin, &bit); find_nmk_gpio_from_pin(pin, &bit);
clk_enable(nmk_chip->clk); ret = clk_enable(nmk_chip->clk);
if (ret)
return ret;
/* There is no glitch when converting any pin to GPIO */ /* There is no glitch when converting any pin to GPIO */
__nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO); __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);
clk_disable(nmk_chip->clk); clk_disable(nmk_chip->clk);
@ -1058,6 +1077,7 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned long cfg; unsigned long cfg;
int pull, slpm, output, val, i; int pull, slpm, output, val, i;
bool lowemi, gpiomode, sleep; bool lowemi, gpiomode, sleep;
int ret;
nmk_chip = find_nmk_gpio_from_pin(pin, &bit); nmk_chip = find_nmk_gpio_from_pin(pin, &bit);
if (!nmk_chip) { if (!nmk_chip) {
@ -1106,17 +1126,19 @@ static int nmk_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
slpm_pull ? pullnames[pull] : "same", slpm_pull ? pullnames[pull] : "same",
slpm_output ? (output ? "output" : "input") slpm_output ? (output ? "output" : "input")
: "same", : "same",
slpm_val ? (val ? "high" : "low") : "same"); slpm_val ? str_high_low(val) : "same");
} }
dev_dbg(nmk_chip->chip.parent, dev_dbg(nmk_chip->chip.parent,
"pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n", "pin %d [%#lx]: pull %s, slpm %s (%s%s), lowemi %s\n",
pin, cfg, pullnames[pull], slpmnames[slpm], pin, cfg, pullnames[pull], slpmnames[slpm],
output ? "output " : "input", output ? "output " : "input",
output ? (val ? "high" : "low") : "", output ? str_high_low(val) : "",
lowemi ? "on" : "off"); str_on_off(lowemi));
clk_enable(nmk_chip->clk); ret = clk_enable(nmk_chip->clk);
if (ret)
return ret;
if (gpiomode) if (gpiomode)
/* No glitch when going to GPIO mode */ /* No glitch when going to GPIO mode */
__nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO); __nmk_gpio_set_mode(nmk_chip, bit, NMK_GPIO_ALT_GPIO);

View file

@ -30,6 +30,7 @@
#include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinconf.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinmux.h> #include <linux/pinctrl/pinmux.h>
#include <linux/string_choices.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include "core.h" #include "core.h"
@ -458,7 +459,7 @@ static int amd_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
if (err) if (err)
dev_err(&gpio_dev->pdev->dev, "failed to %s wake-up interrupt\n", dev_err(&gpio_dev->pdev->dev, "failed to %s wake-up interrupt\n",
on ? "enable" : "disable"); str_enable_disable(on));
return 0; return 0;
} }
@ -908,12 +909,13 @@ static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
return false; return false;
} }
static int amd_gpio_suspend(struct device *dev) static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend)
{ {
struct amd_gpio *gpio_dev = dev_get_drvdata(dev); struct amd_gpio *gpio_dev = dev_get_drvdata(dev);
struct pinctrl_desc *desc = gpio_dev->pctrl->desc; struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
unsigned long flags; unsigned long flags;
int i; int i;
u32 wake_mask = is_suspend ? WAKE_SOURCE_SUSPEND : WAKE_SOURCE_HIBERNATE;
for (i = 0; i < desc->npins; i++) { for (i = 0; i < desc->npins; i++) {
int pin = desc->pins[i].number; int pin = desc->pins[i].number;
@ -925,11 +927,11 @@ static int amd_gpio_suspend(struct device *dev)
gpio_dev->saved_regs[i] = readl(gpio_dev->base + pin * 4) & ~PIN_IRQ_PENDING; gpio_dev->saved_regs[i] = readl(gpio_dev->base + pin * 4) & ~PIN_IRQ_PENDING;
/* mask any interrupts not intended to be a wake source */ /* mask any interrupts not intended to be a wake source */
if (!(gpio_dev->saved_regs[i] & WAKE_SOURCE)) { if (!(gpio_dev->saved_regs[i] & wake_mask)) {
writel(gpio_dev->saved_regs[i] & ~BIT(INTERRUPT_MASK_OFF), writel(gpio_dev->saved_regs[i] & ~BIT(INTERRUPT_MASK_OFF),
gpio_dev->base + pin * 4); gpio_dev->base + pin * 4);
pm_pr_dbg("Disabling GPIO #%d interrupt for suspend.\n", pm_pr_dbg("Disabling GPIO #%d interrupt for %s.\n",
pin); pin, is_suspend ? "suspend" : "hibernate");
} }
raw_spin_unlock_irqrestore(&gpio_dev->lock, flags); raw_spin_unlock_irqrestore(&gpio_dev->lock, flags);
@ -938,6 +940,16 @@ static int amd_gpio_suspend(struct device *dev)
return 0; return 0;
} }
static int amd_gpio_suspend(struct device *dev)
{
return amd_gpio_suspend_hibernate_common(dev, true);
}
static int amd_gpio_hibernate(struct device *dev)
{
return amd_gpio_suspend_hibernate_common(dev, false);
}
static int amd_gpio_resume(struct device *dev) static int amd_gpio_resume(struct device *dev)
{ {
struct amd_gpio *gpio_dev = dev_get_drvdata(dev); struct amd_gpio *gpio_dev = dev_get_drvdata(dev);
@ -961,8 +973,12 @@ static int amd_gpio_resume(struct device *dev)
} }
static const struct dev_pm_ops amd_gpio_pm_ops = { static const struct dev_pm_ops amd_gpio_pm_ops = {
SET_LATE_SYSTEM_SLEEP_PM_OPS(amd_gpio_suspend, .suspend_late = amd_gpio_suspend,
amd_gpio_resume) .resume_early = amd_gpio_resume,
.freeze_late = amd_gpio_hibernate,
.thaw_early = amd_gpio_resume,
.poweroff_late = amd_gpio_hibernate,
.restore_early = amd_gpio_resume,
}; };
#endif #endif

View file

@ -80,10 +80,9 @@
#define FUNCTION_MASK GENMASK(1, 0) #define FUNCTION_MASK GENMASK(1, 0)
#define FUNCTION_INVALID GENMASK(7, 0) #define FUNCTION_INVALID GENMASK(7, 0)
#define WAKE_SOURCE (BIT(WAKE_CNTRL_OFF_S0I3) | \ #define WAKE_SOURCE_SUSPEND (BIT(WAKE_CNTRL_OFF_S0I3) | \
BIT(WAKE_CNTRL_OFF_S3) | \ BIT(WAKE_CNTRL_OFF_S3))
BIT(WAKE_CNTRL_OFF_S4) | \ #define WAKE_SOURCE_HIBERNATE BIT(WAKE_CNTRL_OFF_S4)
BIT(WAKECNTRL_Z_OFF))
struct amd_function { struct amd_function {
const char *name; const char *name;

View file

@ -14,6 +14,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include <linux/pinctrl/machine.h> #include <linux/pinctrl/machine.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
@ -2237,7 +2238,7 @@ static int gemini_pmx_set_mux(struct pinctrl_dev *pctldev,
"pin group %s could not be %s: " "pin group %s could not be %s: "
"probably a hardware limitation\n", "probably a hardware limitation\n",
gemini_padgroups[i], gemini_padgroups[i],
enabled ? "enabled" : "disabled"); str_enabled_disabled(enabled));
dev_err(pmx->dev, dev_err(pmx->dev,
"GLOBAL MISC CTRL before: %08x, after %08x, expected %08x\n", "GLOBAL MISC CTRL before: %08x, after %08x, expected %08x\n",
before, after, expected); before, after, expected);
@ -2245,7 +2246,7 @@ static int gemini_pmx_set_mux(struct pinctrl_dev *pctldev,
dev_dbg(pmx->dev, dev_dbg(pmx->dev,
"padgroup %s %s\n", "padgroup %s %s\n",
gemini_padgroups[i], gemini_padgroups[i],
enabled ? "enabled" : "disabled"); str_enabled_disabled(enabled));
} }
} }
@ -2259,7 +2260,7 @@ static int gemini_pmx_set_mux(struct pinctrl_dev *pctldev,
"pin group %s could not be %s: " "pin group %s could not be %s: "
"probably a hardware limitation\n", "probably a hardware limitation\n",
gemini_padgroups[i], gemini_padgroups[i],
enabled ? "enabled" : "disabled"); str_enabled_disabled(enabled));
dev_err(pmx->dev, dev_err(pmx->dev,
"GLOBAL MISC CTRL before: %08x, after %08x, expected %08x\n", "GLOBAL MISC CTRL before: %08x, after %08x, expected %08x\n",
before, after, expected); before, after, expected);
@ -2267,7 +2268,7 @@ static int gemini_pmx_set_mux(struct pinctrl_dev *pctldev,
dev_dbg(pmx->dev, dev_dbg(pmx->dev,
"padgroup %s %s\n", "padgroup %s %s\n",
gemini_padgroups[i], gemini_padgroups[i],
enabled ? "enabled" : "disabled"); str_enabled_disabled(enabled));
} }
} }
@ -2588,7 +2589,7 @@ static int gemini_pmx_probe(struct platform_device *pdev)
tmp = val; tmp = val;
for_each_set_bit(i, &tmp, PADS_MAXBIT) { for_each_set_bit(i, &tmp, PADS_MAXBIT) {
dev_dbg(dev, "pad group %s %s\n", gemini_padgroups[i], dev_dbg(dev, "pad group %s %s\n", gemini_padgroups[i],
(val & BIT(i)) ? "enabled" : "disabled"); str_enabled_disabled(val & BIT(i)));
} }
/* Check if flash pin is set */ /* Check if flash pin is set */

View file

@ -3699,7 +3699,7 @@ static void ingenic_gpio_irq_print_chip(struct irq_data *data, struct seq_file *
{ {
struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data); struct gpio_chip *gpio_chip = irq_data_get_irq_chip_data(data);
seq_printf(p, "%s", gpio_chip->label); seq_puts(p, gpio_chip->label);
} }
static const struct irq_chip ingenic_gpio_irqchip = { static const struct irq_chip ingenic_gpio_irqchip = {

View file

@ -1777,7 +1777,7 @@ static const struct pinctrl_ops ocelot_pctl_ops = {
.dt_free_map = pinconf_generic_dt_free_map, .dt_free_map = pinconf_generic_dt_free_map,
}; };
static struct ocelot_match_data luton_desc = { static const struct ocelot_match_data luton_desc = {
.desc = { .desc = {
.name = "luton-pinctrl", .name = "luton-pinctrl",
.pins = luton_pins, .pins = luton_pins,
@ -1788,7 +1788,7 @@ static struct ocelot_match_data luton_desc = {
}, },
}; };
static struct ocelot_match_data serval_desc = { static const struct ocelot_match_data serval_desc = {
.desc = { .desc = {
.name = "serval-pinctrl", .name = "serval-pinctrl",
.pins = serval_pins, .pins = serval_pins,
@ -1799,7 +1799,7 @@ static struct ocelot_match_data serval_desc = {
}, },
}; };
static struct ocelot_match_data ocelot_desc = { static const struct ocelot_match_data ocelot_desc = {
.desc = { .desc = {
.name = "ocelot-pinctrl", .name = "ocelot-pinctrl",
.pins = ocelot_pins, .pins = ocelot_pins,
@ -1810,7 +1810,7 @@ static struct ocelot_match_data ocelot_desc = {
}, },
}; };
static struct ocelot_match_data jaguar2_desc = { static const struct ocelot_match_data jaguar2_desc = {
.desc = { .desc = {
.name = "jaguar2-pinctrl", .name = "jaguar2-pinctrl",
.pins = jaguar2_pins, .pins = jaguar2_pins,
@ -1821,7 +1821,7 @@ static struct ocelot_match_data jaguar2_desc = {
}, },
}; };
static struct ocelot_match_data servalt_desc = { static const struct ocelot_match_data servalt_desc = {
.desc = { .desc = {
.name = "servalt-pinctrl", .name = "servalt-pinctrl",
.pins = servalt_pins, .pins = servalt_pins,
@ -1832,7 +1832,7 @@ static struct ocelot_match_data servalt_desc = {
}, },
}; };
static struct ocelot_match_data sparx5_desc = { static const struct ocelot_match_data sparx5_desc = {
.desc = { .desc = {
.name = "sparx5-pinctrl", .name = "sparx5-pinctrl",
.pins = sparx5_pins, .pins = sparx5_pins,
@ -1850,7 +1850,7 @@ static struct ocelot_match_data sparx5_desc = {
}, },
}; };
static struct ocelot_match_data lan966x_desc = { static const struct ocelot_match_data lan966x_desc = {
.desc = { .desc = {
.name = "lan966x-pinctrl", .name = "lan966x-pinctrl",
.pins = lan966x_pins, .pins = lan966x_pins,
@ -1867,7 +1867,7 @@ static struct ocelot_match_data lan966x_desc = {
}, },
}; };
static struct ocelot_match_data lan969x_desc = { static const struct ocelot_match_data lan969x_desc = {
.desc = { .desc = {
.name = "lan969x-pinctrl", .name = "lan969x-pinctrl",
.pins = lan969x_pins, .pins = lan969x_pins,
@ -2116,7 +2116,7 @@ static void ocelot_irq_ack(struct irq_data *data)
static int ocelot_irq_set_type(struct irq_data *data, unsigned int type); static int ocelot_irq_set_type(struct irq_data *data, unsigned int type);
static struct irq_chip ocelot_level_irqchip = { static const struct irq_chip ocelot_level_irqchip = {
.name = "gpio", .name = "gpio",
.irq_mask = ocelot_irq_mask, .irq_mask = ocelot_irq_mask,
.irq_ack = ocelot_irq_ack, .irq_ack = ocelot_irq_ack,
@ -2126,7 +2126,7 @@ static struct irq_chip ocelot_level_irqchip = {
GPIOCHIP_IRQ_RESOURCE_HELPERS GPIOCHIP_IRQ_RESOURCE_HELPERS
}; };
static struct irq_chip ocelot_irqchip = { static const struct irq_chip ocelot_irqchip = {
.name = "gpio", .name = "gpio",
.irq_mask = ocelot_irq_mask, .irq_mask = ocelot_irq_mask,
.irq_ack = ocelot_irq_ack, .irq_ack = ocelot_irq_ack,

View file

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only // SPDX-License-Identifier: GPL-2.0-only
/* /*
* Pinctrl driver for Rockchip SoCs * Pinctrl driver for Rockchip SoCs
* * Copyright (c) 2020-2024 Rockchip Electronics Co., Ltd.
* Copyright (c) 2013 MundoReader S.L. * Copyright (c) 2013 MundoReader S.L.
* Author: Heiko Stuebner <heiko@sntech.de> * Author: Heiko Stuebner <heiko@sntech.de>
* *
@ -2003,6 +2003,151 @@ static int rk3399_calc_drv_reg_and_bit(struct rockchip_pin_bank *bank,
return 0; return 0;
} }
#define RK3562_DRV_BITS_PER_PIN 8
#define RK3562_DRV_PINS_PER_REG 2
#define RK3562_DRV_GPIO0_OFFSET 0x20070
#define RK3562_DRV_GPIO1_OFFSET 0x200
#define RK3562_DRV_GPIO2_OFFSET 0x240
#define RK3562_DRV_GPIO3_OFFSET 0x10280
#define RK3562_DRV_GPIO4_OFFSET 0x102C0
static int rk3562_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;
switch (bank->bank_num) {
case 0:
*reg = RK3562_DRV_GPIO0_OFFSET;
break;
case 1:
*reg = RK3562_DRV_GPIO1_OFFSET;
break;
case 2:
*reg = RK3562_DRV_GPIO2_OFFSET;
break;
case 3:
*reg = RK3562_DRV_GPIO3_OFFSET;
break;
case 4:
*reg = RK3562_DRV_GPIO4_OFFSET;
break;
default:
dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
break;
}
*reg += ((pin_num / RK3562_DRV_PINS_PER_REG) * 4);
*bit = pin_num % RK3562_DRV_PINS_PER_REG;
*bit *= RK3562_DRV_BITS_PER_PIN;
return 0;
}
#define RK3562_PULL_BITS_PER_PIN 2
#define RK3562_PULL_PINS_PER_REG 8
#define RK3562_PULL_GPIO0_OFFSET 0x20020
#define RK3562_PULL_GPIO1_OFFSET 0x80
#define RK3562_PULL_GPIO2_OFFSET 0x90
#define RK3562_PULL_GPIO3_OFFSET 0x100A0
#define RK3562_PULL_GPIO4_OFFSET 0x100B0
static int rk3562_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;
switch (bank->bank_num) {
case 0:
*reg = RK3562_PULL_GPIO0_OFFSET;
break;
case 1:
*reg = RK3562_PULL_GPIO1_OFFSET;
break;
case 2:
*reg = RK3562_PULL_GPIO2_OFFSET;
break;
case 3:
*reg = RK3562_PULL_GPIO3_OFFSET;
break;
case 4:
*reg = RK3562_PULL_GPIO4_OFFSET;
break;
default:
dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
break;
}
*reg += ((pin_num / RK3562_PULL_PINS_PER_REG) * 4);
*bit = pin_num % RK3562_PULL_PINS_PER_REG;
*bit *= RK3562_PULL_BITS_PER_PIN;
return 0;
}
#define RK3562_SMT_BITS_PER_PIN 2
#define RK3562_SMT_PINS_PER_REG 8
#define RK3562_SMT_GPIO0_OFFSET 0x20030
#define RK3562_SMT_GPIO1_OFFSET 0xC0
#define RK3562_SMT_GPIO2_OFFSET 0xD0
#define RK3562_SMT_GPIO3_OFFSET 0x100E0
#define RK3562_SMT_GPIO4_OFFSET 0x100F0
static int rk3562_calc_schmitt_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;
switch (bank->bank_num) {
case 0:
*reg = RK3562_SMT_GPIO0_OFFSET;
break;
case 1:
*reg = RK3562_SMT_GPIO1_OFFSET;
break;
case 2:
*reg = RK3562_SMT_GPIO2_OFFSET;
break;
case 3:
*reg = RK3562_SMT_GPIO3_OFFSET;
break;
case 4:
*reg = RK3562_SMT_GPIO4_OFFSET;
break;
default:
dev_err(info->dev, "unsupported bank_num %d\n", bank->bank_num);
break;
}
*reg += ((pin_num / RK3562_SMT_PINS_PER_REG) * 4);
*bit = pin_num % RK3562_SMT_PINS_PER_REG;
*bit *= RK3562_SMT_BITS_PER_PIN;
return 0;
}
#define RK3568_PULL_PMU_OFFSET 0x20 #define RK3568_PULL_PMU_OFFSET 0x20
#define RK3568_PULL_GRF_OFFSET 0x80 #define RK3568_PULL_GRF_OFFSET 0x80
#define RK3568_PULL_BITS_PER_PIN 2 #define RK3568_PULL_BITS_PER_PIN 2
@ -2495,7 +2640,8 @@ static int rockchip_set_drive_perpin(struct rockchip_pin_bank *bank,
rmask_bits = RK3588_DRV_BITS_PER_PIN; rmask_bits = RK3588_DRV_BITS_PER_PIN;
ret = strength; ret = strength;
goto config; goto config;
} else if (ctrl->type == RK3568) { } else if (ctrl->type == RK3562 ||
ctrl->type == RK3568) {
rmask_bits = RK3568_DRV_BITS_PER_PIN; rmask_bits = RK3568_DRV_BITS_PER_PIN;
ret = (1 << (strength + 1)) - 1; ret = (1 << (strength + 1)) - 1;
goto config; goto config;
@ -2639,6 +2785,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
case RK3328: case RK3328:
case RK3368: case RK3368:
case RK3399: case RK3399:
case RK3562:
case RK3568: case RK3568:
case RK3576: case RK3576:
case RK3588: case RK3588:
@ -2699,6 +2846,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
case RK3328: case RK3328:
case RK3368: case RK3368:
case RK3399: case RK3399:
case RK3562:
case RK3568: case RK3568:
case RK3576: case RK3576:
case RK3588: case RK3588:
@ -2810,6 +2958,7 @@ static int rockchip_get_schmitt(struct rockchip_pin_bank *bank, int pin_num)
data >>= bit; data >>= bit;
switch (ctrl->type) { switch (ctrl->type) {
case RK3562:
case RK3568: case RK3568:
return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1); return data & ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1);
default: default:
@ -2839,6 +2988,7 @@ static int rockchip_set_schmitt(struct rockchip_pin_bank *bank,
/* enable the write to the equivalent lower bits */ /* enable the write to the equivalent lower bits */
switch (ctrl->type) { switch (ctrl->type) {
case RK3562:
case RK3568: case RK3568:
data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16); data = ((1 << RK3568_SCHMITT_BITS_PER_PIN) - 1) << (bit + 16);
rmask = data | (data >> 16); rmask = data | (data >> 16);
@ -2965,6 +3115,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
case RK3328: case RK3328:
case RK3368: case RK3368:
case RK3399: case RK3399:
case RK3562:
case RK3568: case RK3568:
case RK3576: case RK3576:
case RK3588: case RK3588:
@ -4086,6 +4237,49 @@ static struct rockchip_pin_ctrl rk3399_pin_ctrl = {
.drv_calc_reg = rk3399_calc_drv_reg_and_bit, .drv_calc_reg = rk3399_calc_drv_reg_and_bit,
}; };
static struct rockchip_pin_bank rk3562_pin_banks[] = {
PIN_BANK_IOMUX_FLAGS_OFFSET(0, 32, "gpio0",
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
0x20000, 0x20008, 0x20010, 0x20018),
PIN_BANK_IOMUX_FLAGS_OFFSET(1, 32, "gpio1",
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
0, 0x08, 0x10, 0x18),
PIN_BANK_IOMUX_FLAGS_OFFSET(2, 32, "gpio2",
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
0x20, 0, 0, 0),
PIN_BANK_IOMUX_FLAGS_OFFSET(3, 32, "gpio3",
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
0x10040, 0x10048, 0x10050, 0x10058),
PIN_BANK_IOMUX_FLAGS_OFFSET(4, 16, "gpio4",
IOMUX_WIDTH_4BIT,
IOMUX_WIDTH_4BIT,
0,
0,
0x10060, 0x10068, 0, 0),
};
static struct rockchip_pin_ctrl rk3562_pin_ctrl __maybe_unused = {
.pin_banks = rk3562_pin_banks,
.nr_banks = ARRAY_SIZE(rk3562_pin_banks),
.label = "RK3562-GPIO",
.type = RK3562,
.pull_calc_reg = rk3562_calc_pull_reg_and_bit,
.drv_calc_reg = rk3562_calc_drv_reg_and_bit,
.schmitt_calc_reg = rk3562_calc_schmitt_reg_and_bit,
};
static struct rockchip_pin_bank rk3568_pin_banks[] = { static struct rockchip_pin_bank rk3568_pin_banks[] = {
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT, IOMUX_SOURCE_PMU | IOMUX_WIDTH_4BIT,
@ -4210,6 +4404,8 @@ static const struct of_device_id rockchip_pinctrl_dt_match[] = {
.data = &rk3368_pin_ctrl }, .data = &rk3368_pin_ctrl },
{ .compatible = "rockchip,rk3399-pinctrl", { .compatible = "rockchip,rk3399-pinctrl",
.data = &rk3399_pin_ctrl }, .data = &rk3399_pin_ctrl },
{ .compatible = "rockchip,rk3562-pinctrl",
.data = &rk3562_pin_ctrl },
{ .compatible = "rockchip,rk3568-pinctrl", { .compatible = "rockchip,rk3568-pinctrl",
.data = &rk3568_pin_ctrl }, .data = &rk3568_pin_ctrl },
{ .compatible = "rockchip,rk3576-pinctrl", { .compatible = "rockchip,rk3576-pinctrl",

View file

@ -1,6 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
/* /*
* Copyright (c) 2020-2021 Rockchip Electronics Co. Ltd. * Copyright (c) 2020-2024 Rockchip Electronics Co., Ltd.
* *
* Copyright (c) 2013 MundoReader S.L. * Copyright (c) 2013 MundoReader S.L.
* Author: Heiko Stuebner <heiko@sntech.de> * Author: Heiko Stuebner <heiko@sntech.de>
@ -196,6 +196,7 @@ enum rockchip_pinctrl_type {
RK3328, RK3328,
RK3368, RK3368,
RK3399, RK3399,
RK3562,
RK3568, RK3568,
RK3576, RK3576,
RK3588, RK3588,

View file

@ -380,7 +380,7 @@ static void stmfx_pinconf_dbg_show(struct pinctrl_dev *pctldev,
seq_printf(s, "input %s ", str_high_low(val)); seq_printf(s, "input %s ", str_high_low(val));
if (type) if (type)
seq_printf(s, "with internal pull-%s ", seq_printf(s, "with internal pull-%s ",
pupd ? "up" : "down"); str_up_down(pupd));
else else
seq_printf(s, "%s ", pupd ? "floating" : "analog"); seq_printf(s, "%s ", pupd ? "floating" : "analog");
} }

View file

@ -137,6 +137,12 @@ 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_MSM8917
tristate "Qualcomm 8917 pin controller driver"
help
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
Qualcomm TLMM block found on the Qualcomm MSM8917 platform.
config PINCTRL_MSM8953 config PINCTRL_MSM8953
tristate "Qualcomm 8953 pin controller driver" tristate "Qualcomm 8953 pin controller driver"
depends on ARM64 || COMPILE_TEST depends on ARM64 || COMPILE_TEST

View file

@ -17,6 +17,7 @@ obj-$(CONFIG_PINCTRL_MSM8960) += pinctrl-msm8960.o
obj-$(CONFIG_PINCTRL_MSM8X74) += pinctrl-msm8x74.o obj-$(CONFIG_PINCTRL_MSM8X74) += pinctrl-msm8x74.o
obj-$(CONFIG_PINCTRL_MSM8909) += pinctrl-msm8909.o obj-$(CONFIG_PINCTRL_MSM8909) += pinctrl-msm8909.o
obj-$(CONFIG_PINCTRL_MSM8916) += pinctrl-msm8916.o obj-$(CONFIG_PINCTRL_MSM8916) += pinctrl-msm8916.o
obj-$(CONFIG_PINCTRL_MSM8917) += pinctrl-msm8917.o
obj-$(CONFIG_PINCTRL_MSM8953) += pinctrl-msm8953.o obj-$(CONFIG_PINCTRL_MSM8953) += pinctrl-msm8953.o
obj-$(CONFIG_PINCTRL_MSM8976) += pinctrl-msm8976.o obj-$(CONFIG_PINCTRL_MSM8976) += pinctrl-msm8976.o
obj-$(CONFIG_PINCTRL_MSM8994) += pinctrl-msm8994.o obj-$(CONFIG_PINCTRL_MSM8994) += pinctrl-msm8994.o

View file

@ -233,7 +233,10 @@ enum ipq5424_functions {
msm_mux_sdc_clk, msm_mux_sdc_clk,
msm_mux_sdc_cmd, msm_mux_sdc_cmd,
msm_mux_sdc_data, msm_mux_sdc_data,
msm_mux_spi0, msm_mux_spi0_clk,
msm_mux_spi0_cs,
msm_mux_spi0_miso,
msm_mux_spi0_mosi,
msm_mux_spi1, msm_mux_spi1,
msm_mux_spi10, msm_mux_spi10,
msm_mux_spi11, msm_mux_spi11,
@ -297,8 +300,8 @@ static const char * const qspi_clk_groups[] = {
"gpio5", "gpio5",
}; };
static const char * const spi0_groups[] = { static const char * const spi0_clk_groups[] = {
"gpio6", "gpio7", "gpio8", "gpio9", "gpio6",
}; };
static const char * const pwm1_groups[] = { static const char * const pwm1_groups[] = {
@ -315,14 +318,26 @@ static const char * const qdss_tracedata_a_groups[] = {
"gpio38", "gpio39", "gpio38", "gpio39",
}; };
static const char * const spi0_cs_groups[] = {
"gpio7",
};
static const char * const cri_trng1_groups[] = { static const char * const cri_trng1_groups[] = {
"gpio7", "gpio7",
}; };
static const char * const spi0_miso_groups[] = {
"gpio8",
};
static const char * const cri_trng2_groups[] = { static const char * const cri_trng2_groups[] = {
"gpio8", "gpio8",
}; };
static const char * const spi0_mosi_groups[] = {
"gpio9",
};
static const char * const cri_trng3_groups[] = { static const char * const cri_trng3_groups[] = {
"gpio9", "gpio9",
}; };
@ -680,7 +695,10 @@ static const struct pinfunction ipq5424_functions[] = {
MSM_PIN_FUNCTION(sdc_clk), MSM_PIN_FUNCTION(sdc_clk),
MSM_PIN_FUNCTION(sdc_cmd), MSM_PIN_FUNCTION(sdc_cmd),
MSM_PIN_FUNCTION(sdc_data), MSM_PIN_FUNCTION(sdc_data),
MSM_PIN_FUNCTION(spi0), MSM_PIN_FUNCTION(spi0_clk),
MSM_PIN_FUNCTION(spi0_cs),
MSM_PIN_FUNCTION(spi0_miso),
MSM_PIN_FUNCTION(spi0_mosi),
MSM_PIN_FUNCTION(spi1), MSM_PIN_FUNCTION(spi1),
MSM_PIN_FUNCTION(spi10), MSM_PIN_FUNCTION(spi10),
MSM_PIN_FUNCTION(spi11), MSM_PIN_FUNCTION(spi11),
@ -700,10 +718,10 @@ static const struct msm_pingroup ipq5424_groups[] = {
PINGROUP(3, sdc_data, qspi_data, pwm2, _, _, _, _, _, _), PINGROUP(3, sdc_data, qspi_data, pwm2, _, _, _, _, _, _),
PINGROUP(4, sdc_cmd, qspi_cs, _, _, _, _, _, _, _), PINGROUP(4, sdc_cmd, qspi_cs, _, _, _, _, _, _, _),
PINGROUP(5, sdc_clk, qspi_clk, _, _, _, _, _, _, _), PINGROUP(5, sdc_clk, qspi_clk, _, _, _, _, _, _, _),
PINGROUP(6, spi0, pwm1, _, cri_trng0, qdss_tracedata_a, _, _, _, _), PINGROUP(6, spi0_clk, pwm1, _, cri_trng0, qdss_tracedata_a, _, _, _, _),
PINGROUP(7, spi0, pwm1, _, cri_trng1, qdss_tracedata_a, _, _, _, _), PINGROUP(7, spi0_cs, pwm1, _, cri_trng1, qdss_tracedata_a, _, _, _, _),
PINGROUP(8, spi0, pwm1, wci_txd, wci_rxd, _, cri_trng2, qdss_tracedata_a, _, _), PINGROUP(8, spi0_miso, pwm1, wci_txd, wci_rxd, _, cri_trng2, qdss_tracedata_a, _, _),
PINGROUP(9, spi0, pwm1, _, cri_trng3, qdss_tracedata_a, _, _, _, _), PINGROUP(9, spi0_mosi, pwm1, _, cri_trng3, qdss_tracedata_a, _, _, _, _),
PINGROUP(10, uart0, pwm0, spi11, _, wci_txd, wci_rxd, _, qdss_tracedata_a, _), PINGROUP(10, uart0, pwm0, spi11, _, wci_txd, wci_rxd, _, qdss_tracedata_a, _),
PINGROUP(11, uart0, pwm0, spi1, _, wci_txd, wci_rxd, _, qdss_tracedata_a, _), PINGROUP(11, uart0, pwm0, spi1, _, wci_txd, wci_rxd, _, qdss_tracedata_a, _),
PINGROUP(12, uart0, pwm0, spi11, _, prng_rosc0, qdss_tracedata_a, _, _, _), PINGROUP(12, uart0, pwm0, spi11, _, prng_rosc0, qdss_tracedata_a, _, _, _),

View file

@ -19,6 +19,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/string_choices.h>
#include <linux/pinctrl/machine.h> #include <linux/pinctrl/machine.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
@ -714,7 +715,7 @@ static void msm_gpio_dbg_show_one(struct seq_file *s,
} }
seq_printf(s, " %-8s: %-3s", g->grp.name, is_out ? "out" : "in"); seq_printf(s, " %-8s: %-3s", g->grp.name, is_out ? "out" : "in");
seq_printf(s, " %-4s func%d", val ? "high" : "low", func); seq_printf(s, " %-4s func%d", str_high_low(val), func);
seq_printf(s, " %dmA", msm_regval_to_drive(drive)); seq_printf(s, " %dmA", msm_regval_to_drive(drive));
if (pctrl->soc->pull_no_keeper) if (pctrl->soc->pull_no_keeper)
seq_printf(s, " %s", pulls_no_keeper[pull]); seq_printf(s, " %s", pulls_no_keeper[pull]);

File diff suppressed because it is too large Load diff

View file

@ -14,6 +14,7 @@
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spmi.h> #include <linux/spmi.h>
#include <linux/string_choices.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
@ -702,7 +703,7 @@ static void pmic_gpio_config_dbg_show(struct pinctrl_dev *pctldev,
else else
seq_printf(s, " %-4s", seq_printf(s, " %-4s",
pad->output_enabled ? "out" : "in"); pad->output_enabled ? "out" : "in");
seq_printf(s, " %-4s", pad->out_value ? "high" : "low"); seq_printf(s, " %-4s", str_high_low(pad->out_value));
seq_printf(s, " %-7s", pmic_gpio_functions[function]); seq_printf(s, " %-7s", pmic_gpio_functions[function]);
seq_printf(s, " vin-%d", pad->power_source); seq_printf(s, " vin-%d", pad->power_source);
seq_printf(s, " %-27s", biases[pad->pullup]); seq_printf(s, " %-27s", biases[pad->pullup]);

View file

@ -11,6 +11,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
@ -544,7 +545,7 @@ static void pmic_mpp_config_dbg_show(struct pinctrl_dev *pctldev,
seq_printf(s, " %d", pad->aout_level); seq_printf(s, " %d", pad->aout_level);
if (pad->has_pullup) if (pad->has_pullup)
seq_printf(s, " %-8s", biases[pad->pullup]); seq_printf(s, " %-8s", biases[pad->pullup]);
seq_printf(s, " %-4s", pad->out_value ? "high" : "low"); seq_printf(s, " %-4s", str_high_low(pad->out_value));
if (pad->dtest) if (pad->dtest)
seq_printf(s, " dtest%d", pad->dtest); seq_printf(s, " dtest%d", pad->dtest);
if (pad->paired) if (pad->paired)

View file

@ -13,6 +13,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinconf.h>
@ -569,7 +570,7 @@ static void pm8xxx_gpio_dbg_show_one(struct seq_file *s,
seq_printf(s, " VIN%d", pin->power_source); seq_printf(s, " VIN%d", pin->power_source);
seq_printf(s, " %-27s", biases[pin->bias]); seq_printf(s, " %-27s", biases[pin->bias]);
seq_printf(s, " %-10s", buffer_types[pin->open_drain]); seq_printf(s, " %-10s", buffer_types[pin->open_drain]);
seq_printf(s, " %-4s", pin->output_value ? "high" : "low"); seq_printf(s, " %-4s", str_high_low(pin->output_value));
seq_printf(s, " %-7s", strengths[pin->output_strength]); seq_printf(s, " %-7s", strengths[pin->output_strength]);
if (pin->inverted) if (pin->inverted)
seq_puts(s, " inverted"); seq_puts(s, " inverted");

View file

@ -13,6 +13,7 @@
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include <linux/pinctrl/pinconf-generic.h> #include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinconf.h>
@ -576,8 +577,7 @@ static void pm8xxx_mpp_dbg_show_one(struct seq_file *s,
seq_puts(s, "out "); seq_puts(s, "out ");
if (!pin->paired) { if (!pin->paired) {
seq_puts(s, pin->output_value ? seq_puts(s, str_high_low(pin->output_value));
"high" : "low");
} else { } else {
seq_puts(s, pin->output_value ? seq_puts(s, pin->output_value ?
"inverted" : "follow"); "inverted" : "follow");
@ -589,8 +589,7 @@ static void pm8xxx_mpp_dbg_show_one(struct seq_file *s,
if (pin->output) { if (pin->output) {
seq_printf(s, "out %s ", aout_lvls[pin->aout_level]); seq_printf(s, "out %s ", aout_lvls[pin->aout_level]);
if (!pin->paired) { if (!pin->paired) {
seq_puts(s, pin->output_value ? seq_puts(s, str_high_low(pin->output_value));
"high" : "low");
} else { } else {
seq_puts(s, pin->output_value ? seq_puts(s, pin->output_value ?
"inverted" : "follow"); "inverted" : "follow");
@ -605,8 +604,7 @@ static void pm8xxx_mpp_dbg_show_one(struct seq_file *s,
seq_printf(s, "dtest%d", pin->dtest); seq_printf(s, "dtest%d", pin->dtest);
} else { } else {
if (!pin->paired) { if (!pin->paired) {
seq_puts(s, pin->output_value ? seq_puts(s, str_high_low(pin->output_value));
"high" : "low");
} else { } else {
seq_puts(s, pin->output_value ? seq_puts(s, pin->output_value ?
"inverted" : "follow"); "inverted" : "follow");

View file

@ -41,6 +41,7 @@ config PINCTRL_RENESAS
select PINCTRL_PFC_R8A779H0 if ARCH_R8A779H0 select PINCTRL_PFC_R8A779H0 if ARCH_R8A779H0
select PINCTRL_RZG2L if ARCH_RZG2L select PINCTRL_RZG2L if ARCH_RZG2L
select PINCTRL_RZV2M if ARCH_R9A09G011 select PINCTRL_RZV2M if ARCH_R9A09G011
select PINCTRL_RZG2L if ARCH_R9A09G047
select PINCTRL_RZG2L if ARCH_R9A09G057 select PINCTRL_RZG2L if ARCH_R9A09G057
select PINCTRL_PFC_SH7203 if CPU_SUBTYPE_SH7203 select PINCTRL_PFC_SH7203 if CPU_SUBTYPE_SH7203
select PINCTRL_PFC_SH7264 if CPU_SUBTYPE_SH7264 select PINCTRL_PFC_SH7264 if CPU_SUBTYPE_SH7264

View file

@ -26,6 +26,8 @@
#include <linux/pinctrl/pinctrl.h> #include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h> #include <linux/pinctrl/pinmux.h>
#include <dt-bindings/pinctrl/renesas,r9a09g047-pinctrl.h>
#include <dt-bindings/pinctrl/renesas,r9a09g057-pinctrl.h>
#include <dt-bindings/pinctrl/rzg2l-pinctrl.h> #include <dt-bindings/pinctrl/rzg2l-pinctrl.h>
#include "../core.h" #include "../core.h"
@ -157,7 +159,7 @@
#define PWPR_REGWE_B BIT(5) /* OEN Register Write Enable, known only in RZ/V2H(P) */ #define PWPR_REGWE_B BIT(5) /* OEN Register Write Enable, known only in RZ/V2H(P) */
#define PM_MASK 0x03 #define PM_MASK 0x03
#define PFC_MASK 0x07 #define PFC_MASK 0x0f
#define IEN_MASK 0x01 #define IEN_MASK 0x01
#define IOLH_MASK 0x03 #define IOLH_MASK 0x03
#define SR_MASK 0x01 #define SR_MASK 0x01
@ -381,13 +383,51 @@ static u64 rzg2l_pinctrl_get_variable_pin_cfg(struct rzg2l_pinctrl *pctrl,
return 0; return 0;
} }
static const u64 r9a09g047_variable_pin_cfg[] = {
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 0, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 1, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 2, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 3, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 4, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 5, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 6, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 7, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 0, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 1, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 2, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 3, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 4, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 5, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 6, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 7, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 0, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 6, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 7, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 0, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 0, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 1, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 2, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 3, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 4, RZV2H_MPXED_PIN_FUNCS),
};
static const u64 r9a09g057_variable_pin_cfg[] = { static const u64 r9a09g057_variable_pin_cfg[] = {
RZG2L_VARIABLE_PIN_CFG_PACK(11, 0, RZV2H_MPXED_PIN_FUNCS), RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 0, RZV2H_MPXED_PIN_FUNCS),
RZG2L_VARIABLE_PIN_CFG_PACK(11, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN), RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(11, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN), RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(11, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN), RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(11, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN), RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
RZG2L_VARIABLE_PIN_CFG_PACK(11, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN), RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
}; };
#ifdef CONFIG_RISCV #ifdef CONFIG_RISCV
@ -1962,6 +2002,73 @@ static const u64 r9a08g045_gpio_configs[] = {
RZG2L_GPIO_PORT_PACK(6, 0x2a, RZG3S_MPXED_PIN_FUNCS(A)), /* P18 */ RZG2L_GPIO_PORT_PACK(6, 0x2a, RZG3S_MPXED_PIN_FUNCS(A)), /* P18 */
}; };
static const char * const rzg3e_gpio_names[] = {
"P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07",
"P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17",
"P20", "P21", "P22", "P23", "P24", "P25", "P26", "P27",
"P30", "P31", "P32", "P33", "P34", "P35", "P36", "P37",
"P40", "P41", "P42", "P43", "P44", "P45", "P46", "P47",
"P50", "P51", "P52", "P53", "P54", "P55", "P56", "P57",
"P60", "P61", "P62", "P63", "P64", "P65", "P66", "P67",
"P70", "P71", "P72", "P73", "P74", "P75", "P76", "P77",
"P80", "P81", "P82", "P83", "P84", "P85", "P86", "P87",
"", "", "", "", "", "", "", "",
"PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7",
"PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7",
"PC0", "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7",
"PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7",
"PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6", "PE7",
"PF0", "PF1", "PF2", "PF3", "PF4", "PF5", "PF6", "PF7",
"PG0", "PG1", "PG2", "PG3", "PG4", "PG5", "PG6", "PG7",
"PH0", "PH1", "PH2", "PH3", "PH4", "PH5", "PH6", "PH7",
"", "", "", "", "", "", "", "",
"PJ0", "PJ1", "PJ2", "PJ3", "PJ4", "PJ5", "PJ6", "PJ7",
"PK0", "PK1", "PK2", "PK3", "PK4", "PK5", "PK6", "PK7",
"PL0", "PL1", "PL2", "PL3", "PL4", "PL5", "PL6", "PL7",
"PM0", "PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"", "", "", "", "", "", "", "",
"PS0", "PS1", "PS2", "PS3", "PS4", "PS5", "PS6", "PS7",
};
static const u64 r9a09g047_gpio_configs[] = {
RZG2L_GPIO_PORT_PACK(8, 0x20, RZV2H_MPXED_PIN_FUNCS), /* P0 */
RZG2L_GPIO_PORT_PACK(8, 0x21, RZV2H_MPXED_PIN_FUNCS |
PIN_CFG_ELC), /* P1 */
RZG2L_GPIO_PORT_PACK(2, 0x22, RZG2L_MPXED_COMMON_PIN_FUNCS(RZV2H) |
PIN_CFG_NOD), /* P2 */
RZG2L_GPIO_PORT_PACK(8, 0x23, RZV2H_MPXED_PIN_FUNCS), /* P3 */
RZG2L_GPIO_PORT_PACK(6, 0x24, RZV2H_MPXED_PIN_FUNCS), /* P4 */
RZG2L_GPIO_PORT_PACK(7, 0x25, RZV2H_MPXED_PIN_FUNCS), /* P5 */
RZG2L_GPIO_PORT_PACK(7, 0x26, RZV2H_MPXED_PIN_FUNCS), /* P6 */
RZG2L_GPIO_PORT_PACK(8, 0x27, RZV2H_MPXED_PIN_FUNCS |
PIN_CFG_ELC), /* P7 */
RZG2L_GPIO_PORT_PACK(6, 0x28, RZV2H_MPXED_PIN_FUNCS), /* P8 */
0x0,
RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x2a), /* PA */
RZG2L_GPIO_PORT_PACK(8, 0x2b, RZV2H_MPXED_PIN_FUNCS), /* PB */
RZG2L_GPIO_PORT_PACK(3, 0x2c, RZV2H_MPXED_PIN_FUNCS), /* PC */
RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x2d), /* PD */
RZG2L_GPIO_PORT_PACK(8, 0x2e, RZV2H_MPXED_PIN_FUNCS), /* PE */
RZG2L_GPIO_PORT_PACK(3, 0x2f, RZV2H_MPXED_PIN_FUNCS), /* PF */
RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x30), /* PG */
RZG2L_GPIO_PORT_PACK_VARIABLE(6, 0x31), /* PH */
0x0,
RZG2L_GPIO_PORT_PACK_VARIABLE(5, 0x33), /* PJ */
RZG2L_GPIO_PORT_PACK(4, 0x34, RZV2H_MPXED_PIN_FUNCS), /* PK */
RZG2L_GPIO_PORT_PACK(8, 0x35, RZV2H_MPXED_PIN_FUNCS), /* PL */
RZG2L_GPIO_PORT_PACK(8, 0x36, RZV2H_MPXED_PIN_FUNCS), /* PM */
0x0,
0x0,
0x0,
0x0,
0x0,
RZG2L_GPIO_PORT_PACK(4, 0x3c, RZV2H_MPXED_PIN_FUNCS), /* PS */
};
static const char * const rzv2h_gpio_names[] = { static const char * const rzv2h_gpio_names[] = {
"P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07", "P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07",
"P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17", "P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17",
@ -2085,6 +2192,8 @@ static const struct rzg2l_dedicated_configs rzg3s_dedicated_pins[] = {
{ "TMS/SWDIO", RZG2L_SINGLE_PIN_PACK(0x1, 0, (PIN_CFG_IOLH_A | PIN_CFG_IEN | { "TMS/SWDIO", RZG2L_SINGLE_PIN_PACK(0x1, 0, (PIN_CFG_IOLH_A | PIN_CFG_IEN |
PIN_CFG_SOFT_PS)) }, PIN_CFG_SOFT_PS)) },
{ "TDO", RZG2L_SINGLE_PIN_PACK(0x1, 1, (PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS)) }, { "TDO", RZG2L_SINGLE_PIN_PACK(0x1, 1, (PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS)) },
{ "AUDIO_CLK1", RZG2L_SINGLE_PIN_PACK(0x2, 0, PIN_CFG_IEN) },
{ "AUDIO_CLK2", RZG2L_SINGLE_PIN_PACK(0x2, 1, PIN_CFG_IEN) },
{ "WDTOVF_PERROUT#", RZG2L_SINGLE_PIN_PACK(0x6, 0, PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS) }, { "WDTOVF_PERROUT#", RZG2L_SINGLE_PIN_PACK(0x6, 0, PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS) },
{ "SD0_CLK", RZG2L_SINGLE_PIN_PACK(0x10, 0, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD0)) }, { "SD0_CLK", RZG2L_SINGLE_PIN_PACK(0x10, 0, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD0)) },
{ "SD0_CMD", RZG2L_SINGLE_PIN_PACK(0x10, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN | { "SD0_CMD", RZG2L_SINGLE_PIN_PACK(0x10, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
@ -2250,6 +2359,43 @@ static struct rzg2l_dedicated_configs rzv2h_dedicated_pins[] = {
{ "ET1_RXD3", RZG2L_SINGLE_PIN_PACK(0x14, 7, (PIN_CFG_PUPD)) }, { "ET1_RXD3", RZG2L_SINGLE_PIN_PACK(0x14, 7, (PIN_CFG_PUPD)) },
}; };
static struct rzg2l_dedicated_configs rzg3e_dedicated_pins[] = {
{ "WDTUDFCA", RZG2L_SINGLE_PIN_PACK(0x5, 0,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD | PIN_CFG_NOD)) },
{ "WDTUDFCM", RZG2L_SINGLE_PIN_PACK(0x5, 1,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD | PIN_CFG_NOD)) },
{ "SCIF_RXD", RZG2L_SINGLE_PIN_PACK(0x6, 0,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD)) },
{ "SCIF_TXD", RZG2L_SINGLE_PIN_PACK(0x6, 1,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD)) },
{ "SD0CLK", RZG2L_SINGLE_PIN_PACK(0x9, 0,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
{ "SD0CMD", RZG2L_SINGLE_PIN_PACK(0x9, 1,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0RSTN", RZG2L_SINGLE_PIN_PACK(0x9, 2,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
{ "SD0PWEN", RZG2L_SINGLE_PIN_PACK(0x9, 3,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
{ "SD0IOVS", RZG2L_SINGLE_PIN_PACK(0x9, 4,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
{ "SD0DAT0", RZG2L_SINGLE_PIN_PACK(0xa, 0,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT1", RZG2L_SINGLE_PIN_PACK(0xa, 1,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT2", RZG2L_SINGLE_PIN_PACK(0xa, 2,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT3", RZG2L_SINGLE_PIN_PACK(0xa, 3,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT4", RZG2L_SINGLE_PIN_PACK(0xa, 4,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT5", RZG2L_SINGLE_PIN_PACK(0xa, 5,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT6", RZG2L_SINGLE_PIN_PACK(0xa, 6,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
{ "SD0DAT7", RZG2L_SINGLE_PIN_PACK(0xa, 7,
(PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
};
static int rzg2l_gpio_get_gpioint(unsigned int virq, struct rzg2l_pinctrl *pctrl) static int rzg2l_gpio_get_gpioint(unsigned int virq, struct rzg2l_pinctrl *pctrl)
{ {
const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[virq]; const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[virq];
@ -2760,6 +2906,9 @@ static int rzg2l_pinctrl_probe(struct platform_device *pdev)
BUILD_BUG_ON(ARRAY_SIZE(r9a08g045_gpio_configs) * RZG2L_PINS_PER_PORT > BUILD_BUG_ON(ARRAY_SIZE(r9a08g045_gpio_configs) * RZG2L_PINS_PER_PORT >
ARRAY_SIZE(rzg2l_gpio_names)); ARRAY_SIZE(rzg2l_gpio_names));
BUILD_BUG_ON(ARRAY_SIZE(r9a09g047_gpio_configs) * RZG2L_PINS_PER_PORT >
ARRAY_SIZE(rzg3e_gpio_names));
BUILD_BUG_ON(ARRAY_SIZE(r9a09g057_gpio_configs) * RZG2L_PINS_PER_PORT > BUILD_BUG_ON(ARRAY_SIZE(r9a09g057_gpio_configs) * RZG2L_PINS_PER_PORT >
ARRAY_SIZE(rzv2h_gpio_names)); ARRAY_SIZE(rzv2h_gpio_names));
@ -3158,6 +3307,29 @@ static struct rzg2l_pinctrl_data r9a08g045_data = {
.bias_param_to_hw = &rzg2l_bias_param_to_hw, .bias_param_to_hw = &rzg2l_bias_param_to_hw,
}; };
static struct rzg2l_pinctrl_data r9a09g047_data = {
.port_pins = rzg3e_gpio_names,
.port_pin_configs = r9a09g047_gpio_configs,
.n_ports = ARRAY_SIZE(r9a09g047_gpio_configs),
.dedicated_pins = rzg3e_dedicated_pins,
.n_port_pins = ARRAY_SIZE(r9a09g047_gpio_configs) * RZG2L_PINS_PER_PORT,
.n_dedicated_pins = ARRAY_SIZE(rzg3e_dedicated_pins),
.hwcfg = &rzv2h_hwcfg,
.variable_pin_cfg = r9a09g047_variable_pin_cfg,
.n_variable_pin_cfg = ARRAY_SIZE(r9a09g047_variable_pin_cfg),
.num_custom_params = ARRAY_SIZE(renesas_rzv2h_custom_bindings),
.custom_params = renesas_rzv2h_custom_bindings,
#ifdef CONFIG_DEBUG_FS
.custom_conf_items = renesas_rzv2h_conf_items,
#endif
.pwpr_pfc_lock_unlock = &rzv2h_pwpr_pfc_lock_unlock,
.pmc_writeb = &rzv2h_pmc_writeb,
.oen_read = &rzv2h_oen_read,
.oen_write = &rzv2h_oen_write,
.hw_to_bias_param = &rzv2h_hw_to_bias_param,
.bias_param_to_hw = &rzv2h_bias_param_to_hw,
};
static struct rzg2l_pinctrl_data r9a09g057_data = { static struct rzg2l_pinctrl_data r9a09g057_data = {
.port_pins = rzv2h_gpio_names, .port_pins = rzv2h_gpio_names,
.port_pin_configs = r9a09g057_gpio_configs, .port_pin_configs = r9a09g057_gpio_configs,
@ -3194,6 +3366,10 @@ static const struct of_device_id rzg2l_pinctrl_of_table[] = {
.compatible = "renesas,r9a08g045-pinctrl", .compatible = "renesas,r9a08g045-pinctrl",
.data = &r9a08g045_data, .data = &r9a08g045_data,
}, },
{
.compatible = "renesas,r9a09g047-pinctrl",
.data = &r9a09g047_data,
},
{ {
.compatible = "renesas,r9a09g057-pinctrl", .compatible = "renesas,r9a09g057-pinctrl",
.data = &r9a09g057_data, .data = &r9a09g057_data,

View file

@ -23,6 +23,7 @@
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/string_choices.h>
#include <linux/regmap.h> #include <linux/regmap.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/soc/samsung/exynos-pmu.h> #include <linux/soc/samsung/exynos-pmu.h>
@ -442,7 +443,7 @@ static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd); struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq); unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq);
pr_info("wake %s for irq %u (%s-%lu)\n", on ? "enabled" : "disabled", pr_info("wake %s for irq %u (%s-%lu)\n", str_enabled_disabled(on),
irqd->irq, bank->name, irqd->hwirq); irqd->irq, bank->name, irqd->hwirq);
if (!on) if (!on)
@ -636,7 +637,7 @@ static void exynos_irq_demux_eint16_31(struct irq_desc *desc)
if (clk_enable(b->drvdata->pclk)) { if (clk_enable(b->drvdata->pclk)) {
dev_err(b->gpio_chip.parent, dev_err(b->gpio_chip.parent,
"unable to enable clock for pending IRQs\n"); "unable to enable clock for pending IRQs\n");
return; goto out;
} }
} }
@ -652,6 +653,7 @@ static void exynos_irq_demux_eint16_31(struct irq_desc *desc)
if (eintd->nr_banks) if (eintd->nr_banks)
clk_disable(eintd->banks[0]->drvdata->pclk); clk_disable(eintd->banks[0]->drvdata->pclk);
out:
chained_irq_exit(chip, desc); chained_irq_exit(chip, desc);
} }

View file

@ -1172,7 +1172,7 @@ static void samsung_banks_node_get(struct device *dev, struct samsung_pinctrl_dr
else else
dev_warn(dev, "Missing node for bank %s - invalid DTB\n", dev_warn(dev, "Missing node for bank %s - invalid DTB\n",
bank->name); bank->name);
/* child reference dropped in samsung_drop_banks_of_node() */ /* child reference dropped in samsung_banks_node_put() */
} }
} }
@ -1272,7 +1272,7 @@ static int samsung_pinctrl_probe(struct platform_device *pdev)
ret = platform_get_irq_optional(pdev, 0); ret = platform_get_irq_optional(pdev, 0);
if (ret < 0 && ret != -ENXIO) if (ret < 0 && ret != -ENXIO)
return ret; goto err_put_banks;
if (ret > 0) if (ret > 0)
drvdata->irq = ret; drvdata->irq = ret;

View file

@ -22,6 +22,7 @@
#include <linux/reset.h> #include <linux/reset.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string_choices.h>
#include <linux/pinctrl/consumer.h> #include <linux/pinctrl/consumer.h>
#include <linux/pinctrl/machine.h> #include <linux/pinctrl/machine.h>
@ -86,7 +87,6 @@ struct stm32_pinctrl_group {
struct stm32_gpio_bank { struct stm32_gpio_bank {
void __iomem *base; void __iomem *base;
struct clk *clk;
struct reset_control *rstc; struct reset_control *rstc;
spinlock_t lock; spinlock_t lock;
struct gpio_chip gpio_chip; struct gpio_chip gpio_chip;
@ -108,6 +108,7 @@ struct stm32_pinctrl {
unsigned ngroups; unsigned ngroups;
const char **grp_names; const char **grp_names;
struct stm32_gpio_bank *banks; struct stm32_gpio_bank *banks;
struct clk_bulk_data *clks;
unsigned nbanks; unsigned nbanks;
const struct stm32_pinctrl_match_data *match_data; const struct stm32_pinctrl_match_data *match_data;
struct irq_domain *domain; struct irq_domain *domain;
@ -1217,7 +1218,7 @@ static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev,
case 0: case 0:
val = stm32_pconf_get(bank, offset, true); val = stm32_pconf_get(bank, offset, true);
seq_printf(s, "- %s - %s", seq_printf(s, "- %s - %s",
val ? "high" : "low", str_high_low(val),
biasing[bias]); biasing[bias]);
break; break;
@ -1227,7 +1228,7 @@ static void stm32_pconf_dbg_show(struct pinctrl_dev *pctldev,
speed = stm32_pconf_get_speed(bank, offset); speed = stm32_pconf_get_speed(bank, offset);
val = stm32_pconf_get(bank, offset, false); val = stm32_pconf_get(bank, offset, false);
seq_printf(s, "- %s - %s - %s - %s %s", seq_printf(s, "- %s - %s - %s - %s %s",
val ? "high" : "low", str_high_low(val),
drive ? "open drain" : "push pull", drive ? "open drain" : "push pull",
biasing[bias], biasing[bias],
speeds[speed], "speed"); speeds[speed], "speed");
@ -1308,12 +1309,6 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
if (IS_ERR(bank->base)) if (IS_ERR(bank->base))
return PTR_ERR(bank->base); return PTR_ERR(bank->base);
err = clk_prepare_enable(bank->clk);
if (err) {
dev_err(dev, "failed to prepare_enable clk (%d)\n", err);
return err;
}
bank->gpio_chip = stm32_gpio_template; bank->gpio_chip = stm32_gpio_template;
fwnode_property_read_string(fwnode, "st,bank-name", &bank->gpio_chip.label); fwnode_property_read_string(fwnode, "st,bank-name", &bank->gpio_chip.label);
@ -1360,26 +1355,20 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
bank->fwnode, &stm32_gpio_domain_ops, bank->fwnode, &stm32_gpio_domain_ops,
bank); bank);
if (!bank->domain) { if (!bank->domain)
err = -ENODEV; return -ENODEV;
goto err_clk;
}
} }
names = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL); names = devm_kcalloc(dev, npins, sizeof(char *), GFP_KERNEL);
if (!names) { if (!names)
err = -ENOMEM; return -ENOMEM;
goto err_clk;
}
for (i = 0; i < npins; i++) { for (i = 0; i < npins; i++) {
stm32_pin = stm32_pctrl_get_desc_pin_from_gpio(pctl, bank, i); stm32_pin = stm32_pctrl_get_desc_pin_from_gpio(pctl, bank, i);
if (stm32_pin && stm32_pin->pin.name) { if (stm32_pin && stm32_pin->pin.name) {
names[i] = devm_kasprintf(dev, GFP_KERNEL, "%s", stm32_pin->pin.name); names[i] = devm_kasprintf(dev, GFP_KERNEL, "%s", stm32_pin->pin.name);
if (!names[i]) { if (!names[i])
err = -ENOMEM; return -ENOMEM;
goto err_clk;
}
} else { } else {
names[i] = NULL; names[i] = NULL;
} }
@ -1390,15 +1379,11 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
err = gpiochip_add_data(&bank->gpio_chip, bank); err = gpiochip_add_data(&bank->gpio_chip, bank);
if (err) { if (err) {
dev_err(dev, "Failed to add gpiochip(%d)!\n", bank_nr); dev_err(dev, "Failed to add gpiochip(%d)!\n", bank_nr);
goto err_clk; return err;
} }
dev_info(dev, "%s bank added\n", bank->gpio_chip.label); dev_info(dev, "%s bank added\n", bank->gpio_chip.label);
return 0; return 0;
err_clk:
clk_disable_unprepare(bank->clk);
return err;
} }
static struct irq_domain *stm32_pctrl_get_irq_domain(struct platform_device *pdev) static struct irq_domain *stm32_pctrl_get_irq_domain(struct platform_device *pdev)
@ -1621,6 +1606,11 @@ int stm32_pctl_probe(struct platform_device *pdev)
if (!pctl->banks) if (!pctl->banks)
return -ENOMEM; return -ENOMEM;
pctl->clks = devm_kcalloc(dev, banks, sizeof(*pctl->clks),
GFP_KERNEL);
if (!pctl->clks)
return -ENOMEM;
i = 0; i = 0;
for_each_gpiochip_node(dev, child) { for_each_gpiochip_node(dev, child) {
struct stm32_gpio_bank *bank = &pctl->banks[i]; struct stm32_gpio_bank *bank = &pctl->banks[i];
@ -1632,24 +1622,27 @@ int stm32_pctl_probe(struct platform_device *pdev)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
bank->clk = of_clk_get_by_name(np, NULL); pctl->clks[i].clk = of_clk_get_by_name(np, NULL);
if (IS_ERR(bank->clk)) { if (IS_ERR(pctl->clks[i].clk)) {
fwnode_handle_put(child); fwnode_handle_put(child);
return dev_err_probe(dev, PTR_ERR(bank->clk), return dev_err_probe(dev, PTR_ERR(pctl->clks[i].clk),
"failed to get clk\n"); "failed to get clk\n");
} }
pctl->clks[i].id = "pctl";
i++; i++;
} }
ret = clk_bulk_prepare_enable(banks, pctl->clks);
if (ret) {
dev_err(dev, "failed to prepare_enable clk (%d)\n", ret);
return ret;
}
for_each_gpiochip_node(dev, child) { for_each_gpiochip_node(dev, child) {
ret = stm32_gpiolib_register_bank(pctl, child); ret = stm32_gpiolib_register_bank(pctl, child);
if (ret) { if (ret) {
fwnode_handle_put(child); fwnode_handle_put(child);
goto err_register;
for (i = 0; i < pctl->nbanks; i++)
clk_disable_unprepare(pctl->banks[i].clk);
return ret;
} }
pctl->nbanks++; pctl->nbanks++;
@ -1658,6 +1651,15 @@ int stm32_pctl_probe(struct platform_device *pdev)
dev_info(dev, "Pinctrl STM32 initialized\n"); dev_info(dev, "Pinctrl STM32 initialized\n");
return 0; return 0;
err_register:
for (i = 0; i < pctl->nbanks; i++) {
struct stm32_gpio_bank *bank = &pctl->banks[i];
gpiochip_remove(&bank->gpio_chip);
}
clk_bulk_disable_unprepare(banks, pctl->clks);
return ret;
} }
static int __maybe_unused stm32_pinctrl_restore_gpio_regs( static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
@ -1726,10 +1728,8 @@ static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
int __maybe_unused stm32_pinctrl_suspend(struct device *dev) int __maybe_unused stm32_pinctrl_suspend(struct device *dev)
{ {
struct stm32_pinctrl *pctl = dev_get_drvdata(dev); struct stm32_pinctrl *pctl = dev_get_drvdata(dev);
int i;
for (i = 0; i < pctl->nbanks; i++) clk_bulk_disable(pctl->nbanks, pctl->clks);
clk_disable(pctl->banks[i].clk);
return 0; return 0;
} }
@ -1738,10 +1738,11 @@ int __maybe_unused stm32_pinctrl_resume(struct device *dev)
{ {
struct stm32_pinctrl *pctl = dev_get_drvdata(dev); struct stm32_pinctrl *pctl = dev_get_drvdata(dev);
struct stm32_pinctrl_group *g = pctl->groups; struct stm32_pinctrl_group *g = pctl->groups;
int i; int i, ret;
for (i = 0; i < pctl->nbanks; i++) ret = clk_bulk_enable(pctl->nbanks, pctl->clks);
clk_enable(pctl->banks[i].clk); if (ret)
return ret;
for (i = 0; i < pctl->ngroups; i++, g++) for (i = 0; i < pctl->ngroups; i++, g++)
stm32_pinctrl_restore_gpio_regs(pctl, g->pin); stm32_pinctrl_restore_gpio_regs(pctl, g->pin);

View file

@ -256,72 +256,84 @@ static const struct sunxi_desc_pin a100_pins[] = {
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D12 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D12 */
SUNXI_FUNCTION(0x3, "lvds0"), /* D3P */
SUNXI_FUNCTION(0x4, "dsi0"), /* DP3 */ SUNXI_FUNCTION(0x4, "dsi0"), /* DP3 */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 8)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 8)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D13 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D13 */
SUNXI_FUNCTION(0x3, "lvds0"), /* D3N */
SUNXI_FUNCTION(0x4, "dsi0"), /* DM3 */ SUNXI_FUNCTION(0x4, "dsi0"), /* DM3 */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 9)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 9)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D14 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D14 */
SUNXI_FUNCTION(0x3, "lvds1"), /* D0P */
SUNXI_FUNCTION(0x4, "spi1"), /* CS */ SUNXI_FUNCTION(0x4, "spi1"), /* CS */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 10)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 10)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D15 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D15 */
SUNXI_FUNCTION(0x3, "lvds1"), /* D0N */
SUNXI_FUNCTION(0x4, "spi1"), /* CLK */ SUNXI_FUNCTION(0x4, "spi1"), /* CLK */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 11)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 11)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D18 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D18 */
SUNXI_FUNCTION(0x3, "lvds1"), /* D1P */
SUNXI_FUNCTION(0x4, "spi1"), /* MOSI */ SUNXI_FUNCTION(0x4, "spi1"), /* MOSI */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 12)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 12)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D19 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D19 */
SUNXI_FUNCTION(0x3, "lvds1"), /* D1N */
SUNXI_FUNCTION(0x4, "spi1"), /* MISO */ SUNXI_FUNCTION(0x4, "spi1"), /* MISO */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 13)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 13)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D20 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D20 */
SUNXI_FUNCTION(0x3, "lvds1"), /* D2P */
SUNXI_FUNCTION(0x4, "uart3"), /* TX */ SUNXI_FUNCTION(0x4, "uart3"), /* TX */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 14)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 14)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D21 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D21 */
SUNXI_FUNCTION(0x3, "lvds1"), /* D2N */
SUNXI_FUNCTION(0x4, "uart3"), /* RX */ SUNXI_FUNCTION(0x4, "uart3"), /* RX */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 15)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 15)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D22 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D22 */
SUNXI_FUNCTION(0x3, "lvds1"), /* CKP */
SUNXI_FUNCTION(0x4, "uart3"), /* RTS */ SUNXI_FUNCTION(0x4, "uart3"), /* RTS */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 16)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 16)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* D23 */ SUNXI_FUNCTION(0x2, "lcd0"), /* D23 */
SUNXI_FUNCTION(0x3, "lvds1"), /* CKN */
SUNXI_FUNCTION(0x4, "uart3"), /* CTS */ SUNXI_FUNCTION(0x4, "uart3"), /* CTS */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 17)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 17)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 18),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* CLK */ SUNXI_FUNCTION(0x2, "lcd0"), /* CLK */
SUNXI_FUNCTION(0x3, "lvds1"), /* D3P */
SUNXI_FUNCTION(0x4, "uart4"), /* TX */ SUNXI_FUNCTION(0x4, "uart4"), /* TX */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 18)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 18)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 19),
SUNXI_FUNCTION(0x0, "gpio_in"), SUNXI_FUNCTION(0x0, "gpio_in"),
SUNXI_FUNCTION(0x1, "gpio_out"), SUNXI_FUNCTION(0x1, "gpio_out"),
SUNXI_FUNCTION(0x2, "lcd0"), /* DE */ SUNXI_FUNCTION(0x2, "lcd0"), /* DE */
SUNXI_FUNCTION(0x3, "lvds1"), /* D3N */
SUNXI_FUNCTION(0x4, "uart4"), /* RX */ SUNXI_FUNCTION(0x4, "uart4"), /* RX */
SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 19)), SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 19)),
SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20), SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 20),

View file

@ -0,0 +1,41 @@
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/*
* This header provides constants for Renesas RZ/G3E family pinctrl bindings.
*
* Copyright (C) 2024 Renesas Electronics Corp.
*
*/
#ifndef __DT_BINDINGS_PINCTRL_RENESAS_R9A09G047_PINCTRL_H__
#define __DT_BINDINGS_PINCTRL_RENESAS_R9A09G047_PINCTRL_H__
#include <dt-bindings/pinctrl/rzg2l-pinctrl.h>
/* RZG3E_Px = Offset address of PFC_P_mn - 0x20 */
#define RZG3E_P0 0
#define RZG3E_P1 1
#define RZG3E_P2 2
#define RZG3E_P3 3
#define RZG3E_P4 4
#define RZG3E_P5 5
#define RZG3E_P6 6
#define RZG3E_P7 7
#define RZG3E_P8 8
#define RZG3E_PA 10
#define RZG3E_PB 11
#define RZG3E_PC 12
#define RZG3E_PD 13
#define RZG3E_PE 14
#define RZG3E_PF 15
#define RZG3E_PG 16
#define RZG3E_PH 17
#define RZG3E_PJ 19
#define RZG3E_PK 20
#define RZG3E_PL 21
#define RZG3E_PM 22
#define RZG3E_PS 28
#define RZG3E_PORT_PINMUX(b, p, f) RZG2L_PORT_PINMUX(RZG3E_P##b, p, f)
#define RZG3E_GPIO(port, pin) RZG2L_GPIO(RZG3E_P##port, pin)
#endif /* __DT_BINDINGS_PINCTRL_RENESAS_R9A09G047_PINCTRL_H__ */

View file

@ -0,0 +1,31 @@
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
/*
* This header provides constants for Renesas RZ/V2H family pinctrl bindings.
*
* Copyright (C) 2024 Renesas Electronics Corp.
*
*/
#ifndef __DT_BINDINGS_PINCTRL_RENESAS_R9A09G057_PINCTRL_H__
#define __DT_BINDINGS_PINCTRL_RENESAS_R9A09G057_PINCTRL_H__
#include <dt-bindings/pinctrl/rzg2l-pinctrl.h>
/* RZV2H_Px = Offset address of PFC_P_mn - 0x20 */
#define RZV2H_P0 0
#define RZV2H_P1 1
#define RZV2H_P2 2
#define RZV2H_P3 3
#define RZV2H_P4 4
#define RZV2H_P5 5
#define RZV2H_P6 6
#define RZV2H_P7 7
#define RZV2H_P8 8
#define RZV2H_P9 9
#define RZV2H_PA 10
#define RZV2H_PB 11
#define RZV2H_PORT_PINMUX(b, p, f) RZG2L_PORT_PINMUX(RZV2H_P##b, p, f)
#define RZV2H_GPIO(port, pin) RZG2L_GPIO(RZV2H_P##port, pin)
#endif /* __DT_BINDINGS_PINCTRL_RENESAS_R9A09G057_PINCTRL_H__ */