2
0
mirror of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git synced 2025-09-04 20:19:47 +08:00

Pin control changes for v6.17

Core changes:
 
 - Open code PINCTRL_FUNCTION_DESC() instead of defining
   a complex macro only used in one place.
 
 - Add pinmux_generic_add_pinfunction() helper and
   use this in a few drivers.
 
 New drivers:
 
 - Amlogic S7, S7D and S6 pin control support.
 
 - Eswin EIC7700 pin control support.
 
 - Qualcomm PMIV0104, PM7550 and Milos pin control
   support.
 
   Because of unhelpful numbering schemes, the Qualcomm
   driver now needs to start to rely on SoC codenames.
 
 - STM32 HDP pin control support.
 
 - Mediatek MT8189 pin control support.
 
 Improvements:
 
 - Switch remaining pin control drivers over to the
   new GPIO set callback that provides a return value.
 
 - Support RSVD (reserved) pins in the STM32 driver.
 
 - Move many fixed assignments over to pinctrl_desc
   definitions.
 
 - Handle multiple TLMM regions in the Qualcomm driver.
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEElDRnuGcz/wPCXQWMQRCzN7AZXXMFAmiN/SkACgkQQRCzN7AZ
 XXPeGw/7BMBf6Uuhs39qHjnLUUgp/H2yzRV7JB3Q99AZh++7mK0z4MchsZfjvXmv
 Ql2ADPHzmP9AJwSor/Ssvn4SrPwvC62IFBznB4eqPIL4UgWuIEYSJQNFMbZniFex
 kd8+7GAK7K5R5ReIWfUCs3xusO4+MShXZNKkWVaQZT+603kVznADGANBbEkOnXxY
 06JKEo++QuChvLMckGOzyW8zAOV68YM2VYaZkuxxCIaIwKoNzGPKDt8NpPvaIijE
 S6EhrhRiM595Jt+qAC6lWtwGnFL5DI69Au2IDzaOSyamNLBoA/bmUu9UWB6/HxW2
 yOhDW3DbXOB2xhUORlwCBtGsDyxLB9cIyBMjr6JantwPHdz8dzetxaTrwpuNdBQ+
 +BgTodEuZf+TXroUQZ5sPRycEKZm1rtO7ctiZ5bG+CtP8qXcc+enMmC8BSCNCWzl
 bMOLsvP4ZMOuVU2ryOvhqKnbWxLS2RV5nHChtTF2JoE4ZX0dN/dhvGOe/A4dINhG
 3Nb+ETmyEnid9PIPARYNy/7BkT92eEUQJlbI9qeU1AojGmRRQLS3+mJD9VcFSe1F
 /sjp5OYL2M/7SUpqBtlapLXN014gSAVV7zzQThndOYf8RJgohQkOWZsZUx7jyieA
 4VYQzLWKAfP/IdOnKzM/8mAHw6VT9gJiWtNsc8ZdeYMwhYGSbbM=
 =hEj7
 -----END PGP SIGNATURE-----

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

Pull pin control updates from Linus Walleij:
 "Nothing stands out, apart from maybe the interesting Eswin EIC7700, a
  RISC-V SoC I've never seen before.

  Core changes:

   - Open code PINCTRL_FUNCTION_DESC() instead of defining a complex
     macro only used in one place

   - Add pinmux_generic_add_pinfunction() helper and use this in a few
     drivers

  New drivers:

   - Amlogic S7, S7D and S6 pin control support

   - Eswin EIC7700 pin control support

   - Qualcomm PMIV0104, PM7550 and Milos pin control support

     Because of unhelpful numbering schemes, the Qualcomm driver now
     needs to start to rely on SoC codenames

   - STM32 HDP pin control support

   - Mediatek MT8189 pin control support

  Improvements:

   - Switch remaining pin control drivers over to the new GPIO set
     callback that provides a return value

   - Support RSVD (reserved) pins in the STM32 driver

   - Move many fixed assignments over to pinctrl_desc definitions

   - Handle multiple TLMM regions in the Qualcomm driver"

* tag 'pinctrl-v6.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (105 commits)
  pinctrl: mediatek: Add pinctrl driver for mt8189
  dt-bindings: pinctrl: mediatek: Add support for mt8189
  pinctrl: aspeed-g6: Add PCIe RC PERST pin group
  pinctrl: ingenic: use pinmux_generic_add_pinfunction()
  pinctrl: keembay: use pinmux_generic_add_pinfunction()
  pinctrl: mediatek: moore: use pinmux_generic_add_pinfunction()
  pinctrl: airoha: use pinmux_generic_add_pinfunction()
  pinctrl: equilibrium: use pinmux_generic_add_pinfunction()
  pinctrl: provide pinmux_generic_add_pinfunction()
  pinctrl: pinmux: open-code PINCTRL_FUNCTION_DESC()
  pinctrl: ma35: use new GPIO line value setter callbacks
  MAINTAINERS: add Clément Le Goffic as STM32 HDP maintainer
  pinctrl: stm32: Introduce HDP driver
  dt-bindings: pinctrl: stm32: Introduce HDP
  pinctrl: qcom: Add Milos pinctrl driver
  dt-bindings: pinctrl: document the Milos Top Level Mode Multiplexer
  pinctrl: qcom: spmi: Add PM7550
  dt-bindings: pinctrl: qcom,pmic-gpio: Add PM7550 support
  pinctrl: qcom: spmi: Add PMIV0104
  dt-bindings: pinctrl: qcom,pmic-gpio: Add PMIV0104 support
  ...
This commit is contained in:
Linus Torvalds 2025-08-02 12:07:09 -07:00
commit 186f3edfdd
109 changed files with 8736 additions and 558 deletions

View File

@ -15,11 +15,18 @@ allOf:
properties:
compatible:
oneOf:
- const: amlogic,pinctrl-a4
- enum:
- amlogic,pinctrl-a4
- amlogic,pinctrl-s6
- amlogic,pinctrl-s7
- items:
- enum:
- amlogic,pinctrl-a5
- const: amlogic,pinctrl-a4
- items:
- enum:
- amlogic,pinctrl-s7d
- const: amlogic,pinctrl-s7
"#address-cells":
const: 2

View File

@ -0,0 +1,156 @@
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/eswin,eic7700-pinctrl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Eswin Eic7700 Pinctrl
maintainers:
- Yulin Lu <luyulin@eswincomputing.com>
allOf:
- $ref: pinctrl.yaml#
description: |
eic7700 pin configuration nodes act as a container for an arbitrary number of
subnodes. Each of these subnodes represents some desired configuration for one or
more pins. This configuration can include the mux function to select on those pin(s),
and various pin configuration parameters, such as input-enable, pull-up, etc.
properties:
compatible:
const: eswin,eic7700-pinctrl
reg:
maxItems: 1
vrgmii-supply:
description:
Regulator supply for the RGMII interface IO power domain.
This property should reference a regulator that provides either 1.8V or 3.3V,
depending on the board-level voltage configuration required by the RGMII interface.
patternProperties:
'-grp$':
type: object
additionalProperties: false
patternProperties:
'-pins$':
type: object
properties:
pins:
description:
For eic7700, specifies the name(s) of one or more pins to be configured by
this node.
items:
enum: [ chip_mode, mode_set0, mode_set1, mode_set2, mode_set3, xin,
rst_out_n, key_reset_n, gpio0, por_sel, jtag0_tck, jtag0_tms,
jtag0_tdi, jtag0_tdo, gpio5, spi2_cs0_n, jtag1_tck, jtag1_tms,
jtag1_tdi, jtag1_tdo, gpio11, spi2_cs1_n, pcie_clkreq_n,
pcie_wake_n, pcie_perst_n, hdmi_scl, hdmi_sda, hdmi_cec,
jtag2_trst, rgmii0_clk_125, rgmii0_txen, rgmii0_txclk,
rgmii0_txd0, rgmii0_txd1, rgmii0_txd2, rgmii0_txd3, i2s0_bclk,
i2s0_wclk, i2s0_sdi, i2s0_sdo, i2s_mclk, rgmii0_rxclk,
rgmii0_rxdv, rgmii0_rxd0, rgmii0_rxd1, rgmii0_rxd2, rgmii0_rxd3,
i2s2_bclk, i2s2_wclk, i2s2_sdi, i2s2_sdo, gpio27, gpio28, gpio29,
rgmii0_mdc, rgmii0_mdio, rgmii0_intb, rgmii1_clk_125, rgmii1_txen,
rgmii1_txclk, rgmii1_txd0, rgmii1_txd1, rgmii1_txd2, rgmii1_txd3,
i2s1_bclk, i2s1_wclk, i2s1_sdi, i2s1_sdo, gpio34, rgmii1_rxclk,
rgmii1_rxdv, rgmii1_rxd0, rgmii1_rxd1, rgmii1_rxd2, rgmii1_rxd3,
spi1_cs0_n, spi1_clk, spi1_d0, spi1_d1, spi1_d2, spi1_d3, spi1_cs1_n,
rgmii1_mdc, rgmii1_mdio, rgmii1_intb, usb0_pwren, usb1_pwren,
i2c0_scl, i2c0_sda, i2c1_scl, i2c1_sda, i2c2_scl, i2c2_sda,
i2c3_scl, i2c3_sda, i2c4_scl, i2c4_sda, i2c5_scl, i2c5_sda,
uart0_tx, uart0_rx, uart1_tx, uart1_rx, uart1_cts, uart1_rts,
uart2_tx, uart2_rx, jtag2_tck, jtag2_tms, jtag2_tdi, jtag2_tdo,
fan_pwm, fan_tach, mipi_csi0_xvs, mipi_csi0_xhs, mipi_csi0_mclk,
mipi_csi1_xvs, mipi_csi1_xhs, mipi_csi1_mclk, mipi_csi2_xvs,
mipi_csi2_xhs, mipi_csi2_mclk, mipi_csi3_xvs, mipi_csi3_xhs,
mipi_csi3_mclk, mipi_csi4_xvs, mipi_csi4_xhs, mipi_csi4_mclk,
mipi_csi5_xvs, mipi_csi5_xhs, mipi_csi5_mclk, spi3_cs_n, spi3_clk,
spi3_di, spi3_do, gpio92, gpio93, s_mode, gpio95, spi0_cs_n,
spi0_clk, spi0_d0, spi0_d1, spi0_d2, spi0_d3, i2c10_scl,
i2c10_sda, i2c11_scl, i2c11_sda, gpio106, boot_sel0, boot_sel1,
boot_sel2, boot_sel3, gpio111, lpddr_ref_clk ]
function:
description:
Specify the alternative function to be configured for the
given pins.
enum: [ disabled, boot_sel, chip_mode, emmc, fan_tach,
gpio, hdmi, i2c, i2s, jtag, ddr_ref_clk_sel,
lpddr_ref_clk, mipi_csi, osc, pcie, pwm,
rgmii, reset, sata, sdio, spi, s_mode, uart, usb ]
input-schmitt-enable: true
input-schmitt-disable: true
bias-disable: true
bias-pull-down: true
bias-pull-up: true
input-enable: true
input-disable: true
drive-strength-microamp: true
required:
- pins
additionalProperties: false
allOf:
- $ref: pincfg-node.yaml#
- $ref: pinmux-node.yaml#
- if:
properties:
pins:
anyOf:
- pattern: '^rgmii'
- const: lpddr_ref_clk
then:
properties:
drive-strength-microamp:
enum: [3000, 6000, 9000, 12000, 15000, 18000, 21000, 24000]
else:
properties:
drive-strength-microamp:
enum: [6000, 9000, 12000, 15000, 18000, 21000, 24000, 27000]
required:
- compatible
- reg
unevaluatedProperties: false
examples:
- |
pinctrl@51600080 {
compatible = "eswin,eic7700-pinctrl";
reg = <0x51600080 0x1fff80>;
vrgmii-supply = <&vcc_1v8>;
dev-active-grp {
/* group node defining 1 standard pin */
gpio10-pins {
pins = "jtag1_tdo";
function = "gpio";
input-enable;
bias-pull-up;
};
/* group node defining 2 I2C pins */
i2c6-pins {
pins = "uart1_cts", "uart1_rts";
function = "i2c";
};
};
};

View File

@ -0,0 +1,213 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/mediatek,mt8189-pinctrl.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MediaTek MT8189 Pin Controller
maintainers:
- Lei Xue <lei.xue@mediatek.com>
- Cathy Xu <ot_cathy.xu@mediatek.com>
description:
The MediaTek's MT8189 Pin controller is used to control SoC pins.
properties:
compatible:
const: mediatek,mt8189-pinctrl
reg:
items:
- description: gpio base
- description: lm group IO
- description: rb0 group IO
- description: rb1 group IO
- description: bm0 group IO
- description: bm1 group IO
- description: bm2 group IO
- description: lt0 group IO
- description: lt1 group IO
- description: rt group IO
- description: eint0 group IO
- description: eint1 group IO
- description: eint2 group IO
- description: eint3 group IO
- description: eint4 group IO
reg-names:
items:
- const: base
- const: lm
- const: rb0
- const: rb1
- const: bm0
- const: bm1
- const: bm2
- const: lt0
- const: lt1
- const: rt
- const: eint0
- const: eint1
- const: eint2
- const: eint3
- const: eint4
interrupts:
maxItems: 1
interrupt-controller: true
'#interrupt-cells':
const: 2
gpio-controller: true
'#gpio-cells':
const: 2
gpio-ranges:
maxItems: 1
gpio-line-names: true
# PIN CONFIGURATION NODES
patternProperties:
'-pins$':
type: object
additionalProperties: false
patternProperties:
'^pins':
type: object
$ref: /schemas/pinctrl/pincfg-node.yaml
additionalProperties: false
description:
A pinctrl node should contain at least one subnode representing the
pinctrl groups available on the machine. Each subnode will list the
pins it needs, and how they should be configured, with regard to muxer
configuration, pullups, drive strength, input enable/disable and input
schmitt.
properties:
pinmux:
description:
Integer array, represents gpio pin number and mux setting.
Supported pin number and mux varies for different SoCs, and are
defined as macros in arch/arm64/boot/dts/mediatek/mt8189-pinfunc.h
directly, for this SoC.
drive-strength:
enum: [2, 4, 6, 8, 10, 12, 14, 16]
bias-pull-down:
oneOf:
- type: boolean
- enum: [100, 101, 102, 103]
description: mt8189 pull down PUPD/R0/R1 type define value.
- enum: [75000, 5000]
description: mt8189 pull down RSEL type si unit value(ohm).
description: |
For pull down type is normal, it doesn't need add R1R0 define
and resistance value.
For pull down type is PUPD/R0/R1 type, it can add R1R0 define to
set different resistance. It can support "MTK_PUPD_SET_R1R0_00" &
"MTK_PUPD_SET_R1R0_01" & "MTK_PUPD_SET_R1R0_10" &
"MTK_PUPD_SET_R1R0_11" define in mt8189.
For pull down type is PD/RSEL, it can add resistance value(ohm)
to set different resistance by identifying property
"mediatek,rsel-resistance-in-si-unit".
bias-pull-up:
oneOf:
- type: boolean
- enum: [100, 101, 102, 103]
description: mt8189 pull up PUPD/R0/R1 type define value.
- enum: [1000, 1500, 2000, 3000, 4000, 5000, 75000]
description: mt8189 pull up RSEL type si unit value(ohm).
description: |
For pull up type is normal, it don't need add R1R0 define
and resistance value.
For pull up type is PUPD/R0/R1 type, it can add R1R0 define to
set different resistance. It can support "MTK_PUPD_SET_R1R0_00" &
"MTK_PUPD_SET_R1R0_01" & "MTK_PUPD_SET_R1R0_10" &
"MTK_PUPD_SET_R1R0_11" define in mt8189.
For pull up type is PU/RSEL, it can add resistance value(ohm)
to set different resistance by identifying property
"mediatek,rsel-resistance-in-si-unit".
bias-disable: true
output-high: true
output-low: true
input-enable: true
input-disable: true
input-schmitt-enable: true
input-schmitt-disable: true
required:
- pinmux
required:
- compatible
- reg
- interrupts
- interrupt-controller
- '#interrupt-cells'
- gpio-controller
- '#gpio-cells'
- gpio-ranges
additionalProperties: false
examples:
- |
#include <dt-bindings/pinctrl/mt65xx.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#define PINMUX_GPIO51__FUNC_SCL0 (MTK_PIN_NO(51) | 2)
#define PINMUX_GPIO52__FUNC_SDA0 (MTK_PIN_NO(52) | 2)
pio: pinctrl@10005000 {
compatible = "mediatek,mt8189-pinctrl";
reg = <0x10005000 0x1000>,
<0x11b50000 0x1000>,
<0x11c50000 0x1000>,
<0x11c60000 0x1000>,
<0x11d20000 0x1000>,
<0x11d30000 0x1000>,
<0x11d40000 0x1000>,
<0x11e20000 0x1000>,
<0x11e30000 0x1000>,
<0x11f20000 0x1000>,
<0x11ce0000 0x1000>,
<0x11de0000 0x1000>,
<0x11e60000 0x1000>,
<0x1c01e000 0x1000>,
<0x11f00000 0x1000>;
reg-names = "base", "lm", "rb0", "rb1", "bm0" , "bm1",
"bm2", "lt0", "lt1", "rt", "eint0", "eint1",
"eint2", "eint3", "eint4";
gpio-controller;
#gpio-cells = <2>;
gpio-ranges = <&pio 0 0 182>;
interrupt-controller;
interrupts = <GIC_SPI 239 IRQ_TYPE_LEVEL_HIGH 0>;
#interrupt-cells = <2>;
i2c0-pins {
pins {
pinmux = <PINMUX_GPIO51__FUNC_SCL0>,
<PINMUX_GPIO52__FUNC_SDA0>;
bias-disable;
};
};
};

View File

@ -1,71 +0,0 @@
NXP LPC18xx/43xx SCU pin controller Device Tree Bindings
--------------------------------------------------------
Required properties:
- compatible : Should be "nxp,lpc1850-scu"
- reg : Address and length of the register set for the device
- clocks : Clock specifier (see clock bindings for details)
The lpc1850-scu driver uses the generic pin multiplexing and generic pin
configuration documented in pinctrl-bindings.txt.
The following generic nodes are supported:
- function
- pins
- bias-disable
- bias-pull-up
- bias-pull-down
- drive-strength
- input-enable
- input-disable
- input-schmitt-enable
- input-schmitt-disable
- slew-rate
NXP specific properties:
- nxp,gpio-pin-interrupt : Assign pin to gpio pin interrupt controller
irq number 0 to 7. See example below.
Not all pins support all properties so either refer to the NXP 1850/4350
user manual or the pin table in the pinctrl-lpc18xx driver for supported
pin properties.
Example:
pinctrl: pinctrl@40086000 {
compatible = "nxp,lpc1850-scu";
reg = <0x40086000 0x1000>;
clocks = <&ccu1 CLK_CPU_SCU>;
i2c0_pins: i2c0-pins {
i2c0_pins_cfg {
pins = "i2c0_scl", "i2c0_sda";
function = "i2c0";
input-enable;
};
};
uart0_pins: uart0-pins {
uart0_rx_cfg {
pins = "pf_11";
function = "uart0";
bias-disable;
input-enable;
};
uart0_tx_cfg {
pins = "pf_10";
function = "uart0";
bias-disable;
};
};
gpio_joystick_pins: gpio-joystick-pins {
gpio_joystick_1_cfg {
pins = "p9_0";
function = "gpio";
nxp,gpio-pin-interrupt = <0>;
input-enable;
bias-disable;
};
};
};

View File

@ -0,0 +1,79 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/nxp,lpc1850-scu.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: NXP LPC18xx/43xx SCU pin controller
description:
Not all pins support all pin generic node properties so either refer to
the NXP 1850/4350 user manual or the pin table in the pinctrl-lpc18xx
driver for supported pin properties.
maintainers:
- Frank Li <Frank.Li@nxp.com>
properties:
compatible:
const: nxp,lpc1850-scu
reg:
maxItems: 1
clocks:
maxItems: 1
patternProperties:
'-pins$':
type: object
additionalProperties: false
patternProperties:
'_cfg$':
type: object
allOf:
- $ref: pincfg-node.yaml#
- $ref: pinmux-node.yaml#
unevaluatedProperties: false
properties:
nxp,gpio-pin-interrupt:
$ref: /schemas/types.yaml#/definitions/uint32
minimum: 0
maximum: 7
description:
Assign pin to gpio pin interrupt controller
irq number 0 to 7. See example below.
required:
- compatible
- reg
- clocks
allOf:
- $ref: pinctrl.yaml#
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/clock/lpc18xx-ccu.h>
pinctrl@40086000 {
compatible = "nxp,lpc1850-scu";
reg = <0x40086000 0x1000>;
clocks = <&ccu1 CLK_CPU_SCU>;
gpio-joystick-pins {
gpio-joystick-1_cfg {
pins = "p9_0";
function = "gpio";
nxp,gpio-pin-interrupt = <0>;
input-enable;
bias-disable;
};
};
};

View File

@ -0,0 +1,133 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/qcom,milos-tlmm.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Qualcomm Technologies, Inc. Milos TLMM block
maintainers:
- Luca Weiss <luca.weiss@fairphone.com>
description:
Top Level Mode Multiplexer pin controller in Qualcomm Milos SoC.
allOf:
- $ref: /schemas/pinctrl/qcom,tlmm-common.yaml#
properties:
compatible:
const: qcom,milos-tlmm
reg:
maxItems: 1
interrupts:
maxItems: 1
gpio-reserved-ranges:
minItems: 1
maxItems: 84
gpio-line-names:
maxItems: 167
patternProperties:
"-state$":
oneOf:
- $ref: "#/$defs/qcom-milos-tlmm-state"
- patternProperties:
"-pins$":
$ref: "#/$defs/qcom-milos-tlmm-state"
additionalProperties: false
$defs:
qcom-milos-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-5][0-9]|16[0-7])$"
- enum: [ ufs_reset, sdc2_clk, sdc2_cmd, sdc2_data ]
minItems: 1
maxItems: 36
function:
description:
Specify the alternative function to be configured for the specified
pins.
enum: [ gpio, aoss_cti, atest_char, atest_usb, audio_ext_mclk0,
audio_ext_mclk1, audio_ref_clk, cam_mclk, cci_async_in0,
cci_i2c_scl, cci_i2c_sda, cci_timer, coex_uart1_rx,
coex_uart1_tx, dbg_out_clk, ddr_bist_complete, ddr_bist_fail,
ddr_bist_start, ddr_bist_stop, ddr_pxi0, ddr_pxi1, dp0_hot,
egpio, gcc_gp1, gcc_gp2, gcc_gp3, host2wlan_sol, i2s0_data0,
i2s0_data1, i2s0_sck, i2s0_ws, ibi_i3c, jitter_bist, mdp_vsync,
mdp_vsync0_out, mdp_vsync1_out, mdp_vsync2_out, mdp_vsync3_out,
mdp_vsync_e, nav_gpio0, nav_gpio1, nav_gpio2, pcie0_clk_req_n,
pcie1_clk_req_n, phase_flag, pll_bist_sync, pll_clk_aux,
prng_rosc0, prng_rosc1, prng_rosc2, prng_rosc3, qdss_cti,
qdss_gpio, qlink0_enable, qlink0_request, qlink0_wmss,
qlink1_enable, qlink1_request, qlink1_wmss, qspi0, qup0_se0,
qup0_se1, qup0_se2, qup0_se3, qup0_se4, qup0_se5, qup0_se6,
qup1_se0, qup1_se1, qup1_se2, qup1_se3, qup1_se4, qup1_se5,
qup1_se6, resout_gpio_n, sd_write_protect, sdc1_clk, sdc1_cmd,
sdc1_data, sdc1_rclk, sdc2_clk, sdc2_cmd, sdc2_data,
sdc2_fb_clk, tb_trig_sdc1, tb_trig_sdc2, tgu_ch0_trigout,
tgu_ch1_trigout, tmess_prng0, tmess_prng1, tmess_prng2,
tmess_prng3, tsense_pwm1, tsense_pwm2, uim0_clk, uim0_data,
uim0_present, uim0_reset, uim1_clk_mira, uim1_clk_mirb,
uim1_data_mira, uim1_data_mirb, uim1_present_mira,
uim1_present_mirb, uim1_reset_mira, uim1_reset_mirb, usb0_hs,
usb0_phy_ps, vfr_0, vfr_1, vsense_trigger_mirnat, wcn_sw,
wcn_sw_ctrl ]
required:
- pins
required:
- compatible
- reg
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
tlmm: pinctrl@f100000 {
compatible = "qcom,milos-tlmm";
reg = <0x0f100000 0x300000>;
interrupts = <GIC_SPI 208 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
gpio-ranges = <&tlmm 0 0 168>;
gpio-wo-state {
pins = "gpio1";
function = "gpio";
};
qup-uart5-default-state {
pins = "gpio25", "gpio26";
function = "qup0_se5";
drive-strength = <2>;
bias-disable;
};
};
...

View File

@ -27,6 +27,7 @@ properties:
- qcom,pm6450-gpio
- qcom,pm7250b-gpio
- qcom,pm7325-gpio
- qcom,pm7550-gpio
- qcom,pm7550ba-gpio
- qcom,pm8005-gpio
- qcom,pm8018-gpio
@ -64,6 +65,7 @@ properties:
- qcom,pmi8994-gpio
- qcom,pmi8998-gpio
- qcom,pmih0108-gpio
- qcom,pmiv0104-gpio
- qcom,pmk8350-gpio
- qcom,pmk8550-gpio
- qcom,pmm8155au-gpio
@ -228,6 +230,7 @@ allOf:
- qcom,pmc8180-gpio
- qcom,pmc8380-gpio
- qcom,pmi8994-gpio
- qcom,pmiv0104-gpio
- qcom,pmm8155au-gpio
then:
properties:
@ -261,6 +264,7 @@ allOf:
- qcom,pm660l-gpio
- qcom,pm6150l-gpio
- qcom,pm7250b-gpio
- qcom,pm7550-gpio
- qcom,pm8038-gpio
- qcom,pm8150b-gpio
- qcom,pm8150l-gpio

View File

@ -135,7 +135,7 @@ additionalProperties:
description:
Pin bank index.
- minimum: 0
maximum: 13
maximum: 14
description:
Mux 0 means GPIO and mux 1 to N means
the specific device function.

View File

@ -0,0 +1,187 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
# Copyright (C) STMicroelectronics 2025.
%YAML 1.2
---
$id: http://devicetree.org/schemas/pinctrl/st,stm32-hdp.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: STM32 Hardware Debug Port Mux/Config
maintainers:
- Clément LE GOFFIC <legoffic.clement@gmail.com>
description:
STMicroelectronics's STM32 MPUs integrate a Hardware Debug Port (HDP).
It allows to output internal signals on SoC's GPIO.
properties:
compatible:
enum:
- st,stm32mp131-hdp
- st,stm32mp151-hdp
- st,stm32mp251-hdp
reg:
maxItems: 1
clocks:
maxItems: 1
patternProperties:
"^hdp[0-7]-pins$":
type: object
$ref: pinmux-node.yaml#
additionalProperties: false
properties:
pins:
pattern: '^HDP[0-7]$'
function: true
required:
- function
- pins
allOf:
- $ref: pinctrl.yaml#
- if:
properties:
compatible:
contains:
const: st,stm32mp131-hdp
then:
patternProperties:
"^hdp[0-7]-pins$":
properties:
function:
enum: [ pwr_pwrwake_sys, pwr_stop_forbidden, pwr_stdby_wakeup, pwr_encomp_vddcore,
bsec_out_sec_niden, aiec_sys_wakeup, none, ddrctrl_lp_req,
pwr_ddr_ret_enable_n, dts_clk_ptat, sram3ctrl_tamp_erase_act, gpoval0,
pwr_sel_vth_vddcpu, pwr_mpu_ram_lowspeed, ca7_naxierrirq, pwr_okin_mr,
bsec_out_sec_dbgen, aiec_c1_wakeup, rcc_pwrds_mpu, ddrctrl_dfi_ctrlupd_req,
ddrctrl_cactive_ddrc_asr, sram3ctrl_hw_erase_act, nic400_s0_bready, gpoval1,
pwr_pwrwake_mpu, pwr_mpu_clock_disable_ack, ca7_ndbgreset_i,
bsec_in_rstcore_n, bsec_out_sec_bsc_dis, ddrctrl_dfi_init_complete,
ddrctrl_perf_op_is_refresh, ddrctrl_gskp_dfi_lp_req, sram3ctrl_sw_erase_act,
nic400_s0_bvalid, gpoval2, pwr_sel_vth_vddcore, pwr_mpu_clock_disable_req,
ca7_npmuirq0, ca7_nfiqout0, bsec_out_sec_dftlock, bsec_out_sec_jtag_dis,
rcc_pwrds_sys, sram3ctrl_tamp_erase_req, ddrctrl_stat_ddrc_reg_selfref_type0,
dts_valobus1_0, dts_valobus2_0, tamp_potential_tamp_erfcfg, nic400_s0_wready,
nic400_s0_rready, gpoval3, pwr_stop2_active, ca7_nl2reset_i,
ca7_npreset_varm_i, bsec_out_sec_dften, bsec_out_sec_dbgswenable,
eth1_out_pmt_intr_o, eth2_out_pmt_intr_o, ddrctrl_stat_ddrc_reg_selfref_type1,
ddrctrl_cactive_0, dts_valobus1_1, dts_valobus2_1, tamp_nreset_sram_ercfg,
nic400_s0_wlast, nic400_s0_rlast, gpoval4, ca7_standbywfil2,
pwr_vth_vddcore_ack, ca7_ncorereset_i, ca7_nirqout0, bsec_in_pwrok,
bsec_out_sec_deviceen, eth1_out_lpi_intr_o, eth2_out_lpi_intr_o,
ddrctrl_cactive_ddrc, ddrctrl_wr_credit_cnt, dts_valobus1_2, dts_valobus2_2,
pka_pka_itamp_out, nic400_s0_wvalid, nic400_s0_rvalid, gpoval5,
ca7_standbywfe0, pwr_vth_vddcpu_ack, ca7_evento, bsec_in_tamper_det,
bsec_out_sec_spniden, eth1_out_mac_speed_o1, eth2_out_mac_speed_o1,
ddrctrl_csysack_ddrc, ddrctrl_lpr_credit_cnt, dts_valobus1_3, dts_valobus2_3,
saes_tamper_out, nic400_s0_awready, nic400_s0_arready, gpoval6,
ca7_standbywfi0, pwr_rcc_vcpu_rdy, ca7_eventi, ca7_dbgack0, bsec_out_fuse_ok,
bsec_out_sec_spiden, eth1_out_mac_speed_o0, eth2_out_mac_speed_o0,
ddrctrl_csysreq_ddrc, ddrctrl_hpr_credit_cnt, dts_valobus1_4, dts_valobus2_4,
rng_tamper_out, nic400_s0_awavalid, nic400_s0_aravalid, gpoval7 ]
- if:
properties:
compatible:
contains:
const: st,stm32mp151-hdp
then:
patternProperties:
"^hdp[0-7]-pins$":
properties:
function:
enum: [ pwr_pwrwake_sys, cm4_sleepdeep, pwr_stdby_wkup, pwr_encomp_vddcore,
bsec_out_sec_niden, none, rcc_cm4_sleepdeep, gpu_dbg7, ddrctrl_lp_req,
pwr_ddr_ret_enable_n, dts_clk_ptat, gpoval0, pwr_pwrwake_mcu, cm4_halted,
ca7_naxierrirq, pwr_okin_mr, bsec_out_sec_dbgen, exti_sys_wakeup,
rcc_pwrds_mpu, gpu_dbg6, ddrctrl_dfi_ctrlupd_req, ddrctrl_cactive_ddrc_asr,
gpoval1, pwr_pwrwake_mpu, cm4_rxev, ca7_npmuirq1, ca7_nfiqout1,
bsec_in_rstcore_n, exti_c2_wakeup, rcc_pwrds_mcu, gpu_dbg5,
ddrctrl_dfi_init_complete, ddrctrl_perf_op_is_refresh,
ddrctrl_gskp_dfi_lp_req, gpoval2, pwr_sel_vth_vddcore, cm4_txev, ca7_npmuirq0,
ca7_nfiqout0, bsec_out_sec_dftlock, exti_c1_wakeup, rcc_pwrds_sys, gpu_dbg4,
ddrctrl_stat_ddrc_reg_selfref_type0, ddrctrl_cactive_1, dts_valobus1_0,
dts_valobus2_0, gpoval3, pwr_mpu_pdds_not_cstbydis, cm4_sleeping, ca7_nreset1,
ca7_nirqout1, bsec_out_sec_dften, bsec_out_sec_dbgswenable,
eth_out_pmt_intr_o, gpu_dbg3, ddrctrl_stat_ddrc_reg_selfref_type1,
ddrctrl_cactive_0, dts_valobus1_1, dts_valobus2_1, gpoval4, ca7_standbywfil2,
pwr_vth_vddcore_ack, ca7_nreset0, ca7_nirqout0, bsec_in_pwrok,
bsec_out_sec_deviceen, eth_out_lpi_intr_o, gpu_dbg2, ddrctrl_cactive_ddrc,
ddrctrl_wr_credit_cnt, dts_valobus1_2, dts_valobus2_2, gpoval5,
ca7_standbywfi1, ca7_standbywfe1, ca7_evento, ca7_dbgack1,
bsec_out_sec_spniden, eth_out_mac_speed_o1, gpu_dbg1, ddrctrl_csysack_ddrc,
ddrctrl_lpr_credit_cnt, dts_valobus1_3, dts_valobus2_3, gpoval6,
ca7_standbywfi0, ca7_standbywfe0, ca7_dbgack0, bsec_out_fuse_ok,
bsec_out_sec_spiden, eth_out_mac_speed_o0, gpu_dbg0, ddrctrl_csysreq_ddrc,
ddrctrl_hpr_credit_cnt, dts_valobus1_4, dts_valobus2_4, gpoval7 ]
- if:
properties:
compatible:
contains:
const: st,stm32mp251-hdp
then:
patternProperties:
"^hdp[0-7]-pins$":
properties:
function:
enum: [ pwr_pwrwake_sys, cpu2_sleep_deep, bsec_out_tst_sdr_unlock_or_disable_scan,
bsec_out_nidenm, bsec_out_nidena, cpu2_state_0, rcc_pwrds_sys, gpu_dbg7,
ddrss_csysreq_ddrc, ddrss_dfi_phyupd_req, cpu3_sleep_deep,
d2_gbl_per_clk_bus_req, pcie_usb_cxpl_debug_info_ei_0,
pcie_usb_cxpl_debug_info_ei_8, d3_state_0, gpoval0, pwr_pwrwake_cpu2,
cpu2_halted, cpu2_state_1, bsec_out_dbgenm, bsec_out_dbgena, exti1_sys_wakeup,
rcc_pwrds_cpu2, gpu_dbg6, ddrss_csysack_ddrc, ddrss_dfi_phymstr_req,
cpu3_halted, d2_gbl_per_dma_req, pcie_usb_cxpl_debug_info_ei_1,
pcie_usb_cxpl_debug_info_ei_9, d3_state_1, gpoval1, pwr_pwrwake_cpu1,
cpu2_rxev, cpu1_npumirq1, cpu1_nfiqout1, bsec_out_shdbgen, exti1_cpu2_wakeup,
rcc_pwrds_cpu1, gpu_dbg5, ddrss_cactive_ddrc, ddrss_dfi_lp_req, cpu3_rxev,
hpdma1_clk_bus_req, pcie_usb_cxpl_debug_info_ei_2,
pcie_usb_cxpl_debug_info_ei_10, d3_state_2, gpoval2, pwr_sel_vth_vddcpu,
cpu2_txev, cpu1_npumirq0, cpu1_nfiqout0, bsec_out_ddbgen, exti1_cpu1_wakeup,
cpu3_state_0, gpu_dbg4, ddrss_mcdcg_en, ddrss_dfi_freq_0, cpu3_txev,
hpdma2_clk_bus_req, pcie_usb_cxpl_debug_info_ei_3,
pcie_usb_cxpl_debug_info_ei_11, d1_state_0, gpoval3, pwr_sel_vth_vddcore,
cpu2_sleeping, cpu1_evento, cpu1_nirqout1, bsec_out_spnidena, exti2_d3_wakeup,
eth1_out_pmt_intr_o, gpu_dbg3, ddrss_dphycg_en, ddrss_obsp0, cpu3_sleeping,
hpdma3_clk_bus_req, pcie_usb_cxpl_debug_info_ei_4,
pcie_usb_cxpl_debug_info_ei_12, d1_state_1, gpoval4, cpu1_standby_wfil2,
none, cpu1_nirqout0, bsec_out_spidena, exti2_cpu3_wakeup, eth1_out_lpi_intr_o,
gpu_dbg2, ddrctrl_dfi_init_start, ddrss_obsp1, cpu3_state_1,
d3_gbl_per_clk_bus_req, pcie_usb_cxpl_debug_info_ei_5,
pcie_usb_cxpl_debug_info_ei_13, d1_state_2, gpoval5, cpu1_standby_wfi1,
cpu1_standby_wfe1, cpu1_halted1, cpu1_naxierrirq, bsec_out_spnidenm,
exti2_cpu2_wakeup, eth2_out_pmt_intr_o, gpu_dbg1, ddrss_dfi_init_complete,
ddrss_obsp2, d2_state_0, d3_gbl_per_dma_req, pcie_usb_cxpl_debug_info_ei_6,
pcie_usb_cxpl_debug_info_ei_14, cpu1_state_0, gpoval6, cpu1_standby_wfi0,
cpu1_standby_wfe0, cpu1_halted0, bsec_out_spidenm, exti2_cpu1__wakeup,
eth2_out_lpi_intr_o, gpu_dbg0, ddrss_dfi_ctrlupd_req, ddrss_obsp3, d2_state_1,
lpdma1_clk_bus_req, pcie_usb_cxpl_debug_info_ei_7,
pcie_usb_cxpl_debug_info_ei_15, cpu1_state_1, gpoval7 ]
required:
- compatible
- reg
- clocks
additionalProperties: false
examples:
- |
#include <dt-bindings/clock/stm32mp1-clks.h>
pinctrl@54090000 {
compatible = "st,stm32mp151-hdp";
reg = <0x54090000 0x400>;
clocks = <&rcc HDP>;
pinctrl-names = "default";
pinctrl-0 = <&hdp2_gpo>;
hdp2_gpo: hdp2-pins {
function = "gpoval2";
pins = "HDP2";
};
};

View File

@ -32,13 +32,16 @@ properties:
'#address-cells':
const: 1
'#size-cells':
const: 1
ranges: true
pins-are-numbered:
$ref: /schemas/types.yaml#/definitions/flag
deprecated: true
hwlocks: true
interrupts:
@ -67,22 +70,29 @@ patternProperties:
additionalProperties: false
properties:
gpio-controller: true
'#gpio-cells':
const: 2
interrupt-controller: true
'#interrupt-cells':
const: 2
reg:
maxItems: 1
clocks:
maxItems: 1
resets:
maxItems: 1
gpio-line-names: true
gpio-ranges:
minItems: 1
maxItems: 16
ngpios:
description:
Number of available gpios in a bank.
@ -160,9 +170,13 @@ patternProperties:
* ...
* 16 : Alternate Function 15
* 17 : Analog
* 18 : Reserved
To simplify the usage, macro is available to generate "pinmux" field.
This macro is available here:
- include/dt-bindings/pinctrl/stm32-pinfunc.h
Setting the pinmux's function to the Reserved (RSVD) value is used to inform
the driver that it shall not apply the mux setting. This can be used to
reserve some pins, for example to a co-processor not running Linux.
Some examples of using macro:
/* GPIO A9 set as alternate function 2 */
... {
@ -176,21 +190,32 @@ patternProperties:
... {
pinmux = <STM32_PINMUX('A', 9, ANALOG)>;
};
/* GPIO A9 reserved for co-processor */
... {
pinmux = <STM32_PINMUX('A', 9, RSVD)>;
};
bias-disable:
type: boolean
bias-pull-down:
type: boolean
bias-pull-up:
type: boolean
drive-push-pull:
type: boolean
drive-open-drain:
type: boolean
output-low:
type: boolean
output-high:
type: boolean
slew-rate:
description: |
0: Low speed

View File

@ -23814,6 +23814,12 @@ F: drivers/bus/stm32_etzpc.c
F: drivers/bus/stm32_firewall.c
F: drivers/bus/stm32_rifsc.c
ST STM32 HDP PINCTRL DRIVER
M: Clément Le Goffic <legoffic.clement@gmail.com>
S: Maintained
F: Documentation/devicetree/bindings/pinctrl/st,stm32-hdp.yaml
F: drivers/pinctrl/stm32/pinctrl-stm32-hdp.c
ST STM32 I2C/SMBUS DRIVER
M: Pierre-Yves MORDRET <pierre-yves.mordret@foss.st.com>
M: Alain Volmat <alain.volmat@foss.st.com>
@ -23827,6 +23833,14 @@ S: Maintained
F: Documentation/devicetree/bindings/memory-controllers/st,stm32mp25-omm.yaml
F: drivers/memory/stm32_omm.c
ST STM32 PINCTRL DRIVER
M: Antonio Borneo <antonio.borneo@foss.st.com>
S: Maintained
F: Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.yaml
F: drivers/pinctrl/stm32/
F: include/dt-bindings/pinctrl/stm32-pinfunc.h
X: drivers/pinctrl/stm32/pinctrl-stm32-hdp.c
ST STM32 SPI DRIVER
M: Alain Volmat <alain.volmat@foss.st.com>
L: linux-spi@vger.kernel.org

View File

@ -333,7 +333,6 @@ config ARCH_STM32
bool "STMicroelectronics STM32 SoC Family"
select GPIOLIB
select PINCTRL
select PINCTRL_STM32MP257
select ARM_SMC_MBOX
select ARM_SCMI_PROTOCOL
select REGULATOR

View File

@ -206,6 +206,17 @@ config PINCTRL_DIGICOLOR
select PINMUX
select GENERIC_PINCONF
config PINCTRL_EIC7700
tristate "EIC7700 PINCTRL driver"
depends on ARCH_ESWIN || COMPILE_TEST
select PINMUX
select GENERIC_PINCONF
help
This driver support for the pin controller in ESWIN's EIC7700 SoC,
which supports pin multiplexing, pin configuration,and rgmii voltage
control.
Say Y here to enable the eic7700 pinctrl driver
config PINCTRL_EP93XX
bool
depends on ARCH_EP93XX || COMPILE_TEST
@ -269,7 +280,8 @@ config PINCTRL_INGENIC
config PINCTRL_K210
bool "Pinctrl driver for the Canaan Kendryte K210 SoC"
depends on RISCV && SOC_CANAAN_K210 && OF
depends on RISCV && SOC_CANAAN_K210 || COMPILE_TEST
depends on OF
select GENERIC_PINMUX_FUNCTIONS
select GENERIC_PINCONF
select GPIOLIB
@ -554,8 +566,8 @@ config PINCTRL_SX150X
- 16 bits: sx1509q, sx1506q
config PINCTRL_TB10X
bool
depends on OF && ARC_PLAT_TB10X
bool "Pinctrl for TB10X" if COMPILE_TEST
depends on OF && ARC_PLAT_TB10X || COMPILE_TEST
select GPIOLIB
config PINCTRL_TPS6594
@ -590,7 +602,8 @@ config PINCTRL_TH1520
config PINCTRL_ZYNQ
bool "Pinctrl driver for Xilinx Zynq"
depends on ARCH_ZYNQ
depends on ARCH_ZYNQ || COMPILE_TEST
depends on OF
select PINMUX
select GENERIC_PINCONF
help

View File

@ -23,6 +23,7 @@ obj-$(CONFIG_PINCTRL_CY8C95X0) += pinctrl-cy8c95x0.o
obj-$(CONFIG_PINCTRL_DA850_PUPD) += pinctrl-da850-pupd.o
obj-$(CONFIG_PINCTRL_DA9062) += pinctrl-da9062.o
obj-$(CONFIG_PINCTRL_DIGICOLOR) += pinctrl-digicolor.o
obj-$(CONFIG_PINCTRL_EIC7700) += pinctrl-eic7700.o
obj-$(CONFIG_PINCTRL_EQUILIBRIUM) += pinctrl-equilibrium.o
obj-$(CONFIG_PINCTRL_EP93XX) += pinctrl-ep93xx.o
obj-$(CONFIG_PINCTRL_EYEQ5) += pinctrl-eyeq5.o
@ -83,7 +84,7 @@ obj-y += sophgo/
obj-y += spacemit/
obj-$(CONFIG_PINCTRL_SPEAR) += spear/
obj-y += sprd/
obj-$(CONFIG_SOC_STARFIVE) += starfive/
obj-y += starfive/
obj-$(CONFIG_PINCTRL_STM32) += stm32/
obj-y += sunplus/
obj-$(CONFIG_PINCTRL_SUNXI) += sunxi/

View File

@ -2653,7 +2653,7 @@ static const struct pinconf_ops aspeed_g4_conf_ops = {
.pin_config_group_set = aspeed_pin_config_group_set,
};
static struct pinctrl_desc aspeed_g4_pinctrl_desc = {
static const struct pinctrl_desc aspeed_g4_pinctrl_desc = {
.name = "aspeed-g4-pinctrl",
.pins = aspeed_g4_pins,
.npins = ARRAY_SIZE(aspeed_g4_pins),

View File

@ -2845,7 +2845,7 @@ static const struct pinconf_ops aspeed_g5_conf_ops = {
.pin_config_group_set = aspeed_pin_config_group_set,
};
static struct pinctrl_desc aspeed_g5_pinctrl_desc = {
static const struct pinctrl_desc aspeed_g5_pinctrl_desc = {
.name = "aspeed-g5-pinctrl",
.pins = aspeed_g5_pins,
.npins = ARRAY_SIZE(aspeed_g5_pins),

View File

@ -17,6 +17,7 @@
#include "../pinctrl-utils.h"
#include "pinctrl-aspeed.h"
#define SCU040 0x040 /* Reset Control Set 1 */
#define SCU400 0x400 /* Multi-function Pin Control #1 */
#define SCU404 0x404 /* Multi-function Pin Control #2 */
#define SCU40C 0x40C /* Multi-function Pin Control #3 */
@ -52,7 +53,7 @@
#define SCU6D0 0x6D0 /* Multi-function Pin Control #29 */
#define SCUC20 0xC20 /* PCIE configuration Setting Control */
#define ASPEED_G6_NR_PINS 256
#define ASPEED_G6_NR_PINS 258
#define M24 0
SIG_EXPR_LIST_DECL_SESG(M24, MDC3, MDIO3, SIG_DESC_SET(SCU410, 0));
@ -1636,6 +1637,12 @@ FUNC_DECL_1(USB11BHID, USBB);
FUNC_DECL_1(USB2BD, USBB);
FUNC_DECL_1(USB2BH, USBB);
#define D7 257
SIG_EXPR_LIST_DECL_SESG(D7, RCRST, PCIERC1, SIG_DESC_SET(SCU040, 19),
SIG_DESC_SET(SCU500, 24));
PIN_DECL_(D7, SIG_EXPR_LIST_PTR(D7, RCRST));
FUNC_GROUP_DECL(PCIERC1, D7);
/* Pins, groups and functions are sort(1):ed alphabetically for sanity */
static struct pinctrl_pin_desc aspeed_g6_pins[ASPEED_G6_NR_PINS] = {
@ -1806,6 +1813,7 @@ static struct pinctrl_pin_desc aspeed_g6_pins[ASPEED_G6_NR_PINS] = {
ASPEED_PINCTRL_PIN(D4),
ASPEED_PINCTRL_PIN(D5),
ASPEED_PINCTRL_PIN(D6),
ASPEED_PINCTRL_PIN(D7),
ASPEED_PINCTRL_PIN(E1),
ASPEED_PINCTRL_PIN(E11),
ASPEED_PINCTRL_PIN(E12),
@ -2073,6 +2081,7 @@ static const struct aspeed_pin_group aspeed_g6_groups[] = {
ASPEED_PINCTRL_GROUP(SALT9G1),
ASPEED_PINCTRL_GROUP(SD1),
ASPEED_PINCTRL_GROUP(SD2),
ASPEED_PINCTRL_GROUP(PCIERC1),
ASPEED_PINCTRL_GROUP(EMMCG1),
ASPEED_PINCTRL_GROUP(EMMCG4),
ASPEED_PINCTRL_GROUP(EMMCG8),
@ -2314,6 +2323,7 @@ static const struct aspeed_pin_function aspeed_g6_functions[] = {
ASPEED_PINCTRL_FUNC(SPI2),
ASPEED_PINCTRL_FUNC(SPI2CS1),
ASPEED_PINCTRL_FUNC(SPI2CS2),
ASPEED_PINCTRL_FUNC(PCIERC1),
ASPEED_PINCTRL_FUNC(TACH0),
ASPEED_PINCTRL_FUNC(TACH1),
ASPEED_PINCTRL_FUNC(TACH10),
@ -2763,7 +2773,7 @@ static const struct pinconf_ops aspeed_g6_conf_ops = {
.pin_config_group_set = aspeed_pin_config_group_set,
};
static struct pinctrl_desc aspeed_g6_pinctrl_desc = {
static const struct pinctrl_desc aspeed_g6_pinctrl_desc = {
.name = "aspeed-g6-pinctrl",
.pins = aspeed_g6_pins,
.npins = ARRAY_SIZE(aspeed_g6_pins),

View File

@ -441,7 +441,7 @@ int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev,
}
int aspeed_pinctrl_probe(struct platform_device *pdev,
struct pinctrl_desc *pdesc,
const struct pinctrl_desc *pdesc,
struct aspeed_pinctrl_data *pdata)
{
struct device *parent;

View File

@ -102,7 +102,7 @@ int aspeed_gpio_request_enable(struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range,
unsigned int offset);
int aspeed_pinctrl_probe(struct platform_device *pdev,
struct pinctrl_desc *pdesc,
const struct pinctrl_desc *pdesc,
struct aspeed_pinctrl_data *pdata);
int aspeed_pin_config_get(struct pinctrl_dev *pctldev, unsigned int offset,
unsigned long *config);

View File

@ -456,7 +456,7 @@ static const struct pinmux_ops bcm4908_pinctrl_pmxops = {
* Controller code
*/
static struct pinctrl_desc bcm4908_pinctrl_desc = {
static const struct pinctrl_desc bcm4908_pinctrl_desc = {
.name = "bcm4908-pinctrl",
.pctlops = &bcm4908_pinctrl_ops,
.pmxops = &bcm4908_pinctrl_pmxops,

View File

@ -903,6 +903,7 @@ static struct pinctrl_desc cygnus_pinctrl_desc = {
.name = "cygnus-pinmux",
.pctlops = &cygnus_pinctrl_ops,
.pmxops = &cygnus_pinmux_ops,
.npins = ARRAY_SIZE(cygnus_pins),
};
static int cygnus_mux_log_init(struct cygnus_pinctrl *pinctrl)
@ -935,7 +936,6 @@ static int cygnus_pinmux_probe(struct platform_device *pdev)
struct cygnus_pinctrl *pinctrl;
int i, ret;
struct pinctrl_pin_desc *pins;
unsigned num_pins = ARRAY_SIZE(cygnus_pins);
pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL);
if (!pinctrl)
@ -963,11 +963,12 @@ static int cygnus_pinmux_probe(struct platform_device *pdev)
return ret;
}
pins = devm_kcalloc(&pdev->dev, num_pins, sizeof(*pins), GFP_KERNEL);
pins = devm_kcalloc(&pdev->dev, ARRAY_SIZE(cygnus_pins), sizeof(*pins),
GFP_KERNEL);
if (!pins)
return -ENOMEM;
for (i = 0; i < num_pins; i++) {
for (i = 0; i < ARRAY_SIZE(cygnus_pins); i++) {
pins[i].number = cygnus_pins[i].pin;
pins[i].name = cygnus_pins[i].name;
pins[i].drv_data = &cygnus_pins[i].gpio_mux;
@ -978,7 +979,6 @@ static int cygnus_pinmux_probe(struct platform_device *pdev)
pinctrl->functions = cygnus_pin_functions;
pinctrl->num_functions = ARRAY_SIZE(cygnus_pin_functions);
cygnus_pinctrl_desc.pins = pins;
cygnus_pinctrl_desc.npins = num_pins;
pinctrl->pctl = devm_pinctrl_register(&pdev->dev, &cygnus_pinctrl_desc,
pinctrl);

View File

@ -192,7 +192,7 @@ static const struct pinmux_ops ns_pinctrl_pmxops = {
* Controller code
*/
static struct pinctrl_desc ns_pinctrl_desc = {
static const struct pinctrl_desc ns_pinctrl_desc = {
.name = "pinctrl-ns",
.pctlops = &ns_pinctrl_ops,
.pmxops = &ns_pinctrl_pmxops,

View File

@ -971,6 +971,7 @@ static struct pinctrl_desc ns2_pinctrl_desc = {
.pctlops = &ns2_pinctrl_ops,
.pmxops = &ns2_pinmux_ops,
.confops = &ns2_pinconf_ops,
.npins = ARRAY_SIZE(ns2_pins),
};
static int ns2_mux_log_init(struct ns2_pinctrl *pinctrl)
@ -1026,7 +1027,6 @@ static int ns2_pinmux_probe(struct platform_device *pdev)
struct resource *res;
int i, ret;
struct pinctrl_pin_desc *pins;
unsigned int num_pins = ARRAY_SIZE(ns2_pins);
pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL);
if (!pinctrl)
@ -1060,11 +1060,12 @@ static int ns2_pinmux_probe(struct platform_device *pdev)
return ret;
}
pins = devm_kcalloc(&pdev->dev, num_pins, sizeof(*pins), GFP_KERNEL);
pins = devm_kcalloc(&pdev->dev, ARRAY_SIZE(ns2_pins), sizeof(*pins),
GFP_KERNEL);
if (!pins)
return -ENOMEM;
for (i = 0; i < num_pins; i++) {
for (i = 0; i < ARRAY_SIZE(ns2_pins); i++) {
pins[i].number = ns2_pins[i].pin;
pins[i].name = ns2_pins[i].name;
pins[i].drv_data = &ns2_pins[i];
@ -1075,7 +1076,6 @@ static int ns2_pinmux_probe(struct platform_device *pdev)
pinctrl->functions = ns2_pin_functions;
pinctrl->num_functions = ARRAY_SIZE(ns2_pin_functions);
ns2_pinctrl_desc.pins = pins;
ns2_pinctrl_desc.npins = num_pins;
pinctrl->pctl = pinctrl_register(&ns2_pinctrl_desc, &pdev->dev,
pinctrl);

View File

@ -525,6 +525,7 @@ static struct pinctrl_desc nsp_pinctrl_desc = {
.name = "nsp-pinmux",
.pctlops = &nsp_pinctrl_ops,
.pmxops = &nsp_pinmux_ops,
.npins = ARRAY_SIZE(nsp_pins),
};
static int nsp_mux_log_init(struct nsp_pinctrl *pinctrl)
@ -556,7 +557,6 @@ static int nsp_pinmux_probe(struct platform_device *pdev)
struct resource *res;
int i, ret;
struct pinctrl_pin_desc *pins;
unsigned int num_pins = ARRAY_SIZE(nsp_pins);
pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL);
if (!pinctrl)
@ -589,11 +589,12 @@ static int nsp_pinmux_probe(struct platform_device *pdev)
return ret;
}
pins = devm_kcalloc(&pdev->dev, num_pins, sizeof(*pins), GFP_KERNEL);
pins = devm_kcalloc(&pdev->dev, ARRAY_SIZE(nsp_pins), sizeof(*pins),
GFP_KERNEL);
if (!pins)
return -ENOMEM;
for (i = 0; i < num_pins; i++) {
for (i = 0; i < ARRAY_SIZE(nsp_pins); i++) {
pins[i].number = nsp_pins[i].pin;
pins[i].name = nsp_pins[i].name;
pins[i].drv_data = &nsp_pins[i].gpio_select;
@ -604,7 +605,6 @@ static int nsp_pinmux_probe(struct platform_device *pdev)
pinctrl->functions = nsp_pin_functions;
pinctrl->num_functions = ARRAY_SIZE(nsp_pin_functions);
nsp_pinctrl_desc.pins = pins;
nsp_pinctrl_desc.npins = num_pins;
pinctrl->pctl = devm_pinctrl_register(&pdev->dev, &nsp_pinctrl_desc,
pinctrl);

View File

@ -204,6 +204,7 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)
const struct berlin_desc_group *desc_group;
const struct berlin_desc_function *desc_function;
int i, max_functions = 0;
struct pinfunction *new_functions;
pctrl->nfunctions = 0;
@ -229,12 +230,15 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)
}
}
pctrl->functions = krealloc(pctrl->functions,
new_functions = krealloc(pctrl->functions,
pctrl->nfunctions * sizeof(*pctrl->functions),
GFP_KERNEL);
if (!pctrl->functions)
if (!new_functions) {
kfree(pctrl->functions);
return -ENOMEM;
}
pctrl->functions = new_functions;
/* map functions to theirs groups */
for (i = 0; i < pctrl->desc->ngroups; i++) {
desc_group = pctrl->desc->groups + i;
@ -283,7 +287,7 @@ static int berlin_pinctrl_build_state(struct platform_device *pdev)
return 0;
}
static struct pinctrl_desc berlin_pctrl_desc = {
static const struct pinctrl_desc berlin_pctrl_desc = {
.name = "berlin-pinctrl",
.pctlops = &berlin_pinctrl_ops,
.pmxops = &berlin_pinmux_ops,

View File

@ -448,7 +448,7 @@ static const struct pinconf_ops cs42l43_pin_conf_ops = {
.pin_config_group_set = cs42l43_pin_config_group_set,
};
static struct pinctrl_desc cs42l43_pin_desc = {
static const struct pinctrl_desc cs42l43_pin_desc = {
.name = "cs42l43-pinctrl",
.owner = THIS_MODULE,
@ -483,7 +483,8 @@ static int cs42l43_gpio_get(struct gpio_chip *chip, unsigned int offset)
return ret;
}
static void cs42l43_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
static int cs42l43_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct cs42l43_pin *priv = gpiochip_get_data(chip);
unsigned int shift = offset + CS42L43_GPIO1_LVL_SHIFT;
@ -493,23 +494,27 @@ static void cs42l43_gpio_set(struct gpio_chip *chip, unsigned int offset, int va
offset + 1, str_high_low(value));
ret = pm_runtime_resume_and_get(priv->dev);
if (ret) {
dev_err(priv->dev, "Failed to resume for set: %d\n", ret);
return;
}
if (ret)
return ret;
ret = regmap_update_bits(priv->regmap, CS42L43_GPIO_CTRL1,
BIT(shift), value << shift);
if (ret)
dev_err(priv->dev, "Failed to set gpio%d: %d\n", offset + 1, ret);
return ret;
pm_runtime_put(priv->dev);
return 0;
}
static int cs42l43_gpio_direction_out(struct gpio_chip *chip,
unsigned int offset, int value)
{
cs42l43_gpio_set(chip, offset, value);
int ret;
ret = cs42l43_gpio_set(chip, offset, value);
if (ret)
return ret;
return pinctrl_gpio_direction_output(chip, offset);
}
@ -550,7 +555,7 @@ static int cs42l43_pin_probe(struct platform_device *pdev)
priv->gpio_chip.direction_output = cs42l43_gpio_direction_out;
priv->gpio_chip.add_pin_ranges = cs42l43_gpio_add_pin_ranges;
priv->gpio_chip.get = cs42l43_gpio_get;
priv->gpio_chip.set = cs42l43_gpio_set;
priv->gpio_chip.set_rv = cs42l43_gpio_set;
priv->gpio_chip.label = dev_name(priv->dev);
priv->gpio_chip.parent = priv->dev;
priv->gpio_chip.can_sleep = true;

View File

@ -1058,13 +1058,12 @@ static const struct pinctrl_desc lochnagar_pin_desc = {
.confops = &lochnagar_pin_conf_ops,
};
static void lochnagar_gpio_set(struct gpio_chip *chip,
unsigned int offset, int value)
static int lochnagar_gpio_set(struct gpio_chip *chip,
unsigned int offset, int value)
{
struct lochnagar_pin_priv *priv = gpiochip_get_data(chip);
struct lochnagar *lochnagar = priv->lochnagar;
const struct lochnagar_pin *pin = priv->pins[offset].drv_data;
int ret;
value = !!value;
@ -1075,29 +1074,31 @@ static void lochnagar_gpio_set(struct gpio_chip *chip,
case LN_PTYPE_MUX:
value |= LN2_OP_GPIO;
ret = lochnagar_pin_set_mux(priv, pin, value);
return lochnagar_pin_set_mux(priv, pin, value);
break;
case LN_PTYPE_GPIO:
if (pin->invert)
value = !value;
ret = regmap_update_bits(lochnagar->regmap, pin->reg,
BIT(pin->shift), value << pin->shift);
return regmap_update_bits(lochnagar->regmap, pin->reg,
BIT(pin->shift),
value << pin->shift);
break;
default:
ret = -EINVAL;
break;
}
if (ret < 0)
dev_err(chip->parent, "Failed to set %s value: %d\n",
pin->name, ret);
return -EINVAL;
}
static int lochnagar_gpio_direction_out(struct gpio_chip *chip,
unsigned int offset, int value)
{
lochnagar_gpio_set(chip, offset, value);
int ret;
ret = lochnagar_gpio_set(chip, offset, value);
if (ret)
return ret;
return pinctrl_gpio_direction_output(chip, offset);
}
@ -1160,7 +1161,7 @@ static int lochnagar_pin_probe(struct platform_device *pdev)
priv->gpio_chip.request = gpiochip_generic_request;
priv->gpio_chip.free = gpiochip_generic_free;
priv->gpio_chip.direction_output = lochnagar_gpio_direction_out;
priv->gpio_chip.set = lochnagar_gpio_set;
priv->gpio_chip.set_rv = lochnagar_gpio_set;
priv->gpio_chip.can_sleep = true;
priv->gpio_chip.parent = dev;
priv->gpio_chip.base = -1;

View File

@ -1061,8 +1061,9 @@ static int madera_pin_probe(struct platform_device *pdev)
/* if the configuration is provided through pdata, apply it */
if (pdata->gpio_configs) {
ret = pinctrl_register_mappings(pdata->gpio_configs,
pdata->n_gpio_configs);
ret = devm_pinctrl_register_mappings(priv->dev,
pdata->gpio_configs,
pdata->n_gpio_configs);
if (ret)
return dev_err_probe(priv->dev, ret,
"Failed to register pdata mappings\n");
@ -1081,17 +1082,8 @@ static int madera_pin_probe(struct platform_device *pdev)
return 0;
}
static void madera_pin_remove(struct platform_device *pdev)
{
struct madera_pin_private *priv = platform_get_drvdata(pdev);
if (priv->madera->pdata.gpio_configs)
pinctrl_unregister_mappings(priv->madera->pdata.gpio_configs);
}
static struct platform_driver madera_pin_driver = {
.probe = madera_pin_probe,
.remove = madera_pin_remove,
.driver = {
.name = "madera-pinctrl",
},

View File

@ -2062,7 +2062,7 @@ static int pinctrl_check_ops(struct pinctrl_dev *pctldev)
* @driver_data: private pin controller data for this pin controller
*/
static struct pinctrl_dev *
pinctrl_init_controller(struct pinctrl_desc *pctldesc, struct device *dev,
pinctrl_init_controller(const struct pinctrl_desc *pctldesc, struct device *dev,
void *driver_data)
{
struct pinctrl_dev *pctldev;
@ -2132,7 +2132,8 @@ out_err:
return ERR_PTR(ret);
}
static void pinctrl_uninit_controller(struct pinctrl_dev *pctldev, struct pinctrl_desc *pctldesc)
static void pinctrl_uninit_controller(struct pinctrl_dev *pctldev,
const struct pinctrl_desc *pctldesc)
{
pinctrl_free_pindescs(pctldev, pctldesc->pins,
pctldesc->npins);
@ -2209,7 +2210,7 @@ EXPORT_SYMBOL_GPL(pinctrl_enable);
* struct pinctrl_dev handle. To avoid issues later on, please use the
* new pinctrl_register_and_init() below instead.
*/
struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
struct pinctrl_dev *pinctrl_register(const struct pinctrl_desc *pctldesc,
struct device *dev, void *driver_data)
{
struct pinctrl_dev *pctldev;
@ -2239,7 +2240,7 @@ EXPORT_SYMBOL_GPL(pinctrl_register);
* Note that pinctrl_enable() still needs to be manually called after
* this once the driver is ready.
*/
int pinctrl_register_and_init(struct pinctrl_desc *pctldesc,
int pinctrl_register_and_init(const struct pinctrl_desc *pctldesc,
struct device *dev, void *driver_data,
struct pinctrl_dev **pctldev)
{
@ -2330,7 +2331,7 @@ static int devm_pinctrl_dev_match(struct device *dev, void *res, void *data)
* The pinctrl device will be automatically released when the device is unbound.
*/
struct pinctrl_dev *devm_pinctrl_register(struct device *dev,
struct pinctrl_desc *pctldesc,
const struct pinctrl_desc *pctldesc,
void *driver_data)
{
struct pinctrl_dev **ptr, *pctldev;
@ -2364,7 +2365,7 @@ EXPORT_SYMBOL_GPL(devm_pinctrl_register);
* The pinctrl device will be automatically released when the device is unbound.
*/
int devm_pinctrl_register_and_init(struct device *dev,
struct pinctrl_desc *pctldesc,
const struct pinctrl_desc *pctldesc,
void *driver_data,
struct pinctrl_dev **pctldev)
{

View File

@ -51,7 +51,7 @@ struct pinctrl_state;
*/
struct pinctrl_dev {
struct list_head node;
struct pinctrl_desc *desc;
const struct pinctrl_desc *desc;
struct radix_tree_root pin_desc_tree;
#ifdef CONFIG_GENERIC_PINCTRL_GROUPS
struct radix_tree_root pin_group_tree;

View File

@ -1045,7 +1045,7 @@ static int byt_gpio_get(struct gpio_chip *chip, unsigned int offset)
return !!(val & BYT_LEVEL);
}
static void byt_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
static int byt_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct intel_pinctrl *vg = gpiochip_get_data(chip);
void __iomem *reg;
@ -1053,7 +1053,7 @@ static void byt_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
reg = byt_gpio_reg(vg, offset, BYT_VAL_REG);
if (!reg)
return;
return -EINVAL;
guard(raw_spinlock_irqsave)(&byt_lock);
@ -1062,6 +1062,8 @@ static void byt_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
writel(old_val | BYT_LEVEL, reg);
else
writel(old_val & ~BYT_LEVEL, reg);
return 0;
}
static int byt_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
@ -1229,7 +1231,7 @@ static const struct gpio_chip byt_gpio_chip = {
.direction_input = byt_gpio_direction_input,
.direction_output = byt_gpio_direction_output,
.get = byt_gpio_get,
.set = byt_gpio_set,
.set_rv = byt_gpio_set,
.set_config = gpiochip_generic_config,
.dbg_show = byt_gpio_dbg_show,
};

View File

@ -1112,7 +1112,7 @@ static int chv_gpio_get(struct gpio_chip *chip, unsigned int offset)
return !!(ctrl0 & CHV_PADCTRL0_GPIORXSTATE);
}
static void chv_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
static int chv_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
u32 ctrl0;
@ -1127,6 +1127,8 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
ctrl0 &= ~CHV_PADCTRL0_GPIOTXSTATE;
chv_writel(pctrl, offset, CHV_PADCTRL0, ctrl0);
return 0;
}
static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
@ -1166,7 +1168,7 @@ static const struct gpio_chip chv_gpio_chip = {
.direction_input = chv_gpio_direction_input,
.direction_output = chv_gpio_direction_output,
.get = chv_gpio_get,
.set = chv_gpio_set,
.set_rv = chv_gpio_set,
};
static void chv_gpio_irq_ack(struct irq_data *d)

View File

@ -9,6 +9,7 @@
#include <linux/acpi.h>
#include <linux/cleanup.h>
#include <linux/export.h>
#include <linux/gpio/driver.h>
#include <linux/interrupt.h>
#include <linux/log2.h>
@ -1033,8 +1034,8 @@ static int intel_gpio_get(struct gpio_chip *chip, unsigned int offset)
return !!(padcfg0 & PADCFG0_GPIORXSTATE);
}
static void intel_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
static int intel_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct intel_pinctrl *pctrl = gpiochip_get_data(chip);
void __iomem *reg;
@ -1043,11 +1044,11 @@ static void intel_gpio_set(struct gpio_chip *chip, unsigned int offset,
pin = intel_gpio_to_pin(pctrl, offset, NULL, NULL);
if (pin < 0)
return;
return -EINVAL;
reg = intel_get_padcfg(pctrl, pin, PADCFG0);
if (!reg)
return;
return -EINVAL;
guard(raw_spinlock_irqsave)(&pctrl->lock);
@ -1057,6 +1058,8 @@ static void intel_gpio_set(struct gpio_chip *chip, unsigned int offset,
else
padcfg0 &= ~PADCFG0_GPIOTXSTATE;
writel(padcfg0, reg);
return 0;
}
static int intel_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
@ -1094,7 +1097,12 @@ static int intel_gpio_direction_input(struct gpio_chip *chip, unsigned int offse
static int intel_gpio_direction_output(struct gpio_chip *chip, unsigned int offset,
int value)
{
intel_gpio_set(chip, offset, value);
int ret;
ret = intel_gpio_set(chip, offset, value);
if (ret)
return ret;
return pinctrl_gpio_direction_output(chip, offset);
}
@ -1106,7 +1114,7 @@ static const struct gpio_chip intel_gpio_chip = {
.direction_input = intel_gpio_direction_input,
.direction_output = intel_gpio_direction_output,
.get = intel_gpio_get,
.set = intel_gpio_set,
.set_rv = intel_gpio_set,
.set_config = gpiochip_generic_config,
};

View File

@ -503,7 +503,7 @@ static int lp_gpio_get(struct gpio_chip *chip, unsigned int offset)
return !!(ioread32(reg) & IN_LVL_BIT);
}
static void lp_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
static int lp_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct intel_pinctrl *lg = gpiochip_get_data(chip);
void __iomem *reg = lp_gpio_reg(chip, offset, LP_CONFIG1);
@ -514,6 +514,8 @@ static void lp_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
iowrite32(ioread32(reg) | OUT_LVL_BIT, reg);
else
iowrite32(ioread32(reg) & ~OUT_LVL_BIT, reg);
return 0;
}
static int lp_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
@ -775,7 +777,7 @@ static int lp_gpio_probe(struct platform_device *pdev)
gc->direction_input = lp_gpio_direction_input;
gc->direction_output = lp_gpio_direction_output;
gc->get = lp_gpio_get;
gc->set = lp_gpio_set;
gc->set_rv = lp_gpio_set;
gc->set_config = gpiochip_generic_config;
gc->get_direction = lp_gpio_get_direction;
gc->base = -1;

View File

@ -259,6 +259,18 @@ config PINCTRL_MT8188
In MTK platform, we support virtual gpio and use it to
map specific eint which doesn't have real gpio pin.
config PINCTRL_MT8189
bool "MediaTek MT8189 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
help
Say yes here to support pin controller and gpio driver
on MediaTek MT8189 SoC.
In MTK platform, we support virtual gpio and use it to
map specific eint which doesn't have real gpio pin.
config PINCTRL_MT8192
bool "MediaTek MT8192 pin control"
depends on OF

View File

@ -35,6 +35,7 @@ obj-$(CONFIG_PINCTRL_MT8173) += pinctrl-mt8173.o
obj-$(CONFIG_PINCTRL_MT8183) += pinctrl-mt8183.o
obj-$(CONFIG_PINCTRL_MT8186) += pinctrl-mt8186.o
obj-$(CONFIG_PINCTRL_MT8188) += pinctrl-mt8188.o
obj-$(CONFIG_PINCTRL_MT8189) += pinctrl-mt8189.o
obj-$(CONFIG_PINCTRL_MT8192) += pinctrl-mt8192.o
obj-$(CONFIG_PINCTRL_MT8195) += pinctrl-mt8195.o
obj-$(CONFIG_PINCTRL_MT8196) += pinctrl-mt8196.o

View File

@ -561,8 +561,8 @@ int mtk_eint_do_init(struct mtk_eint *eint, struct mtk_eint_pin *eint_pin)
goto err_eint;
}
eint->domain = irq_domain_create_linear(of_fwnode_handle(eint->dev->of_node),
eint->hw->ap_num, &irq_domain_simple_ops, NULL);
eint->domain = irq_domain_create_linear(dev_fwnode(eint->dev), eint->hw->ap_num,
&irq_domain_simple_ops, NULL);
if (!eint->domain)
goto err_eint;

View File

@ -2852,7 +2852,7 @@ static const struct pinctrl_ops airoha_pctlops = {
.dt_free_map = pinconf_generic_dt_free_map,
};
static struct pinctrl_desc airoha_pinctrl_desc = {
static const struct pinctrl_desc airoha_pinctrl_desc = {
.name = KBUILD_MODNAME,
.owner = THIS_MODULE,
.pctlops = &airoha_pctlops,
@ -2907,11 +2907,9 @@ static int airoha_pinctrl_probe(struct platform_device *pdev)
const struct airoha_pinctrl_func *func;
func = &airoha_pinctrl_funcs[i];
err = pinmux_generic_add_function(pinctrl->ctrl,
func->desc.func.name,
func->desc.func.groups,
func->desc.func.ngroups,
(void *)func);
err = pinmux_generic_add_pinfunction(pinctrl->ctrl,
&func->desc.func,
(void *)func);
if (err < 0) {
dev_err(dev, "Failed to register function %s\n",
func->desc.func.name);

View File

@ -625,9 +625,8 @@ static int mtk_build_functions(struct mtk_pinctrl *hw)
const struct function_desc *function = hw->soc->funcs + i;
const struct pinfunction *func = &function->func;
err = pinmux_generic_add_function(hw->pctrl, func->name,
func->groups, func->ngroups,
function->data);
err = pinmux_generic_add_pinfunction(hw->pctrl, func,
function->data);
if (err < 0) {
dev_err(hw->dev, "Failed to register function %s\n",
func->name);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -50,15 +50,23 @@ struct aml_pio_control {
u32 bit_offset[AML_NUM_REG];
};
struct aml_reg_bit {
u32 bank_id;
u32 reg_offs[AML_NUM_REG];
u32 bit_offs[AML_NUM_REG];
/*
* partial bank(subordinate) pins mux config use other bank(main) mux registgers
* m_bank_id: the main bank which pin_id from 0, but register bit not from bit 0
* m_bit_offs: bit offset the main bank mux register
* sid: start pin_id of subordinate bank
* eid: end pin_id of subordinate bank
*/
struct multi_mux {
unsigned int m_bank_id;
unsigned int m_bit_offs;
unsigned int sid;
unsigned int eid;
};
struct aml_pctl_data {
unsigned int number;
struct aml_reg_bit rb_offs[];
const struct multi_mux *p_mux;
};
struct aml_pmx_func {
@ -78,10 +86,12 @@ struct aml_gpio_bank {
struct gpio_chip gpio_chip;
struct aml_pio_control pc;
u32 bank_id;
u32 mux_bit_offs;
unsigned int pin_base;
struct regmap *reg_mux;
struct regmap *reg_gpio;
struct regmap *reg_ds;
const struct multi_mux *p_mux;
};
struct aml_pinctrl {
@ -113,13 +123,46 @@ static const char *aml_bank_name[31] = {
"GPIOCC", "TEST_N", "ANALOG"
};
static const struct multi_mux multi_mux_s7[] = {
{
.m_bank_id = AMLOGIC_GPIO_CC,
.m_bit_offs = 24,
.sid = (AMLOGIC_GPIO_X << 8) + 16,
.eid = (AMLOGIC_GPIO_X << 8) + 19,
},
};
static const struct aml_pctl_data s7_priv_data = {
.number = ARRAY_SIZE(multi_mux_s7),
.p_mux = multi_mux_s7,
};
static const struct multi_mux multi_mux_s6[] = {
{
.m_bank_id = AMLOGIC_GPIO_CC,
.m_bit_offs = 24,
.sid = (AMLOGIC_GPIO_X << 8) + 16,
.eid = (AMLOGIC_GPIO_X << 8) + 19,
}, {
.m_bank_id = AMLOGIC_GPIO_F,
.m_bit_offs = 4,
.sid = (AMLOGIC_GPIO_D << 8) + 6,
.eid = (AMLOGIC_GPIO_D << 8) + 6,
},
};
static const struct aml_pctl_data s6_priv_data = {
.number = ARRAY_SIZE(multi_mux_s6),
.p_mux = multi_mux_s6,
};
static int aml_pmx_calc_reg_and_offset(struct pinctrl_gpio_range *range,
unsigned int pin, unsigned int *reg,
unsigned int *offset)
{
unsigned int shift;
shift = (pin - range->pin_base) << 2;
shift = ((pin - range->pin_base) << 2) + *offset;
*reg = (shift / 32) * 4;
*offset = shift % 32;
@ -131,9 +174,36 @@ static int aml_pctl_set_function(struct aml_pinctrl *info,
int pin_id, int func)
{
struct aml_gpio_bank *bank = gpio_chip_to_bank(range->gc);
unsigned int shift;
int reg;
int offset;
int i;
unsigned int offset = bank->mux_bit_offs;
const struct multi_mux *p_mux;
/* peculiar mux reg set */
if (bank->p_mux) {
p_mux = bank->p_mux;
if (pin_id >= p_mux->sid && pin_id <= p_mux->eid) {
bank = NULL;
for (i = 0; i < info->nbanks; i++) {
if (info->banks[i].bank_id == p_mux->m_bank_id) {
bank = &info->banks[i];
break;
}
}
if (!bank || !bank->reg_mux)
return -EINVAL;
shift = (pin_id - p_mux->sid) << 2;
reg = (shift / 32) * 4;
offset = shift % 32;
return regmap_update_bits(bank->reg_mux, reg,
0xf << offset, (func & 0xf) << offset);
}
}
/* normal mux reg set */
if (!bank->reg_mux)
return 0;
@ -830,29 +900,27 @@ static void init_bank_register_bit(struct aml_pinctrl *info,
struct aml_gpio_bank *bank)
{
const struct aml_pctl_data *data = info->data;
const struct aml_reg_bit *aml_rb;
bool def_offs = true;
const struct multi_mux *p_mux;
int i;
for (i = 0; i < AML_NUM_REG; i++) {
bank->pc.reg_offset[i] = aml_def_regoffs[i];
bank->pc.bit_offset[i] = 0;
}
bank->mux_bit_offs = 0;
if (data) {
for (i = 0; i < data->number; i++) {
aml_rb = &data->rb_offs[i];
if (bank->bank_id == aml_rb->bank_id) {
def_offs = false;
p_mux = &data->p_mux[i];
if (bank->bank_id == p_mux->m_bank_id) {
bank->mux_bit_offs = p_mux->m_bit_offs;
break;
}
if (p_mux->sid >> 8 == bank->bank_id) {
bank->p_mux = p_mux;
break;
}
}
}
if (def_offs) {
for (i = 0; i < AML_NUM_REG; i++) {
bank->pc.reg_offset[i] = aml_def_regoffs[i];
bank->pc.bit_offset[i] = 0;
}
} else {
for (i = 0; i < AML_NUM_REG; i++) {
bank->pc.reg_offset[i] = aml_rb->reg_offs[i];
bank->pc.bit_offset[i] = aml_rb->bit_offs[i];
}
}
}
@ -1021,6 +1089,8 @@ static int aml_pctl_probe(struct platform_device *pdev)
static const struct of_device_id aml_pctl_of_match[] = {
{ .compatible = "amlogic,pinctrl-a4", },
{ .compatible = "amlogic,pinctrl-s7", .data = &s7_priv_data, },
{ .compatible = "amlogic,pinctrl-s6", .data = &s6_priv_data, },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, aml_pctl_dt_match);

View File

@ -270,15 +270,21 @@ static const unsigned int pwm_a_pins[] = { GPIOX_6 };
/* pwm_b */
static const unsigned int pwm_b_x7_pins[] = { GPIOX_7 };
static const unsigned int pwm_b_x19_pins[] = { GPIOX_19 };
static const unsigned int pwm_b_z0_pins[] = { GPIOZ_0 };
static const unsigned int pwm_b_z13_pins[] = { GPIOZ_13 };
static const unsigned int pwm_b_h_pins[] = { GPIOH_7 };
/* pwm_c */
static const unsigned int pwm_c_c_pins[] = { GPIOC_4 };
static const unsigned int pwm_c_x5_pins[] = { GPIOX_5 };
static const unsigned int pwm_c_x8_pins[] = { GPIOX_8 };
static const unsigned int pwm_c_z_pins[] = { GPIOZ_1 };
/* pwm_d */
static const unsigned int pwm_d_x3_pins[] = { GPIOX_3 };
static const unsigned int pwm_d_x6_pins[] = { GPIOX_6 };
static const unsigned int pwm_d_z_pins[] = { GPIOZ_2 };
static const unsigned int pwm_d_a_pins[] = { GPIOA_4 };
/* pwm_e */
static const unsigned int pwm_e_pins[] = { GPIOX_16 };
@ -649,12 +655,22 @@ static const struct meson_pmx_group meson_g12a_periphs_groups[] = {
GROUP(pwm_a, 1),
GROUP(pwm_b_x7, 4),
GROUP(pwm_b_x19, 1),
GROUP(pwm_b_z0, 5),
GROUP(pwm_b_z13, 5),
GROUP(pwm_b_h, 5),
GROUP(pwm_c_x5, 4),
GROUP(pwm_c_x8, 5),
GROUP(pwm_c_c, 5),
GROUP(pwm_c_z, 5),
GROUP(pwm_d_z, 4),
GROUP(pwm_d_a, 3),
GROUP(pwm_d_x3, 4),
GROUP(pwm_d_x6, 4),
GROUP(pwm_e, 1),
GROUP(pwm_f_a, 3),
GROUP(pwm_f_h, 4),
GROUP(pwm_f_x, 1),
GROUP(pwm_f_z, 5),
GROUP(tsin_a_valid, 3),
GROUP(tsin_a_sop, 3),
GROUP(tsin_a_din0, 3),
@ -1058,15 +1074,15 @@ static const char * const pwm_a_groups[] = {
};
static const char * const pwm_b_groups[] = {
"pwm_b_x7", "pwm_b_x19",
"pwm_b_h", "pwm_b_x7", "pwm_b_x19", "pwm_b_z0", "pwm_b_z13"
};
static const char * const pwm_c_groups[] = {
"pwm_c_c", "pwm_c_x5", "pwm_c_x8",
"pwm_c_c", "pwm_c_x5", "pwm_c_x8", "pwm_c_z",
};
static const char * const pwm_d_groups[] = {
"pwm_d_x3", "pwm_d_x6",
"pwm_d_a", "pwm_d_x3", "pwm_d_x6", "pwm_d_z",
};
static const char * const pwm_e_groups[] = {

View File

@ -361,7 +361,7 @@ static int ma35_gpio_core_get(struct gpio_chip *gc, unsigned int gpio)
return !!(readl(reg_pin) & BIT(gpio));
}
static void ma35_gpio_core_set(struct gpio_chip *gc, unsigned int gpio, int val)
static int ma35_gpio_core_set(struct gpio_chip *gc, unsigned int gpio, int val)
{
struct ma35_pin_bank *bank = gpiochip_get_data(gc);
void __iomem *reg_dout = bank->reg_base + MA35_GP_REG_DOUT;
@ -373,6 +373,8 @@ static void ma35_gpio_core_set(struct gpio_chip *gc, unsigned int gpio, int val)
regval = readl(reg_dout) & ~BIT(gpio);
writel(regval, reg_dout);
return 0;
}
static int ma35_gpio_core_to_request(struct gpio_chip *gc, unsigned int gpio)
@ -524,7 +526,7 @@ static int ma35_gpiolib_register(struct platform_device *pdev, struct ma35_pinct
bank->chip.direction_input = ma35_gpio_core_direction_in;
bank->chip.direction_output = ma35_gpio_core_direction_out;
bank->chip.get = ma35_gpio_core_get;
bank->chip.set = ma35_gpio_core_set;
bank->chip.set_rv = ma35_gpio_core_set;
bank->chip.base = -1;
bank->chip.ngpio = bank->nr_pins;
bank->chip.can_sleep = false;

View File

@ -1817,7 +1817,7 @@ static const struct pinconf_ops npcm7xx_pinconf_ops = {
};
/* pinctrl_desc */
static struct pinctrl_desc npcm7xx_pinctrl_desc = {
static const struct pinctrl_desc npcm7xx_pinctrl_desc = {
.name = "npcm7xx-pinctrl",
.pins = npcm7xx_pins,
.npins = ARRAY_SIZE(npcm7xx_pins),

View File

@ -2299,7 +2299,7 @@ static const struct pinconf_ops npcm8xx_pinconf_ops = {
};
/* pinctrl_desc */
static struct pinctrl_desc npcm8xx_pinctrl_desc = {
static const struct pinctrl_desc npcm8xx_pinctrl_desc = {
.name = "npcm8xx-pinctrl",
.pins = npcm8xx_pins,
.npins = ARRAY_SIZE(npcm8xx_pins),

View File

@ -989,7 +989,7 @@ static const struct pinconf_ops wpcm450_pinconf_ops = {
.pin_config_set = wpcm450_config_set,
};
static struct pinctrl_desc wpcm450_pinctrl_desc = {
static const struct pinctrl_desc wpcm450_pinctrl_desc = {
.name = "wpcm450-pinctrl",
.pins = wpcm450_pins,
.npins = ARRAY_SIZE(wpcm450_pins),

View File

@ -872,7 +872,7 @@ static const struct pinconf_ops amd_pinconf_ops = {
static void amd_gpio_irq_init(struct amd_gpio *gpio_dev)
{
struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
const struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
unsigned long flags;
u32 pin_reg, mask;
int i;
@ -901,7 +901,7 @@ static void amd_gpio_irq_init(struct amd_gpio *gpio_dev)
static void amd_gpio_check_pending(void)
{
struct amd_gpio *gpio_dev = pinctrl_dev;
struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
const struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
int i;
if (!pm_debug_messages_on)
@ -957,7 +957,7 @@ static bool amd_gpio_should_save(struct amd_gpio *gpio_dev, unsigned int pin)
static int amd_gpio_suspend_hibernate_common(struct device *dev, bool is_suspend)
{
struct amd_gpio *gpio_dev = dev_get_drvdata(dev);
struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
const struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
unsigned long flags;
int i;
u32 wake_mask = is_suspend ? WAKE_SOURCE_SUSPEND : WAKE_SOURCE_HIBERNATE;
@ -1012,7 +1012,7 @@ static int amd_gpio_hibernate(struct device *dev)
static int amd_gpio_resume(struct device *dev)
{
struct amd_gpio *gpio_dev = dev_get_drvdata(dev);
struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
const struct pinctrl_desc *desc = gpio_dev->pctrl->desc;
unsigned long flags;
int i;

View File

@ -117,7 +117,7 @@ static int amdisp_gpio_get(struct gpio_chip *gc, unsigned int gpio)
return !!(pin_reg & BIT(GPIO_CONTROL_PIN));
}
static void amdisp_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
static int amdisp_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
{
unsigned long flags;
u32 pin_reg;
@ -131,6 +131,8 @@ static void amdisp_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
pin_reg &= ~BIT(GPIO_CONTROL_PIN);
writel(pin_reg, pctrl->gpiobase + gpio_offset[gpio]);
raw_spin_unlock_irqrestore(&pctrl->lock, flags);
return 0;
}
static int amdisp_gpiochip_add(struct platform_device *pdev,
@ -149,7 +151,7 @@ static int amdisp_gpiochip_add(struct platform_device *pdev,
gc->direction_input = amdisp_gpio_direction_input;
gc->direction_output = amdisp_gpio_direction_output;
gc->get = amdisp_gpio_get;
gc->set = amdisp_gpio_set;
gc->set_rv = amdisp_gpio_set;
gc->base = -1;
gc->ngpio = ARRAY_SIZE(amdisp_range_pins);

View File

@ -217,11 +217,13 @@ static int apple_gpio_get(struct gpio_chip *chip, unsigned offset)
return !!(reg & REG_GPIOx_DATA);
}
static void apple_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
static int apple_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct apple_gpio_pinctrl *pctl = gpiochip_get_data(chip);
apple_gpio_set_reg(pctl, offset, REG_GPIOx_DATA, value ? REG_GPIOx_DATA : 0);
return 0;
}
static int apple_gpio_direction_input(struct gpio_chip *chip, unsigned int offset)
@ -376,7 +378,7 @@ static int apple_gpio_register(struct apple_gpio_pinctrl *pctl)
pctl->gpio_chip.direction_input = apple_gpio_direction_input;
pctl->gpio_chip.direction_output = apple_gpio_direction_output;
pctl->gpio_chip.get = apple_gpio_get;
pctl->gpio_chip.set = apple_gpio_set;
pctl->gpio_chip.set_rv = apple_gpio_set;
pctl->gpio_chip.base = -1;
pctl->gpio_chip.ngpio = pctl->pinctrl_desc.npins;
pctl->gpio_chip.parent = pctl->dev;

View File

@ -907,7 +907,7 @@ static const struct pinconf_ops artpec6_pconf_ops = {
.pin_config_group_set = artpec6_pconf_group_set,
};
static struct pinctrl_desc artpec6_desc = {
static const struct pinctrl_desc artpec6_desc = {
.name = "artpec6-pinctrl",
.owner = THIS_MODULE,
.pins = artpec6_pins,

View File

@ -422,6 +422,8 @@ static struct pinctrl_desc as3722_pinctrl_desc = {
.pmxops = &as3722_pinmux_ops,
.confops = &as3722_pinconf_ops,
.owner = THIS_MODULE,
.pins = as3722_pins_desc,
.npins = ARRAY_SIZE(as3722_pins_desc),
};
static int as3722_gpio_get(struct gpio_chip *chip, unsigned offset)
@ -471,8 +473,8 @@ static int as3722_gpio_get(struct gpio_chip *chip, unsigned offset)
return (invert_enable) ? !val : val;
}
static void as3722_gpio_set(struct gpio_chip *chip, unsigned offset,
int value)
static int as3722_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct as3722_pctrl_info *as_pci = gpiochip_get_data(chip);
struct as3722 *as3722 = as_pci->as3722;
@ -484,7 +486,7 @@ static void as3722_gpio_set(struct gpio_chip *chip, unsigned offset,
if (ret < 0) {
dev_err(as_pci->dev,
"GPIO_CONTROL%d_REG read failed: %d\n", offset, ret);
return;
return ret;
}
en_invert = !!(val & AS3722_GPIO_INV);
@ -498,12 +500,19 @@ static void as3722_gpio_set(struct gpio_chip *chip, unsigned offset,
if (ret < 0)
dev_err(as_pci->dev,
"GPIO_SIGNAL_OUT_REG update failed: %d\n", ret);
return ret;
}
static int as3722_gpio_direction_output(struct gpio_chip *chip,
unsigned offset, int value)
unsigned int offset, int value)
{
as3722_gpio_set(chip, offset, value);
int ret;
ret = as3722_gpio_set(chip, offset, value);
if (ret)
return ret;
return pinctrl_gpio_direction_output(chip, offset);
}
@ -520,7 +529,7 @@ static const struct gpio_chip as3722_gpio_chip = {
.request = gpiochip_generic_request,
.free = gpiochip_generic_free,
.get = as3722_gpio_get,
.set = as3722_gpio_set,
.set_rv = as3722_gpio_set,
.direction_input = pinctrl_gpio_direction_input,
.direction_output = as3722_gpio_direction_output,
.to_irq = as3722_gpio_to_irq,
@ -550,8 +559,6 @@ static int as3722_pinctrl_probe(struct platform_device *pdev)
as_pci->pin_groups = as3722_pingroups;
as_pci->num_pin_groups = ARRAY_SIZE(as3722_pingroups);
as3722_pinctrl_desc.name = dev_name(&pdev->dev);
as3722_pinctrl_desc.pins = as3722_pins_desc;
as3722_pinctrl_desc.npins = ARRAY_SIZE(as3722_pins_desc);
as_pci->pctl = devm_pinctrl_register(&pdev->dev, &as3722_pinctrl_desc,
as_pci);
if (IS_ERR(as_pci->pctl)) {

View File

@ -1212,9 +1212,9 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
dev_dbg(dev, "bank %i: irq=%d\n", i, ret);
}
atmel_pioctrl->irq_domain = irq_domain_create_linear(of_fwnode_handle(dev->of_node),
atmel_pioctrl->gpio_chip->ngpio,
&irq_domain_simple_ops, NULL);
atmel_pioctrl->irq_domain = irq_domain_create_linear(dev_fwnode(dev),
atmel_pioctrl->gpio_chip->ngpio,
&irq_domain_simple_ops, NULL);
if (!atmel_pioctrl->irq_domain)
return dev_err_probe(dev, -ENODEV, "can't add the irq domain\n");

View File

@ -625,14 +625,14 @@ out:
return ret;
}
static void aw9523_gpio_set_multiple(struct gpio_chip *chip,
static int aw9523_gpio_set_multiple(struct gpio_chip *chip,
unsigned long *mask,
unsigned long *bits)
{
struct aw9523 *awi = gpiochip_get_data(chip);
u8 mask_lo, mask_hi, bits_lo, bits_hi;
unsigned int reg;
int ret;
int ret = 0;
mask_lo = *mask;
mask_hi = *mask >> 8;
@ -644,27 +644,33 @@ static void aw9523_gpio_set_multiple(struct gpio_chip *chip,
reg = AW9523_REG_OUT_STATE(AW9523_PINS_PER_PORT);
ret = regmap_write_bits(awi->regmap, reg, mask_hi, bits_hi);
if (ret)
dev_warn(awi->dev, "Cannot write port1 out level\n");
goto out;
}
if (mask_lo) {
reg = AW9523_REG_OUT_STATE(0);
ret = regmap_write_bits(awi->regmap, reg, mask_lo, bits_lo);
if (ret)
dev_warn(awi->dev, "Cannot write port0 out level\n");
goto out;
}
out:
mutex_unlock(&awi->i2c_lock);
return ret;
}
static void aw9523_gpio_set(struct gpio_chip *chip,
unsigned int offset, int value)
static int aw9523_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct aw9523 *awi = gpiochip_get_data(chip);
u8 regbit = offset % AW9523_PINS_PER_PORT;
int ret;
mutex_lock(&awi->i2c_lock);
regmap_update_bits(awi->regmap, AW9523_REG_OUT_STATE(offset),
BIT(regbit), value ? BIT(regbit) : 0);
ret = regmap_update_bits(awi->regmap, AW9523_REG_OUT_STATE(offset),
BIT(regbit), value ? BIT(regbit) : 0);
mutex_unlock(&awi->i2c_lock);
return ret;
}
@ -779,8 +785,8 @@ static int aw9523_init_gpiochip(struct aw9523 *awi, unsigned int npins)
gc->direction_output = aw9523_direction_output;
gc->get = aw9523_gpio_get;
gc->get_multiple = aw9523_gpio_get_multiple;
gc->set = aw9523_gpio_set;
gc->set_multiple = aw9523_gpio_set_multiple;
gc->set_rv = aw9523_gpio_set;
gc->set_multiple_rv = aw9523_gpio_set_multiple;
gc->set_config = gpiochip_generic_config;
gc->parent = dev;
gc->owner = THIS_MODULE;

View File

@ -1298,7 +1298,7 @@ static const struct pinmux_ops bm1880_pinmux_ops = {
.set_mux = bm1880_pinmux_set_mux,
};
static struct pinctrl_desc bm1880_desc = {
static const struct pinctrl_desc bm1880_desc = {
.name = "bm1880_pinctrl",
.pins = bm1880_pins,
.npins = ARRAY_SIZE(bm1880_pins),

View File

@ -102,14 +102,14 @@ static int da9062_gpio_get(struct gpio_chip *gc, unsigned int offset)
return !!(val & BIT(offset));
}
static void da9062_gpio_set(struct gpio_chip *gc, unsigned int offset,
int value)
static int da9062_gpio_set(struct gpio_chip *gc, unsigned int offset,
int value)
{
struct da9062_pctl *pctl = gpiochip_get_data(gc);
struct regmap *regmap = pctl->da9062->regmap;
regmap_update_bits(regmap, DA9062AA_GPIO_MODE0_4, BIT(offset),
value << offset);
return regmap_update_bits(regmap, DA9062AA_GPIO_MODE0_4, BIT(offset),
value << offset);
}
static int da9062_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
@ -172,9 +172,7 @@ static int da9062_gpio_direction_output(struct gpio_chip *gc,
if (ret)
return ret;
da9062_gpio_set(gc, offset, value);
return 0;
return da9062_gpio_set(gc, offset, value);
}
static int da9062_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
@ -235,7 +233,7 @@ static int da9062_gpio_to_irq(struct gpio_chip *gc, unsigned int offset)
static const struct gpio_chip reference_gc = {
.owner = THIS_MODULE,
.get = da9062_gpio_get,
.set = da9062_gpio_set,
.set_rv = da9062_gpio_set,
.get_direction = da9062_gpio_get_direction,
.direction_input = da9062_gpio_direction_input,
.direction_output = da9062_gpio_direction_output,

View File

@ -182,7 +182,7 @@ static int dc_gpio_direction_input(struct gpio_chip *chip, unsigned gpio)
return 0;
}
static void dc_gpio_set(struct gpio_chip *chip, unsigned gpio, int value);
static int dc_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value);
static int dc_gpio_direction_output(struct gpio_chip *chip, unsigned gpio,
int value)
@ -216,7 +216,7 @@ static int dc_gpio_get(struct gpio_chip *chip, unsigned gpio)
return !!(input & BIT(bit_off));
}
static void dc_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
static int dc_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)
{
struct dc_pinmap *pmap = gpiochip_get_data(chip);
int reg_off = GP_OUTPUT0(gpio/PINS_PER_COLLECTION);
@ -232,6 +232,8 @@ static void dc_gpio_set(struct gpio_chip *chip, unsigned gpio, int value)
output &= ~BIT(bit_off);
writeb_relaxed(output, pmap->regs + reg_off);
spin_unlock_irqrestore(&pmap->lock, flags);
return 0;
}
static int dc_gpiochip_add(struct dc_pinmap *pmap)
@ -246,7 +248,7 @@ static int dc_gpiochip_add(struct dc_pinmap *pmap)
chip->direction_input = dc_gpio_direction_input;
chip->direction_output = dc_gpio_direction_output;
chip->get = dc_gpio_get;
chip->set = dc_gpio_set;
chip->set_rv = dc_gpio_set;
chip->base = -1;
chip->ngpio = PINS_COUNT;

View File

@ -0,0 +1,704 @@
// SPDX-License-Identifier: GPL-2.0
/*
* ESWIN Pinctrl Controller Platform Device Driver
*
* Copyright 2024, Beijing ESWIN Computing Technology Co., Ltd.. All rights reserved.
*
* Authors: Samuel Holland <samuel.holland@sifive.com>
* Yulin Lu <luyulin@eswincomputing.com>
*/
#include <linux/bitfield.h>
#include <linux/device.h>
#include <linux/io.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/seq_file.h>
#include <linux/regulator/consumer.h>
#include <linux/pinctrl/pinconf.h>
#include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>
#include "core.h"
#include "pinmux.h"
#include "pinconf.h"
#define EIC7700_PIN_REG(i) (4 * (i))
#define EIC7700_IE BIT(0)
#define EIC7700_PU BIT(1)
#define EIC7700_PD BIT(2)
#define EIC7700_DS GENMASK(6, 3)
#define EIC7700_ST BIT(7)
#define EIC7700_FUNC_SEL GENMASK(18, 16)
#define EIC7700_BIAS (EIC7700_PD | EIC7700_PU)
#define EIC7700_PINCONF GENMASK(7, 0)
#define EIC7700_RGMII0_SEL_MODE (0x310 - 0x80)
#define EIC7700_RGMII1_SEL_MODE (0x314 - 0x80)
#define EIC7700_MS GENMASK(1, 0)
#define EIC7700_MS_3V3 0x0
#define EIC7700_MS_1V8 0x3
#define EIC7700_FUNCTIONS_PER_PIN 8
struct eic7700_pin {
u8 functions[EIC7700_FUNCTIONS_PER_PIN];
};
struct eic7700_pinctrl {
void __iomem *base;
struct pinctrl_desc desc;
unsigned int functions_count;
struct pinfunction functions[] __counted_by(functions_count);
};
enum {
F_DISABLED,
F_BOOT_SEL,
F_CHIP_MODE,
F_EMMC,
F_FAN_TACH,
F_GPIO,
F_HDMI,
F_I2C,
F_I2S,
F_JTAG,
F_DDR_REF_CLK_SEL,
F_LPDDR_REF_CLK,
F_MIPI_CSI,
F_OSC,
F_PCIE,
F_PWM,
F_RGMII,
F_RESET,
F_SATA,
F_SDIO,
F_SPI,
F_S_MODE,
F_UART,
F_USB,
EIC7700_FUNCTIONS_COUNT
};
static const char *const eic7700_functions[EIC7700_FUNCTIONS_COUNT] = {
[F_DISABLED] = "disabled",
[F_BOOT_SEL] = "boot_sel",
[F_CHIP_MODE] = "chip_mode",
[F_EMMC] = "emmc",
[F_FAN_TACH] = "fan_tach",
[F_GPIO] = "gpio",
[F_HDMI] = "hdmi",
[F_I2C] = "i2c",
[F_I2S] = "i2s",
[F_JTAG] = "jtag",
[F_DDR_REF_CLK_SEL] = "ddr_ref_clk_sel",
[F_LPDDR_REF_CLK] = "lpddr_ref_clk",
[F_MIPI_CSI] = "mipi_csi",
[F_OSC] = "osc",
[F_PCIE] = "pcie",
[F_PWM] = "pwm",
[F_RGMII] = "rgmii",
[F_RESET] = "reset",
[F_SATA] = "sata",
[F_SDIO] = "sdio",
[F_SPI] = "spi",
[F_S_MODE] = "s_mode",
[F_UART] = "uart",
[F_USB] = "usb",
};
#define EIC7700_PIN(_number, _name, ...) \
{ \
.number = _number, \
.name = _name, \
.drv_data = (void *)&(struct eic7700_pin) { { __VA_ARGS__ } } \
}
static const struct pinctrl_pin_desc eic7700_pins[] = {
EIC7700_PIN(0, "chip_mode", [0] = F_CHIP_MODE),
EIC7700_PIN(1, "mode_set0", [0] = F_SDIO, [2] = F_GPIO),
EIC7700_PIN(2, "mode_set1", [0] = F_SDIO, [2] = F_GPIO),
EIC7700_PIN(3, "mode_set2", [0] = F_SDIO, [2] = F_GPIO),
EIC7700_PIN(4, "mode_set3", [0] = F_SDIO, [2] = F_GPIO),
EIC7700_PIN(5, "xin", [0] = F_OSC),
EIC7700_PIN(6, "rtc_xin", [0] = F_DISABLED),
EIC7700_PIN(7, "rst_out_n", [0] = F_RESET),
EIC7700_PIN(8, "key_reset_n", [0] = F_RESET),
EIC7700_PIN(9, "rst_in_n", [0] = F_DISABLED),
EIC7700_PIN(10, "por_in_n", [0] = F_DISABLED),
EIC7700_PIN(11, "por_out_n", [0] = F_DISABLED),
EIC7700_PIN(12, "gpio0", [0] = F_GPIO),
EIC7700_PIN(13, "por_sel", [0] = F_RESET),
EIC7700_PIN(14, "jtag0_tck", [0] = F_JTAG, [1] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(15, "jtag0_tms", [0] = F_JTAG, [1] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(16, "jtag0_tdi", [0] = F_JTAG, [1] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(17, "jtag0_tdo", [0] = F_JTAG, [1] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(18, "gpio5", [0] = F_GPIO, [1] = F_SPI),
EIC7700_PIN(19, "spi2_cs0_n", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(20, "jtag1_tck", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(21, "jtag1_tms", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(22, "jtag1_tdi", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(23, "jtag1_tdo", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(24, "gpio11", [0] = F_GPIO),
EIC7700_PIN(25, "spi2_cs1_n", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(26, "pcie_clkreq_n", [0] = F_PCIE),
EIC7700_PIN(27, "pcie_wake_n", [0] = F_PCIE),
EIC7700_PIN(28, "pcie_perst_n", [0] = F_PCIE),
EIC7700_PIN(29, "hdmi_scl", [0] = F_HDMI),
EIC7700_PIN(30, "hdmi_sda", [0] = F_HDMI),
EIC7700_PIN(31, "hdmi_cec", [0] = F_HDMI),
EIC7700_PIN(32, "jtag2_trst", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(33, "rgmii0_clk_125", [0] = F_RGMII),
EIC7700_PIN(34, "rgmii0_txen", [0] = F_RGMII),
EIC7700_PIN(35, "rgmii0_txclk", [0] = F_RGMII),
EIC7700_PIN(36, "rgmii0_txd0", [0] = F_RGMII),
EIC7700_PIN(37, "rgmii0_txd1", [0] = F_RGMII),
EIC7700_PIN(38, "rgmii0_txd2", [0] = F_RGMII),
EIC7700_PIN(39, "rgmii0_txd3", [0] = F_RGMII),
EIC7700_PIN(40, "i2s0_bclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(41, "i2s0_wclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(42, "i2s0_sdi", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(43, "i2s0_sdo", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(44, "i2s_mclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(45, "rgmii0_rxclk", [0] = F_RGMII),
EIC7700_PIN(46, "rgmii0_rxdv", [0] = F_RGMII),
EIC7700_PIN(47, "rgmii0_rxd0", [0] = F_RGMII),
EIC7700_PIN(48, "rgmii0_rxd1", [0] = F_RGMII),
EIC7700_PIN(49, "rgmii0_rxd2", [0] = F_RGMII),
EIC7700_PIN(50, "rgmii0_rxd3", [0] = F_RGMII),
EIC7700_PIN(51, "i2s2_bclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(52, "i2s2_wclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(53, "i2s2_sdi", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(54, "i2s2_sdo", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(55, "gpio27", [0] = F_GPIO, [1] = F_SATA),
EIC7700_PIN(56, "gpio28", [0] = F_GPIO),
EIC7700_PIN(57, "gpio29", [0] = F_RESET, [1] = F_EMMC, [2] = F_GPIO),
EIC7700_PIN(58, "rgmii0_mdc", [0] = F_RGMII),
EIC7700_PIN(59, "rgmii0_mdio", [0] = F_RGMII),
EIC7700_PIN(60, "rgmii0_intb", [0] = F_RGMII),
EIC7700_PIN(61, "rgmii1_clk_125", [0] = F_RGMII),
EIC7700_PIN(62, "rgmii1_txen", [0] = F_RGMII),
EIC7700_PIN(63, "rgmii1_txclk", [0] = F_RGMII),
EIC7700_PIN(64, "rgmii1_txd0", [0] = F_RGMII),
EIC7700_PIN(65, "rgmii1_txd1", [0] = F_RGMII),
EIC7700_PIN(66, "rgmii1_txd2", [0] = F_RGMII),
EIC7700_PIN(67, "rgmii1_txd3", [0] = F_RGMII),
EIC7700_PIN(68, "i2s1_bclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(69, "i2s1_wclk", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(70, "i2s1_sdi", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(71, "i2s1_sdo", [0] = F_I2S, [2] = F_GPIO),
EIC7700_PIN(72, "gpio34", [0] = F_RESET, [1] = F_SDIO, [2] = F_GPIO),
EIC7700_PIN(73, "rgmii1_rxclk", [0] = F_RGMII),
EIC7700_PIN(74, "rgmii1_rxdv", [0] = F_RGMII),
EIC7700_PIN(75, "rgmii1_rxd0", [0] = F_RGMII),
EIC7700_PIN(76, "rgmii1_rxd1", [0] = F_RGMII),
EIC7700_PIN(77, "rgmii1_rxd2", [0] = F_RGMII),
EIC7700_PIN(78, "rgmii1_rxd3", [0] = F_RGMII),
EIC7700_PIN(79, "spi1_cs0_n", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(80, "spi1_clk", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(81, "spi1_d0", [0] = F_SPI, [1] = F_I2C, [2] = F_GPIO, [3] = F_UART),
EIC7700_PIN(82, "spi1_d1", [0] = F_SPI, [1] = F_I2C, [2] = F_GPIO, [3] = F_UART),
EIC7700_PIN(83, "spi1_d2", [0] = F_SPI, [1] = F_SDIO, [2] = F_GPIO),
EIC7700_PIN(84, "spi1_d3", [0] = F_SPI, [1] = F_PWM, [2] = F_GPIO),
EIC7700_PIN(85, "spi1_cs1_n", [0] = F_SPI, [1] = F_PWM, [2] = F_GPIO),
EIC7700_PIN(86, "rgmii1_mdc", [0] = F_RGMII),
EIC7700_PIN(87, "rgmii1_mdio", [0] = F_RGMII),
EIC7700_PIN(88, "rgmii1_intb", [0] = F_RGMII),
EIC7700_PIN(89, "usb0_pwren", [0] = F_USB, [2] = F_GPIO),
EIC7700_PIN(90, "usb1_pwren", [0] = F_USB, [2] = F_GPIO),
EIC7700_PIN(91, "i2c0_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(92, "i2c0_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(93, "i2c1_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(94, "i2c1_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(95, "i2c2_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(96, "i2c2_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(97, "i2c3_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(98, "i2c3_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(99, "i2c4_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(100, "i2c4_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(101, "i2c5_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(102, "i2c5_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(103, "uart0_tx", [0] = F_UART, [2] = F_GPIO),
EIC7700_PIN(104, "uart0_rx", [0] = F_UART, [2] = F_GPIO),
EIC7700_PIN(105, "uart1_tx", [0] = F_UART, [2] = F_GPIO),
EIC7700_PIN(106, "uart1_rx", [0] = F_UART, [2] = F_GPIO),
EIC7700_PIN(107, "uart1_cts", [0] = F_UART, [1] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(108, "uart1_rts", [0] = F_UART, [1] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(109, "uart2_tx", [0] = F_UART, [1] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(110, "uart2_rx", [0] = F_UART, [1] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(111, "jtag2_tck", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(112, "jtag2_tms", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(113, "jtag2_tdi", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(114, "jtag2_tdo", [0] = F_JTAG, [2] = F_GPIO),
EIC7700_PIN(115, "fan_pwm", [0] = F_PWM, [2] = F_GPIO),
EIC7700_PIN(116, "fan_tach", [0] = F_FAN_TACH, [2] = F_GPIO),
EIC7700_PIN(117, "mipi_csi0_xvs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(118, "mipi_csi0_xhs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(119, "mipi_csi0_mclk", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(120, "mipi_csi1_xvs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(121, "mipi_csi1_xhs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(122, "mipi_csi1_mclk", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(123, "mipi_csi2_xvs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(124, "mipi_csi2_xhs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(125, "mipi_csi2_mclk", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(126, "mipi_csi3_xvs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(127, "mipi_csi3_xhs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(128, "mipi_csi3_mclk", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(129, "mipi_csi4_xvs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(130, "mipi_csi4_xhs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(131, "mipi_csi4_mclk", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(132, "mipi_csi5_xvs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(133, "mipi_csi5_xhs", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(134, "mipi_csi5_mclk", [0] = F_MIPI_CSI, [2] = F_GPIO),
EIC7700_PIN(135, "spi3_cs_n", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(136, "spi3_clk", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(137, "spi3_di", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(138, "spi3_do", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(139, "gpio92", [0] = F_I2C, [1] = F_MIPI_CSI, [2] = F_GPIO, [3] = F_UART),
EIC7700_PIN(140, "gpio93", [0] = F_I2C, [1] = F_MIPI_CSI, [2] = F_GPIO, [3] = F_UART),
EIC7700_PIN(141, "s_mode", [0] = F_S_MODE, [2] = F_GPIO),
EIC7700_PIN(142, "gpio95", [0] = F_DDR_REF_CLK_SEL, [2] = F_GPIO),
EIC7700_PIN(143, "spi0_cs_n", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(144, "spi0_clk", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(145, "spi0_d0", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(146, "spi0_d1", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(147, "spi0_d2", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(148, "spi0_d3", [0] = F_SPI, [2] = F_GPIO),
EIC7700_PIN(149, "i2c10_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(150, "i2c10_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(151, "i2c11_scl", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(152, "i2c11_sda", [0] = F_I2C, [2] = F_GPIO),
EIC7700_PIN(153, "gpio106", [0] = F_GPIO),
EIC7700_PIN(154, "boot_sel0", [0] = F_BOOT_SEL, [2] = F_GPIO),
EIC7700_PIN(155, "boot_sel1", [0] = F_BOOT_SEL, [2] = F_GPIO),
EIC7700_PIN(156, "boot_sel2", [0] = F_BOOT_SEL, [2] = F_GPIO),
EIC7700_PIN(157, "boot_sel3", [0] = F_BOOT_SEL, [2] = F_GPIO),
EIC7700_PIN(158, "gpio111", [0] = F_GPIO),
EIC7700_PIN(159, "reserved0", [0] = F_DISABLED),
EIC7700_PIN(160, "reserved1", [0] = F_DISABLED),
EIC7700_PIN(161, "reserved2", [0] = F_DISABLED),
EIC7700_PIN(162, "reserved3", [0] = F_DISABLED),
EIC7700_PIN(163, "lpddr_ref_clk", [0] = F_LPDDR_REF_CLK),
};
static int eic7700_get_groups_count(struct pinctrl_dev *pctldev)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
return pc->desc.npins;
}
static const char *eic7700_get_group_name(struct pinctrl_dev *pctldev, unsigned int selector)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
return pc->desc.pins[selector].name;
}
static int eic7700_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector,
const unsigned int **pins, unsigned int *npins)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
*pins = &pc->desc.pins[selector].number;
*npins = 1;
return 0;
}
static const struct pinctrl_ops eic7700_pinctrl_ops = {
.get_groups_count = eic7700_get_groups_count,
.get_group_name = eic7700_get_group_name,
.get_group_pins = eic7700_get_group_pins,
#ifdef CONFIG_OF
.dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
.dt_free_map = pinconf_generic_dt_free_map,
#endif
};
static int eic7700_pin_config_get(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned long *config)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
const struct eic7700_pin *pin_data = pc->desc.pins[pin].drv_data;
u32 arg, value;
int param;
if (pin_data->functions[0] == F_OSC || pin_data->functions[0] == F_DISABLED)
return -EOPNOTSUPP;
value = readl_relaxed(pc->base + EIC7700_PIN_REG(pin));
param = pinconf_to_config_param(*config);
switch (param) {
case PIN_CONFIG_BIAS_DISABLE:
arg = (value & EIC7700_BIAS) == 0;
break;
case PIN_CONFIG_BIAS_PULL_DOWN:
arg = (value & EIC7700_BIAS) == EIC7700_PD;
break;
case PIN_CONFIG_BIAS_PULL_UP:
arg = (value & EIC7700_BIAS) == EIC7700_PU;
break;
case PIN_CONFIG_DRIVE_STRENGTH_UA:
if (pin_data->functions[0] == F_RGMII ||
pin_data->functions[0] == F_LPDDR_REF_CLK)
arg = FIELD_GET(EIC7700_DS, value) * 3000 + 3000;
else
arg = FIELD_GET(EIC7700_DS, value) * 3000 + 6000;
break;
case PIN_CONFIG_INPUT_ENABLE:
arg = value & EIC7700_IE;
break;
case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
arg = value & EIC7700_ST;
break;
default:
return -EOPNOTSUPP;
}
*config = pinconf_to_config_packed(param, arg);
return arg ? 0 : -EINVAL;
}
static int eic7700_pin_config_set(struct pinctrl_dev *pctldev, unsigned int pin,
unsigned long *configs, unsigned int num_configs)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
const struct eic7700_pin *pin_data = pc->desc.pins[pin].drv_data;
u32 value;
if (pin_data->functions[0] == F_OSC || pin_data->functions[0] == F_DISABLED)
return -EOPNOTSUPP;
value = readl_relaxed(pc->base + EIC7700_PIN_REG(pin));
for (unsigned int i = 0; i < num_configs; i++) {
int param = pinconf_to_config_param(configs[i]);
u32 arg = pinconf_to_config_argument(configs[i]);
switch (param) {
case PIN_CONFIG_BIAS_DISABLE:
value &= ~EIC7700_BIAS;
break;
case PIN_CONFIG_BIAS_PULL_DOWN:
if (arg == 0)
return -EOPNOTSUPP;
value &= ~EIC7700_BIAS;
value |= EIC7700_PD;
break;
case PIN_CONFIG_BIAS_PULL_UP:
if (arg == 0)
return -EOPNOTSUPP;
value &= ~EIC7700_BIAS;
value |= EIC7700_PU;
break;
case PIN_CONFIG_DRIVE_STRENGTH_UA:
value &= ~EIC7700_DS;
if (pin_data->functions[0] == F_RGMII ||
pin_data->functions[0] == F_LPDDR_REF_CLK) {
if (arg < 3000 || arg > 24000)
return -EOPNOTSUPP;
value |= FIELD_PREP(EIC7700_DS, (arg - 3000) / 3000);
} else {
if (arg < 6000 || arg > 27000)
return -EOPNOTSUPP;
value |= FIELD_PREP(EIC7700_DS, (arg - 6000) / 3000);
}
break;
case PIN_CONFIG_INPUT_ENABLE:
if (arg)
value |= EIC7700_IE;
else
value &= ~EIC7700_IE;
break;
case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
if (arg)
value |= EIC7700_ST;
else
value &= ~EIC7700_ST;
break;
default:
return -EOPNOTSUPP;
}
}
writel_relaxed(value, pc->base + EIC7700_PIN_REG(pin));
return 0;
}
#ifdef CONFIG_DEBUG_FS
static void eic7700_pin_config_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
unsigned int pin)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
u32 value = readl_relaxed(pc->base + EIC7700_PIN_REG(pin)) & EIC7700_PINCONF;
seq_printf(s, " [0x%02x]", value);
}
#else
#define eic7700_pin_config_dbg_show NULL
#endif
static const struct pinconf_ops eic7700_pinconf_ops = {
.is_generic = true,
.pin_config_get = eic7700_pin_config_get,
.pin_config_set = eic7700_pin_config_set,
.pin_config_group_get = eic7700_pin_config_get,
.pin_config_group_set = eic7700_pin_config_set,
.pin_config_dbg_show = eic7700_pin_config_dbg_show,
.pin_config_group_dbg_show = eic7700_pin_config_dbg_show,
};
static int eic7700_get_functions_count(struct pinctrl_dev *pctldev)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
return pc->functions_count;
}
static const char *eic7700_get_function_name(struct pinctrl_dev *pctldev, unsigned int selector)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
return pc->functions[selector].name;
}
static int eic7700_get_function_groups(struct pinctrl_dev *pctldev, unsigned int selector,
const char *const **groups, unsigned int *num_groups)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
*groups = pc->functions[selector].groups;
*num_groups = pc->functions[selector].ngroups;
return 0;
}
static int eic7700_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
unsigned int group_selector)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
const struct eic7700_pin *pin_data = pc->desc.pins[group_selector].drv_data;
u32 fs, value;
if (pin_data->functions[0] == F_OSC || pin_data->functions[0] == F_DISABLED)
return -EOPNOTSUPP;
for (fs = 0; fs < EIC7700_FUNCTIONS_PER_PIN; fs++)
if (pin_data->functions[fs] == func_selector)
break;
if (fs == EIC7700_FUNCTIONS_PER_PIN) {
dev_err(pctldev->dev, "invalid mux %s for pin %s\n",
pc->functions[func_selector].name,
pc->desc.pins[group_selector].name);
return -EINVAL;
}
value = readl_relaxed(pc->base + EIC7700_PIN_REG(group_selector));
value &= ~EIC7700_FUNC_SEL;
value |= FIELD_PREP(EIC7700_FUNC_SEL, fs);
writel_relaxed(value, pc->base + EIC7700_PIN_REG(group_selector));
return 0;
}
static int eic7700_gpio_request_enable(struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range, unsigned int offset)
{
return eic7700_set_mux(pctldev, F_GPIO, offset);
}
static void eic7700_gpio_disable_free(struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range, unsigned int offset)
{
eic7700_set_mux(pctldev, F_DISABLED, offset);
}
static int eic7700_gpio_set_direction(struct pinctrl_dev *pctldev,
struct pinctrl_gpio_range *range, unsigned int offset,
bool input)
{
struct eic7700_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
u32 value;
value = readl_relaxed(pc->base + EIC7700_PIN_REG(offset));
if (input)
value |= EIC7700_IE;
else
value &= ~EIC7700_IE;
writel_relaxed(value, pc->base + EIC7700_PIN_REG(offset));
return 0;
}
static const struct pinmux_ops eic7700_pinmux_ops = {
.get_functions_count = eic7700_get_functions_count,
.get_function_name = eic7700_get_function_name,
.get_function_groups = eic7700_get_function_groups,
.set_mux = eic7700_set_mux,
.gpio_request_enable = eic7700_gpio_request_enable,
.gpio_disable_free = eic7700_gpio_disable_free,
.gpio_set_direction = eic7700_gpio_set_direction,
.strict = true,
};
static int eic7700_pinctrl_init_function_groups(struct device *dev, struct eic7700_pinctrl *pc,
const char *const *function_names)
{
unsigned int ngroups = 0;
const char **groups;
/* Count the number of groups for each function */
for (unsigned int pin = 0; pin < pc->desc.npins; pin++) {
const struct eic7700_pin *pin_data = pc->desc.pins[pin].drv_data;
bool found_disabled = false;
for (unsigned int fs = 0; fs < EIC7700_FUNCTIONS_PER_PIN; fs++) {
unsigned int selector = pin_data->functions[fs];
struct pinfunction *function = &pc->functions[selector];
/* Only count F_DISABLED once per pin */
if (selector == F_DISABLED) {
if (found_disabled)
continue;
found_disabled = true;
}
function->ngroups++;
ngroups++;
}
}
groups = devm_kcalloc(dev, ngroups, sizeof(*groups), GFP_KERNEL);
if (!groups)
return -ENOMEM;
for (unsigned int selector = 0; selector < pc->functions_count; selector++) {
struct pinfunction *function = &pc->functions[selector];
function->name = function_names[selector];
function->groups = groups;
groups += function->ngroups;
/* Reset per-function ngroups for use as iterator below */
function->ngroups = 0;
}
/* Fill in the group pointers for each function */
for (unsigned int pin = 0; pin < pc->desc.npins; pin++) {
const struct pinctrl_pin_desc *desc = &pc->desc.pins[pin];
const struct eic7700_pin *pin_data = desc->drv_data;
bool found_disabled = false;
for (unsigned int fs = 0; fs < EIC7700_FUNCTIONS_PER_PIN; fs++) {
unsigned int selector = pin_data->functions[fs];
struct pinfunction *function = &pc->functions[selector];
/* Only count F_DISABLED once per pin */
if (selector == F_DISABLED) {
if (found_disabled)
continue;
found_disabled = true;
}
((const char **)function->groups)[function->ngroups++] = desc->name;
}
}
return 0;
}
static int eic7700_pinctrl_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct pinctrl_dev *pctldev;
struct eic7700_pinctrl *pc;
struct regulator *regulator;
u32 rgmii0_mode, rgmii1_mode;
int ret, voltage;
pc = devm_kzalloc(dev, struct_size(pc, functions, EIC7700_FUNCTIONS_COUNT), GFP_KERNEL);
if (!pc)
return -ENOMEM;
pc->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(pc->base))
return PTR_ERR(pc->base);
regulator = devm_regulator_get(dev, "vrgmii");
if (IS_ERR_OR_NULL(regulator)) {
return dev_err_probe(dev, PTR_ERR(regulator),
"failed to get vrgmii regulator\n");
}
voltage = regulator_get_voltage(regulator);
if (voltage < 0) {
return dev_err_probe(&pdev->dev, voltage,
"Failed to get voltage from regulator\n");
}
rgmii0_mode = readl_relaxed(pc->base + EIC7700_RGMII0_SEL_MODE);
rgmii1_mode = readl_relaxed(pc->base + EIC7700_RGMII1_SEL_MODE);
rgmii0_mode &= ~EIC7700_MS;
rgmii1_mode &= ~EIC7700_MS;
if (voltage == 1800000) {
rgmii0_mode |= FIELD_PREP(EIC7700_MS, EIC7700_MS_1V8);
rgmii1_mode |= FIELD_PREP(EIC7700_MS, EIC7700_MS_1V8);
} else if (voltage == 3300000) {
rgmii0_mode |= FIELD_PREP(EIC7700_MS, EIC7700_MS_3V3);
rgmii1_mode |= FIELD_PREP(EIC7700_MS, EIC7700_MS_3V3);
} else {
return dev_err_probe(&pdev->dev, -EINVAL,
"Invalid voltage configuration, should be either 1.8V or 3.3V\n");
}
writel_relaxed(rgmii0_mode, pc->base + EIC7700_RGMII0_SEL_MODE);
writel_relaxed(rgmii1_mode, pc->base + EIC7700_RGMII1_SEL_MODE);
pc->desc.name = dev_name(dev);
pc->desc.pins = eic7700_pins;
pc->desc.npins = ARRAY_SIZE(eic7700_pins);
pc->desc.pctlops = &eic7700_pinctrl_ops;
pc->desc.pmxops = &eic7700_pinmux_ops;
pc->desc.confops = &eic7700_pinconf_ops;
pc->desc.owner = THIS_MODULE;
pc->functions_count = EIC7700_FUNCTIONS_COUNT;
ret = eic7700_pinctrl_init_function_groups(dev, pc, eic7700_functions);
if (ret)
return ret;
ret = devm_pinctrl_register_and_init(dev, &pc->desc, pc, &pctldev);
if (ret)
return dev_err_probe(dev, ret, "could not register pinctrl driver\n");
return pinctrl_enable(pctldev);
}
static const struct of_device_id eic7700_pinctrl_of_match[] = {
{ .compatible = "eswin,eic7700-pinctrl" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, eic7700_pinctrl_of_match);
static struct platform_driver eic7700_pinctrl_driver = {
.probe = eic7700_pinctrl_probe,
.driver = {
.name = "pinctrl-eic7700",
.of_match_table = eic7700_pinctrl_of_match,
},
};
module_platform_driver(eic7700_pinctrl_driver);
MODULE_DESCRIPTION("Pinctrl driver for the ESWIN EIC7700 SoC");
MODULE_AUTHOR("Samuel Holland <samuel.holland@sifive.com>");
MODULE_AUTHOR("Yulin Lu <luyulin@eswincomputing.com>");
MODULE_LICENSE("GPL");

View File

@ -182,6 +182,8 @@ static int gpiochip_setup(struct device *dev, struct eqbr_gpio_ctrl *gctrl)
gc = &gctrl->chip;
gc->label = gctrl->name;
gc->fwnode = gctrl->fwnode;
gc->request = gpiochip_generic_request;
gc->free = gpiochip_generic_free;
if (!fwnode_property_read_bool(gctrl->fwnode, "interrupt-controller")) {
dev_dbg(dev, "gc %s: doesn't act as interrupt controller!\n",
@ -685,11 +687,8 @@ static int eqbr_build_functions(struct eqbr_pinctrl_drv_data *drvdata)
if (funcs[i].name == NULL)
continue;
ret = pinmux_generic_add_function(drvdata->pctl_dev,
funcs[i].name,
funcs[i].groups,
funcs[i].ngroups,
drvdata);
ret = pinmux_generic_add_pinfunction(drvdata->pctl_dev,
&funcs[i], drvdata);
if (ret < 0) {
dev_err(dev, "Failed to register function %s\n",
funcs[i].name);

View File

@ -505,7 +505,7 @@ static struct platform_driver pinctrl_falcon_driver = {
},
};
int __init pinctrl_falcon_init(void)
static int __init pinctrl_falcon_init(void)
{
return platform_driver_register(&pinctrl_falcon_driver);
}

View File

@ -4574,9 +4574,8 @@ static int __init ingenic_pinctrl_probe(struct platform_device *pdev)
const struct function_desc *function = &chip_info->functions[i];
const struct pinfunction *func = &function->func;
err = pinmux_generic_add_function(jzpc->pctl, func->name,
func->groups, func->ngroups,
function->data);
err = pinmux_generic_add_pinfunction(jzpc->pctl, func,
function->data);
if (err < 0) {
dev_err(dev, "Failed to register function %s\n", func->name);
return err;

View File

@ -879,7 +879,7 @@ static const struct pinctrl_ops k210_pinctrl_ops = {
.dt_free_map = pinconf_generic_dt_free_map,
};
static struct pinctrl_desc k210_pinctrl_desc = {
static const struct pinctrl_desc k210_pinctrl_desc = {
.name = "k210-pinctrl",
.pins = k210_pins,
.npins = K210_NPINS,

View File

@ -477,6 +477,10 @@ static int k230_pinctrl_parse_groups(struct device_node *np,
grp->name = np->name;
list = of_get_property(np, "pinmux", &size);
if (!list) {
dev_err(dev, "failed to get pinmux property\n");
return -EINVAL;
}
size /= sizeof(*list);
grp->num_pins = size;
@ -586,6 +590,7 @@ static int k230_pinctrl_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
struct k230_pinctrl *info;
struct pinctrl_desc *pctl;
int ret;
info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
if (!info)
@ -611,19 +616,21 @@ static int k230_pinctrl_probe(struct platform_device *pdev)
return dev_err_probe(dev, PTR_ERR(info->regmap_base),
"failed to init regmap\n");
ret = k230_pinctrl_parse_dt(pdev, info);
if (ret)
return ret;
info->pctl_dev = devm_pinctrl_register(dev, pctl, info);
if (IS_ERR(info->pctl_dev))
return dev_err_probe(dev, PTR_ERR(info->pctl_dev),
"devm_pinctrl_register failed\n");
k230_pinctrl_parse_dt(pdev, info);
return 0;
}
static const struct of_device_id k230_dt_ids[] = {
{ .compatible = "canaan,k230-pinctrl", },
{ /* sintenel */ }
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, k230_dt_ids);

View File

@ -1188,7 +1188,7 @@ static int keembay_gpio_get(struct gpio_chip *gc, unsigned int pin)
return keembay_read_pin(kpc->base0 + offset, pin);
}
static void keembay_gpio_set(struct gpio_chip *gc, unsigned int pin, int val)
static int keembay_gpio_set(struct gpio_chip *gc, unsigned int pin, int val)
{
struct keembay_pinctrl *kpc = gpiochip_get_data(gc);
unsigned int reg_val;
@ -1200,6 +1200,8 @@ static void keembay_gpio_set(struct gpio_chip *gc, unsigned int pin, int val)
else
keembay_write_gpio_reg(~reg_val | BIT(pin % KEEMBAY_GPIO_MAX_PER_REG),
kpc->base0 + KEEMBAY_GPIO_DATA_LOW, pin);
return 0;
}
static int keembay_gpio_get_direction(struct gpio_chip *gc, unsigned int pin)
@ -1231,9 +1233,8 @@ static int keembay_gpio_set_direction_out(struct gpio_chip *gc,
val = keembay_read_reg(kpc->base1 + KEEMBAY_GPIO_MODE, pin);
val &= ~KEEMBAY_GPIO_MODE_DIR;
keembay_write_reg(val, kpc->base1 + KEEMBAY_GPIO_MODE, pin);
keembay_gpio_set(gc, pin, value);
return 0;
return keembay_gpio_set(gc, pin, value);
}
static void keembay_gpio_irq_handler(struct irq_desc *desc)
@ -1480,7 +1481,7 @@ static int keembay_gpiochip_probe(struct keembay_pinctrl *kpc,
gc->direction_input = keembay_gpio_set_direction_in;
gc->direction_output = keembay_gpio_set_direction_out;
gc->get = keembay_gpio_get;
gc->set = keembay_gpio_set;
gc->set_rv = keembay_gpio_set;
gc->set_config = gpiochip_generic_config;
gc->base = -1;
gc->ngpio = kpc->npins;
@ -1585,13 +1586,9 @@ static int keembay_add_functions(struct keembay_pinctrl *kpc,
}
/* Add all functions */
for (i = 0; i < kpc->nfuncs; i++) {
pinmux_generic_add_function(kpc->pctrl,
functions[i].func.name,
functions[i].func.groups,
functions[i].func.ngroups,
functions[i].data);
}
for (i = 0; i < kpc->nfuncs; i++)
pinmux_generic_add_pinfunction(kpc->pctrl, &functions[i].func,
functions[i].data);
return 0;
}

View File

@ -1257,7 +1257,7 @@ static const struct pinctrl_ops lpc18xx_pctl_ops = {
.dt_free_map = pinctrl_utils_free_map,
};
static struct pinctrl_desc lpc18xx_scu_desc = {
static const struct pinctrl_desc lpc18xx_scu_desc = {
.name = "lpc18xx/43xx-scu",
.pins = lpc18xx_pins,
.npins = ARRAY_SIZE(lpc18xx_pins),

View File

@ -543,6 +543,10 @@ static struct pinctrl_desc max77620_pinctrl_desc = {
.pctlops = &max77620_pinctrl_ops,
.pmxops = &max77620_pinmux_ops,
.confops = &max77620_pinconf_ops,
.pins = max77620_pins_desc,
.npins = ARRAY_SIZE(max77620_pins_desc),
.num_custom_params = ARRAY_SIZE(max77620_cfg_params),
.custom_params = max77620_cfg_params,
};
static int max77620_pinctrl_probe(struct platform_device *pdev)
@ -569,11 +573,6 @@ static int max77620_pinctrl_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, mpci);
max77620_pinctrl_desc.name = dev_name(&pdev->dev);
max77620_pinctrl_desc.pins = max77620_pins_desc;
max77620_pinctrl_desc.npins = ARRAY_SIZE(max77620_pins_desc);
max77620_pinctrl_desc.num_custom_params =
ARRAY_SIZE(max77620_cfg_params);
max77620_pinctrl_desc.custom_params = max77620_cfg_params;
for (i = 0; i < MAX77620_PIN_NUM; ++i) {
mpci->fps_config[i].active_fps_src = -1;

View File

@ -341,24 +341,30 @@ static int __mcp23s08_set(struct mcp23s08 *mcp, unsigned mask, bool value)
return mcp_update_bits(mcp, MCP_OLAT, mask, value ? mask : 0);
}
static void mcp23s08_set(struct gpio_chip *chip, unsigned offset, int value)
static int mcp23s08_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct mcp23s08 *mcp = gpiochip_get_data(chip);
unsigned mask = BIT(offset);
int ret;
mutex_lock(&mcp->lock);
__mcp23s08_set(mcp, mask, !!value);
ret = __mcp23s08_set(mcp, mask, !!value);
mutex_unlock(&mcp->lock);
return ret;
}
static void mcp23s08_set_multiple(struct gpio_chip *chip,
unsigned long *mask, unsigned long *bits)
static int mcp23s08_set_multiple(struct gpio_chip *chip,
unsigned long *mask, unsigned long *bits)
{
struct mcp23s08 *mcp = gpiochip_get_data(chip);
int ret;
mutex_lock(&mcp->lock);
mcp_update_bits(mcp, MCP_OLAT, *mask, *bits);
ret = mcp_update_bits(mcp, MCP_OLAT, *mask, *bits);
mutex_unlock(&mcp->lock);
return ret;
}
static int
@ -626,8 +632,8 @@ int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
mcp->chip.get = mcp23s08_get;
mcp->chip.get_multiple = mcp23s08_get_multiple;
mcp->chip.direction_output = mcp23s08_direction_output;
mcp->chip.set = mcp23s08_set;
mcp->chip.set_multiple = mcp23s08_set_multiple;
mcp->chip.set_rv = mcp23s08_set;
mcp->chip.set_multiple_rv = mcp23s08_set_multiple;
mcp->chip.base = base;
mcp->chip.can_sleep = true;

View File

@ -231,7 +231,7 @@ static const struct pinmux_ops mlxbf3_pmx_ops = {
.gpio_request_enable = mlxbf3_gpio_request_enable,
};
static struct pinctrl_desc mlxbf3_pin_desc = {
static const struct pinctrl_desc mlxbf3_pin_desc = {
.name = "pinctrl-mlxbf3",
.pins = mlxbf3_pins,
.npins = ARRAY_SIZE(mlxbf3_pins),

View File

@ -956,6 +956,8 @@ static struct pinctrl_desc palmas_pinctrl_desc = {
.pmxops = &palmas_pinmux_ops,
.confops = &palmas_pinconf_ops,
.owner = THIS_MODULE,
.pins = palmas_pins_desc,
.npins = ARRAY_SIZE(palmas_pins_desc),
};
struct palmas_pinctrl_data {
@ -1023,8 +1025,6 @@ static int palmas_pinctrl_probe(struct platform_device *pdev)
}
palmas_pinctrl_desc.name = dev_name(&pdev->dev);
palmas_pinctrl_desc.pins = palmas_pins_desc;
palmas_pinctrl_desc.npins = ARRAY_SIZE(palmas_pins_desc);
pci->pctl = devm_pinctrl_register(&pdev->dev, &palmas_pinctrl_desc,
pci);
if (IS_ERR(pci->pctl)) {

View File

@ -1828,8 +1828,8 @@ static int pic32_gpio_get(struct gpio_chip *chip, unsigned offset)
return !!(readl(bank->reg_base + PORT_REG) & BIT(offset));
}
static void pic32_gpio_set(struct gpio_chip *chip, unsigned offset,
int value)
static int pic32_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct pic32_gpio_bank *bank = gpiochip_get_data(chip);
u32 mask = BIT(offset);
@ -1838,6 +1838,8 @@ static void pic32_gpio_set(struct gpio_chip *chip, unsigned offset,
writel(mask, bank->reg_base + PIC32_SET(PORT_REG));
else
writel(mask, bank->reg_base + PIC32_CLR(PORT_REG));
return 0;
}
static int pic32_gpio_direction_output(struct gpio_chip *chip,
@ -2118,7 +2120,7 @@ static void pic32_gpio_irq_handler(struct irq_desc *desc)
.direction_input = pic32_gpio_direction_input, \
.direction_output = pic32_gpio_direction_output, \
.get = pic32_gpio_get, \
.set = pic32_gpio_set, \
.set_rv = pic32_gpio_set, \
.ngpio = _npins, \
.base = GPIO_BANK_START(_bank), \
.owner = THIS_MODULE, \

View File

@ -1156,11 +1156,14 @@ static const struct pinconf_ops pistachio_pinconf_ops = {
.is_generic = true,
};
static struct pinctrl_desc pistachio_pinctrl_desc = {
static const struct pinctrl_desc pistachio_pinctrl_desc = {
.name = "pistachio-pinctrl",
.pctlops = &pistachio_pinctrl_ops,
.pmxops = &pistachio_pinmux_ops,
.confops = &pistachio_pinconf_ops,
.pins = pistachio_pins,
.npins = ARRAY_SIZE(pistachio_pins),
};
static int pistachio_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
@ -1474,9 +1477,6 @@ static int pistachio_pinctrl_probe(struct platform_device *pdev)
pctl->gpio_banks = pistachio_gpio_banks;
pctl->nbanks = ARRAY_SIZE(pistachio_gpio_banks);
pistachio_pinctrl_desc.pins = pctl->pins;
pistachio_pinctrl_desc.npins = pctl->npins;
pctl->pctldev = devm_pinctrl_register(&pdev->dev, &pistachio_pinctrl_desc,
pctl);
if (IS_ERR(pctl->pctldev)) {

View File

@ -706,10 +706,12 @@ static int st_gpio_get(struct gpio_chip *chip, unsigned offset)
return !!(readl(bank->base + REG_PIO_PIN) & BIT(offset));
}
static void st_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
static int st_gpio_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct st_gpio_bank *bank = gpiochip_get_data(chip);
__st_gpio_set(bank, offset, value);
return 0;
}
static int st_gpio_direction_output(struct gpio_chip *chip,
@ -1465,7 +1467,7 @@ static const struct gpio_chip st_gpio_template = {
.request = gpiochip_generic_request,
.free = gpiochip_generic_free,
.get = st_gpio_get,
.set = st_gpio_set,
.set_rv = st_gpio_set,
.direction_input = pinctrl_gpio_direction_input,
.direction_output = st_gpio_direction_output,
.get_direction = st_gpio_get_direction,

View File

@ -735,7 +735,7 @@ static const struct pinmux_ops tb10x_pinmux_ops = {
.set_mux = tb10x_pctl_set_mux,
};
static struct pinctrl_desc tb10x_pindesc = {
static const struct pinctrl_desc tb10x_pindesc = {
.name = "TB10x",
.pins = tb10x_pins,
.npins = ARRAY_SIZE(tb10x_pins),

View File

@ -1228,10 +1228,10 @@ static int xway_pinconf_set(struct pinctrl_dev *pctldev,
return 0;
}
int xway_pinconf_group_set(struct pinctrl_dev *pctldev,
unsigned selector,
unsigned long *configs,
unsigned num_configs)
static int xway_pinconf_group_set(struct pinctrl_dev *pctldev,
unsigned int selector,
unsigned long *configs,
unsigned int num_configs)
{
struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
int i, ret = 0;
@ -1293,7 +1293,7 @@ static struct ltq_pinmux_info xway_info = {
};
/* --------- gpio_chip related code --------- */
static void xway_gpio_set(struct gpio_chip *chip, unsigned int pin, int val)
static int xway_gpio_set(struct gpio_chip *chip, unsigned int pin, int val)
{
struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
@ -1301,6 +1301,8 @@ static void xway_gpio_set(struct gpio_chip *chip, unsigned int pin, int val)
gpio_setbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin));
else
gpio_clearbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin));
return 0;
}
static int xway_gpio_get(struct gpio_chip *chip, unsigned int pin)
@ -1328,9 +1330,7 @@ static int xway_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, int val)
else
gpio_setbit(info->membase[0], GPIO_OD(pin), PORT_PIN(pin));
gpio_setbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin));
xway_gpio_set(chip, pin, val);
return 0;
return xway_gpio_set(chip, pin, val);
}
/*
@ -1354,7 +1354,7 @@ static struct gpio_chip xway_chip = {
.direction_input = xway_gpio_dir_in,
.direction_output = xway_gpio_dir_out,
.get = xway_gpio_get,
.set = xway_gpio_set,
.set_rv = xway_gpio_set,
.request = gpiochip_generic_request,
.free = gpiochip_generic_free,
.to_irq = xway_gpio_to_irq,

View File

@ -1143,7 +1143,7 @@ static const struct pinconf_ops zynq_pinconf_ops = {
.pin_config_group_set = zynq_pinconf_group_set,
};
static struct pinctrl_desc zynq_desc = {
static const struct pinctrl_desc zynq_desc = {
.name = "zynq_pinctrl",
.pins = zynq_pins,
.npins = ARRAY_SIZE(zynq_pins),

View File

@ -236,6 +236,15 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
if (desc->mux_usecount)
return NULL;
}
if (gpio_range) {
owner = desc->gpio_owner;
desc->gpio_owner = NULL;
} else {
owner = desc->mux_owner;
desc->mux_owner = NULL;
desc->mux_setting = NULL;
}
}
/*
@ -247,17 +256,6 @@ static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
else if (ops->free)
ops->free(pctldev, pin);
scoped_guard(mutex, &desc->mux_lock) {
if (gpio_range) {
owner = desc->gpio_owner;
desc->gpio_owner = NULL;
} else {
owner = desc->mux_owner;
desc->mux_owner = NULL;
desc->mux_setting = NULL;
}
}
module_put(pctldev->owner);
return owner;
@ -876,14 +874,26 @@ int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
const char * const *groups,
const unsigned int ngroups,
void *data)
{
struct pinfunction func = PINCTRL_PINFUNCTION(name, groups, ngroups);
return pinmux_generic_add_pinfunction(pctldev, &func, data);
}
EXPORT_SYMBOL_GPL(pinmux_generic_add_function);
/**
* pinmux_generic_add_pinfunction() - adds a function group
* @pctldev: pin controller device
* @func: pinfunction structure describing the function group
* @data: pin controller driver specific data
*/
int pinmux_generic_add_pinfunction(struct pinctrl_dev *pctldev,
const struct pinfunction *func, void *data)
{
struct function_desc *function;
int selector, error;
if (!name)
return -EINVAL;
selector = pinmux_func_name_to_selector(pctldev, name);
selector = pinmux_func_name_to_selector(pctldev, func->name);
if (selector >= 0)
return selector;
@ -893,7 +903,8 @@ int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
if (!function)
return -ENOMEM;
*function = PINCTRL_FUNCTION_DESC(name, groups, ngroups, data);
function->func = *func;
function->data = data;
error = radix_tree_insert(&pctldev->pin_function_tree, selector, function);
if (error)
@ -903,7 +914,7 @@ int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
return selector;
}
EXPORT_SYMBOL_GPL(pinmux_generic_add_function);
EXPORT_SYMBOL_GPL(pinmux_generic_add_pinfunction);
/**
* pinmux_generic_remove_function() - removes a numbered function

View File

@ -141,13 +141,6 @@ struct function_desc {
void *data;
};
/* Convenient macro to define a generic pin function descriptor */
#define PINCTRL_FUNCTION_DESC(_name, _grps, _num_grps, _data) \
(struct function_desc) { \
.func = PINCTRL_PINFUNCTION(_name, _grps, _num_grps), \
.data = _data, \
}
int pinmux_generic_get_function_count(struct pinctrl_dev *pctldev);
const char *
@ -168,6 +161,9 @@ int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
unsigned int const ngroups,
void *data);
int pinmux_generic_add_pinfunction(struct pinctrl_dev *pctldev,
const struct pinfunction *func, void *data);
int pinmux_generic_remove_function(struct pinctrl_dev *pctldev,
unsigned int selector);

View File

@ -371,6 +371,14 @@ config PINCTRL_SM7150
Qualcomm Technologies Inc TLMM block found on the Qualcomm
Technologies Inc SM7150 platform.
config PINCTRL_MILOS
tristate "Qualcomm Technologies Inc Milos pin controller driver"
depends on ARM64 || COMPILE_TEST
help
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
Qualcomm Technologies Inc TLMM block found on the Qualcomm
Technologies Inc Milos platform.
config PINCTRL_SM8150
tristate "Qualcomm Technologies Inc SM8150 pin controller driver"
depends on ARM64 || COMPILE_TEST

View File

@ -30,6 +30,7 @@ obj-$(CONFIG_PINCTRL_QCS8300) += pinctrl-qcs8300.o
obj-$(CONFIG_PINCTRL_QDF2XXX) += pinctrl-qdf2xxx.o
obj-$(CONFIG_PINCTRL_MDM9607) += pinctrl-mdm9607.o
obj-$(CONFIG_PINCTRL_MDM9615) += pinctrl-mdm9615.o
obj-$(CONFIG_PINCTRL_MILOS) += pinctrl-milos.o
obj-$(CONFIG_PINCTRL_QCOM_SPMI_PMIC) += pinctrl-spmi-gpio.o
obj-$(CONFIG_PINCTRL_QCOM_SPMI_PMIC) += pinctrl-spmi-mpp.o
obj-$(CONFIG_PINCTRL_QCOM_SSBI_PMIC) += pinctrl-ssbi-gpio.o

File diff suppressed because it is too large Load Diff

View File

@ -1206,6 +1206,7 @@ static const struct of_device_id pmic_gpio_of_match[] = {
{ .compatible = "qcom,pm6450-gpio", .data = (void *) 9 },
{ .compatible = "qcom,pm7250b-gpio", .data = (void *) 12 },
{ .compatible = "qcom,pm7325-gpio", .data = (void *) 10 },
{ .compatible = "qcom,pm7550-gpio", .data = (void *) 12 },
{ .compatible = "qcom,pm7550ba-gpio", .data = (void *) 8},
{ .compatible = "qcom,pm8005-gpio", .data = (void *) 4 },
{ .compatible = "qcom,pm8019-gpio", .data = (void *) 6 },
@ -1244,6 +1245,7 @@ static const struct of_device_id pmic_gpio_of_match[] = {
{ .compatible = "qcom,pmi8994-gpio", .data = (void *) 10 },
{ .compatible = "qcom,pmi8998-gpio", .data = (void *) 14 },
{ .compatible = "qcom,pmih0108-gpio", .data = (void *) 18 },
{ .compatible = "qcom,pmiv0104-gpio", .data = (void *) 10 },
{ .compatible = "qcom,pmk8350-gpio", .data = (void *) 4 },
{ .compatible = "qcom,pmk8550-gpio", .data = (void *) 6 },
{ .compatible = "qcom,pmm8155au-gpio", .data = (void *) 10 },

View File

@ -16,6 +16,7 @@
#include <linux/of_irq.h>
#include <linux/pinctrl/consumer.h>
#include <linux/platform_device.h>
#include <linux/slab.h>
/*
* This TLMM test module serves the purpose of validating that the TLMM driver
@ -38,7 +39,10 @@
#define TLMM_REG_SIZE 0x1000
static int tlmm_test_gpio = -1;
static char *tlmm_reg_name = "default_region";
module_param_named(gpio, tlmm_test_gpio, int, 0600);
module_param_named(name, tlmm_reg_name, charp, 0600);
static struct {
void __iomem *base;
@ -570,6 +574,47 @@ static const struct of_device_id tlmm_of_match[] = {
{}
};
static int tlmm_reg_base(struct device_node *tlmm, struct resource *res)
{
const char **reg_names;
int count;
int ret;
int i;
count = of_property_count_strings(tlmm, "reg-names");
if (count <= 0) {
pr_err("failed to find tlmm reg name\n");
return count;
}
reg_names = kcalloc(count, sizeof(char *), GFP_KERNEL);
if (!reg_names)
return -ENOMEM;
ret = of_property_read_string_array(tlmm, "reg-names", reg_names, count);
if (ret != count) {
kfree(reg_names);
return -EINVAL;
}
if (!strcmp(tlmm_reg_name, "default_region")) {
ret = of_address_to_resource(tlmm, 0, res);
} else {
for (i = 0; i < count; i++) {
if (!strcmp(reg_names[i], tlmm_reg_name)) {
ret = of_address_to_resource(tlmm, i, res);
break;
}
}
if (i == count)
ret = -EINVAL;
}
kfree(reg_names);
return ret;
}
static int tlmm_test_init_suite(struct kunit_suite *suite)
{
struct of_phandle_args args = {};
@ -588,7 +633,7 @@ static int tlmm_test_init_suite(struct kunit_suite *suite)
return -EINVAL;
}
ret = of_address_to_resource(tlmm, 0, &res);
ret = tlmm_reg_base(tlmm, &res);
if (ret < 0)
return ret;

View File

@ -86,89 +86,178 @@ config PINCTRL_PFC_EMEV2
bool "pin control support for Emma Mobile EV2" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77995
bool "pin control support for R-Car D3" if COMPILE_TEST
config PINCTRL_PFC_R8A73A4
bool "pin control support for R8A73A4 (R-Mobile APE6)" if COMPILE_TEST
select PINCTRL_SH_PFC_GPIO
config PINCTRL_PFC_R8A7740
bool "pin control support for R8A7740 (R-Mobile A1)" if COMPILE_TEST
select PINCTRL_SH_PFC_GPIO
config PINCTRL_PFC_R8A7742
bool "pin control support for R8A7742 (RZ/G1H)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7794
bool "pin control support for R-Car E2" if COMPILE_TEST
config PINCTRL_PFC_R8A7743
bool "pin control support for R8A7743 (RZ/G1M)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77990
bool "pin control support for R-Car E3" if COMPILE_TEST
config PINCTRL_PFC_R8A7744
bool "pin control support for R8A7744 (RZ/G1N)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7779
bool "pin control support for R-Car H1" if COMPILE_TEST
config PINCTRL_PFC_R8A7745
bool "pin control support for R8A7745 (RZ/G1E)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7790
bool "pin control support for R-Car H2" if COMPILE_TEST
config PINCTRL_PFC_R8A77470
bool "pin control support for R8A77470 (RZ/G1C)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77951
bool "pin control support for R-Car H3 ES2.0+" if COMPILE_TEST
config PINCTRL_PFC_R8A774A1
bool "pin control support for R8A774A1 (RZ/G2M)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774B1
bool "pin control support for R8A774B1 (RZ/G2N)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774C0
bool "pin control support for R8A774C0 (RZ/G2E)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774E1
bool "pin control support for R8A774E1 (RZ/G2H)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7778
bool "pin control support for R-Car M1A" if COMPILE_TEST
bool "pin control support for R8A7778 (R-Car M1A)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7793
bool "pin control support for R-Car M2-N" if COMPILE_TEST
config PINCTRL_PFC_R8A7779
bool "pin control support for R8A7779 (R-Car H1)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7790
bool "pin control support for R8A7790 (R-Car H2)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7791
bool "pin control support for R-Car M2-W" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77965
bool "pin control support for R-Car M3-N" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77960
bool "pin control support for R-Car M3-W" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77961
bool "pin control support for R-Car M3-W+" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A779F0
bool "pin control support for R-Car S4-8" if COMPILE_TEST
bool "pin control support for R8A7791 (R-Car M2-W)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7792
bool "pin control support for R-Car V2H" if COMPILE_TEST
bool "pin control support for R8A7792 (R-Car V2H)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77980
bool "pin control support for R-Car V3H" if COMPILE_TEST
config PINCTRL_PFC_R8A7793
bool "pin control support for R8A7793 (R-Car M2-N)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7794
bool "pin control support for R8A7794 (R-Car E2)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77951
bool "pin control support for R8A77951 (R-Car H3 ES2.0+)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77960
bool "pin control support for R8A77960 (R-Car M3-W)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77961
bool "pin control support for R8A77961 (R-Car M3-W+)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77965
bool "pin control support for R8A77965 (R-Car M3-N)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77970
bool "pin control support for R-Car V3M" if COMPILE_TEST
bool "pin control support for R8A77970 (R-Car V3M)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77980
bool "pin control support for R8A77980 (R-Car V3H)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77990
bool "pin control support for R8A77990 (R-Car E3)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A77995
bool "pin control support for R8A77995 (R-Car D3)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A779A0
bool "pin control support for R-Car V3U" if COMPILE_TEST
bool "pin control support for R8A779A0 (R-Car V3U)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A779F0
bool "pin control support for R8A779F0 (R-Car S4-8)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A779G0
bool "pin control support for R-Car V4H" if COMPILE_TEST
bool "pin control support for R8A779G0 (R-Car V4H)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A779H0
bool "pin control support for R-Car V4M" if COMPILE_TEST
bool "pin control support for R8A779H0 (R-Car V4M)" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7740
bool "pin control support for R-Mobile A1" if COMPILE_TEST
select PINCTRL_SH_PFC_GPIO
config PINCTRL_PFC_SH7203
bool "pin control support for SH7203" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_R8A73A4
bool "pin control support for R-Mobile APE6" if COMPILE_TEST
config PINCTRL_PFC_SH7264
bool "pin control support for SH7264" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7269
bool "pin control support for SH7269" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH73A0
bool "pin control support for SH73A0 (SH-Mobile AG5)" if COMPILE_TEST
select PINCTRL_SH_PFC_GPIO
select REGULATOR
config PINCTRL_PFC_SH7720
bool "pin control support for SH7720" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7722
bool "pin control support for SH7722" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7723
bool "pin control support for SH7723 (SH-Mobile R2)" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7724
bool "pin control support for SH7724 (SH-Mobile R2R)" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7734
bool "pin control support for SH7734" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7757
bool "pin control support for SH7757" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7785
bool "pin control support for SH7785" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7786
bool "pin control support for SH7786" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SHX3
bool "pin control support for SH-X3" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_RZA1
bool "pin control support for RZ/A1"
@ -204,42 +293,6 @@ config PINCTRL_RZG2L
This selects GPIO and pinctrl driver for Renesas RZ/{G2L,G2UL,V2L}
platforms.
config PINCTRL_PFC_R8A77470
bool "pin control support for RZ/G1C" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7745
bool "pin control support for RZ/G1E" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7742
bool "pin control support for RZ/G1H" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7743
bool "pin control support for RZ/G1M" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A7744
bool "pin control support for RZ/G1N" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774C0
bool "pin control support for RZ/G2E" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774E1
bool "pin control support for RZ/G2H" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774A1
bool "pin control support for RZ/G2M" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_PFC_R8A774B1
bool "pin control support for RZ/G2N" if COMPILE_TEST
select PINCTRL_SH_PFC
config PINCTRL_RZN1
bool "pin control support for RZ/N1"
depends on OF
@ -250,9 +303,8 @@ config PINCTRL_RZN1
This selects pinctrl driver for Renesas RZ/N1 devices.
config PINCTRL_RZV2M
bool "pin control support for RZ/V2M"
bool "pin control support for RZ/V2M" if COMPILE_TEST
depends on OF
depends on ARCH_R9A09G011 || COMPILE_TEST
select GPIOLIB
select GENERIC_PINCTRL_GROUPS
select GENERIC_PINMUX_FUNCTIONS
@ -261,57 +313,4 @@ config PINCTRL_RZV2M
This selects GPIO and pinctrl driver for Renesas RZ/V2M
platforms.
config PINCTRL_PFC_SH7203
bool "pin control support for SH7203" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7264
bool "pin control support for SH7264" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7269
bool "pin control support for SH7269" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7720
bool "pin control support for SH7720" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7722
bool "pin control support for SH7722" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7734
bool "pin control support for SH7734" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7757
bool "pin control support for SH7757" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7785
bool "pin control support for SH7785" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7786
bool "pin control support for SH7786" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH73A0
bool "pin control support for SH-Mobile AG5" if COMPILE_TEST
select PINCTRL_SH_PFC_GPIO
select REGULATOR
config PINCTRL_PFC_SH7723
bool "pin control support for SH-Mobile R2" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SH7724
bool "pin control support for SH-Mobile R2R" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
config PINCTRL_PFC_SHX3
bool "pin control support for SH-X3" if COMPILE_TEST
select PINCTRL_SH_FUNC_GPIO
endmenu

View File

@ -189,9 +189,11 @@ static int gpio_pin_get(struct gpio_chip *gc, unsigned offset)
return (gpio_read_data_reg(chip, reg->info) >> pos) & 1;
}
static void gpio_pin_set(struct gpio_chip *gc, unsigned offset, int value)
static int gpio_pin_set(struct gpio_chip *gc, unsigned int offset, int value)
{
gpio_pin_set_value(gpiochip_get_data(gc), offset, value);
return 0;
}
static int gpio_pin_to_irq(struct gpio_chip *gc, unsigned offset)
@ -232,7 +234,7 @@ static int gpio_pin_setup(struct sh_pfc_chip *chip)
gc->direction_input = gpio_pin_direction_input;
gc->get = gpio_pin_get;
gc->direction_output = gpio_pin_direction_output;
gc->set = gpio_pin_set;
gc->set_rv = gpio_pin_set;
gc->to_irq = gpio_pin_to_irq;
gc->label = pfc->info->name;

View File

@ -830,12 +830,13 @@ static int rza1_gpio_get(struct gpio_chip *chip, unsigned int gpio)
return rza1_pin_get(port, gpio);
}
static void rza1_gpio_set(struct gpio_chip *chip, unsigned int gpio,
int value)
static int rza1_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)
{
struct rza1_port *port = gpiochip_get_data(chip);
rza1_pin_set(port, gpio, value);
return 0;
}
static const struct gpio_chip rza1_gpiochip_template = {
@ -845,7 +846,7 @@ static const struct gpio_chip rza1_gpiochip_template = {
.direction_input = rza1_gpio_direction_input,
.direction_output = rza1_gpio_direction_output,
.get = rza1_gpio_get,
.set = rza1_gpio_set,
.set_rv = rza1_gpio_set,
};
/* ----------------------------------------------------------------------------
* pinctrl operations

View File

@ -172,8 +172,7 @@ static int rza2_chip_get(struct gpio_chip *chip, unsigned int offset)
return !!(readb(priv->base + RZA2_PIDR(port)) & BIT(pin));
}
static void rza2_chip_set(struct gpio_chip *chip, unsigned int offset,
int value)
static int rza2_chip_set(struct gpio_chip *chip, unsigned int offset, int value)
{
struct rza2_pinctrl_priv *priv = gpiochip_get_data(chip);
u8 port = RZA2_PIN_ID_TO_PORT(offset);
@ -188,6 +187,8 @@ static void rza2_chip_set(struct gpio_chip *chip, unsigned int offset,
new_value &= ~BIT(pin);
writeb(new_value, priv->base + RZA2_PODR(port));
return 0;
}
static int rza2_chip_direction_output(struct gpio_chip *chip,
@ -236,7 +237,7 @@ static struct gpio_chip chip = {
.direction_input = rza2_chip_direction_input,
.direction_output = rza2_chip_direction_output,
.get = rza2_chip_get,
.set = rza2_chip_set,
.set_rv = rza2_chip_set,
};
static int rza2_gpio_register(struct rza2_pinctrl_priv *priv)

View File

@ -493,6 +493,23 @@ static void rzv2h_pmc_writeb(struct rzg2l_pinctrl *pctrl, u8 val, u16 offset)
writeb(pwpr & ~PWPR_REGWE_A, pctrl->base + regs->pwpr);
}
static int rzg2l_validate_pin(struct rzg2l_pinctrl *pctrl,
u64 cfg, u32 port, u8 bit)
{
u8 pinmap = FIELD_GET(PIN_CFG_PIN_MAP_MASK, cfg);
u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg);
u64 data;
if (!(pinmap & BIT(bit)) || port >= pctrl->data->n_port_pins)
return -EINVAL;
data = pctrl->data->port_pin_configs[port];
if (off != RZG2L_PIN_CFG_TO_PORT_OFFSET(data))
return -EINVAL;
return 0;
}
static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
u8 pin, u8 off, u8 func)
{
@ -536,6 +553,7 @@ static int rzg2l_pinctrl_set_mux(struct pinctrl_dev *pctldev,
unsigned int i, *psel_val;
struct group_desc *group;
const unsigned int *pins;
int ret;
func = pinmux_generic_get_function(pctldev, func_selector);
if (!func)
@ -552,6 +570,10 @@ static int rzg2l_pinctrl_set_mux(struct pinctrl_dev *pctldev,
u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
u32 pin = RZG2L_PIN_ID_TO_PIN(pins[i]);
ret = rzg2l_validate_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(pins[i]), pin);
if (ret)
return ret;
dev_dbg(pctrl->dev, "port:%u pin: %u off:%x PSEL:%u\n",
RZG2L_PIN_ID_TO_PORT(pins[i]), pin, off, psel_val[i] - hwcfg->func_base);
@ -806,23 +828,6 @@ done:
return ret;
}
static int rzg2l_validate_gpio_pin(struct rzg2l_pinctrl *pctrl,
u64 cfg, u32 port, u8 bit)
{
u8 pinmap = FIELD_GET(PIN_CFG_PIN_MAP_MASK, cfg);
u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg);
u64 data;
if (!(pinmap & BIT(bit)) || port >= pctrl->data->n_port_pins)
return -EINVAL;
data = pctrl->data->port_pin_configs[port];
if (off != RZG2L_PIN_CFG_TO_PORT_OFFSET(data))
return -EINVAL;
return 0;
}
static u32 rzg2l_read_pin_config(struct rzg2l_pinctrl *pctrl, u32 offset,
u8 bit, u32 mask)
{
@ -1287,7 +1292,7 @@ static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
} else {
bit = RZG2L_PIN_ID_TO_PIN(_pin);
if (rzg2l_validate_gpio_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(_pin), bit))
if (rzg2l_validate_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(_pin), bit))
return -EINVAL;
}
@ -1447,7 +1452,7 @@ static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
} else {
bit = RZG2L_PIN_ID_TO_PIN(_pin);
if (rzg2l_validate_gpio_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(_pin), bit))
if (rzg2l_validate_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(_pin), bit))
return -EINVAL;
}
@ -1687,7 +1692,7 @@ static int rzg2l_gpio_request(struct gpio_chip *chip, unsigned int offset)
u8 reg8;
int ret;
ret = rzg2l_validate_gpio_pin(pctrl, *pin_data, port, bit);
ret = rzg2l_validate_pin(pctrl, *pin_data, port, bit);
if (ret)
return ret;
@ -1758,8 +1763,8 @@ static int rzg2l_gpio_direction_input(struct gpio_chip *chip,
return 0;
}
static void rzg2l_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
static int rzg2l_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
@ -1779,6 +1784,8 @@ static void rzg2l_gpio_set(struct gpio_chip *chip, unsigned int offset,
writeb(reg8 & ~BIT(bit), pctrl->base + P(off));
spin_unlock_irqrestore(&pctrl->lock, flags);
return 0;
}
static int rzg2l_gpio_direction_output(struct gpio_chip *chip,
@ -2788,7 +2795,7 @@ static int rzg2l_gpio_register(struct rzg2l_pinctrl *pctrl)
chip->direction_input = rzg2l_gpio_direction_input;
chip->direction_output = rzg2l_gpio_direction_output;
chip->get = rzg2l_gpio_get;
chip->set = rzg2l_gpio_set;
chip->set_rv = rzg2l_gpio_set;
chip->label = name;
chip->parent = pctrl->dev;
chip->owner = THIS_MODULE;

View File

@ -680,6 +680,8 @@ static struct pinctrl_desc rzn1_pinctrl_desc = {
.pmxops = &rzn1_pmx_ops,
.confops = &rzn1_pinconf_ops,
.owner = THIS_MODULE,
.pins = rzn1_pins,
.npins = ARRAY_SIZE(rzn1_pins),
};
static int rzn1_pinctrl_parse_groups(struct device_node *np,
@ -878,8 +880,6 @@ static int rzn1_pinctrl_probe(struct platform_device *pdev)
ipctl->dev = &pdev->dev;
rzn1_pinctrl_desc.name = dev_name(&pdev->dev);
rzn1_pinctrl_desc.pins = rzn1_pins;
rzn1_pinctrl_desc.npins = ARRAY_SIZE(rzn1_pins);
ret = rzn1_pinctrl_probe_dt(pdev, ipctl);
if (ret) {

View File

@ -790,14 +790,16 @@ static int rzv2m_gpio_direction_input(struct gpio_chip *chip,
return 0;
}
static void rzv2m_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
static int rzv2m_gpio_set(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct rzv2m_pinctrl *pctrl = gpiochip_get_data(chip);
u32 port = RZV2M_PIN_ID_TO_PORT(offset);
u8 bit = RZV2M_PIN_ID_TO_PIN(offset);
rzv2m_writel_we(pctrl->base + DO(port), bit, !!value);
return 0;
}
static int rzv2m_gpio_direction_output(struct gpio_chip *chip,
@ -955,7 +957,7 @@ static int rzv2m_gpio_register(struct rzv2m_pinctrl *pctrl)
chip->direction_input = rzv2m_gpio_direction_input;
chip->direction_output = rzv2m_gpio_direction_output;
chip->get = rzv2m_gpio_get;
chip->set = rzv2m_gpio_set;
chip->set_rv = rzv2m_gpio_set;
chip->label = name;
chip->parent = pctrl->dev;
chip->owner = THIS_MODULE;

View File

@ -1405,7 +1405,7 @@ static const struct samsung_pin_bank_data exynosautov920_pin_banks7[] = {
EXYNOSV920_PIN_BANK_EINTG(8, 0x8000, "gpg1", 0x18, 0x24, 0x28),
};
static const struct samsung_retention_data exynosautov920_retention_data __initconst = {
static const struct samsung_retention_data no_retention_data __initconst = {
.regs = NULL,
.nr_regs = 0,
.value = 0,
@ -1421,7 +1421,7 @@ static const struct samsung_pin_ctrl exynosautov920_pin_ctrl[] = {
.eint_wkup_init = exynos_eint_wkup_init,
.suspend = exynosautov920_pinctrl_suspend,
.resume = exynosautov920_pinctrl_resume,
.retention_data = &exynosautov920_retention_data,
.retention_data = &no_retention_data,
}, {
/* pin-controller instance 1 AUD data */
.pin_banks = exynosautov920_pin_banks1,
@ -1764,6 +1764,7 @@ static const struct samsung_pin_ctrl gs101_pin_ctrl[] __initconst = {
.eint_wkup_init = exynos_eint_wkup_init,
.suspend = gs101_pinctrl_suspend,
.resume = gs101_pinctrl_resume,
.retention_data = &no_retention_data,
}, {
/* pin banks of gs101 pin-controller (FAR_ALIVE) */
.pin_banks = gs101_pin_far_alive,
@ -1771,6 +1772,7 @@ static const struct samsung_pin_ctrl gs101_pin_ctrl[] __initconst = {
.eint_wkup_init = exynos_eint_wkup_init,
.suspend = gs101_pinctrl_suspend,
.resume = gs101_pinctrl_resume,
.retention_data = &no_retention_data,
}, {
/* pin banks of gs101 pin-controller (GSACORE) */
.pin_banks = gs101_pin_gsacore,

View File

@ -32,18 +32,24 @@
#include "pinctrl-samsung.h"
#include "pinctrl-exynos.h"
#define MAX_WAKEUP_REG 3
struct exynos_irq_chip {
struct irq_chip chip;
u32 eint_con;
u32 eint_mask;
u32 eint_pend;
u32 *eint_wake_mask_value;
u32 eint_num_wakeup_reg;
u32 eint_wake_mask_reg;
void (*set_eint_wakeup_mask)(struct samsung_pinctrl_drv_data *drvdata,
struct exynos_irq_chip *irq_chip);
};
static u32 eint_wake_mask_values[MAX_WAKEUP_REG] = { EXYNOS_EINT_WAKEUP_MASK_DISABLED,
EXYNOS_EINT_WAKEUP_MASK_DISABLED,
EXYNOS_EINT_WAKEUP_MASK_DISABLED};
static inline struct exynos_irq_chip *to_exynos_irq_chip(struct irq_chip *chip)
{
return container_of(chip, struct exynos_irq_chip, chip);
@ -307,7 +313,7 @@ static const struct exynos_irq_chip exynos_gpio_irq_chip __initconst = {
.eint_con = EXYNOS_GPIO_ECON_OFFSET,
.eint_mask = EXYNOS_GPIO_EMASK_OFFSET,
.eint_pend = EXYNOS_GPIO_EPEND_OFFSET,
/* eint_wake_mask_value not used */
/* eint_wake_mask_values not used */
};
static int exynos_eint_irq_map(struct irq_domain *h, unsigned int virq,
@ -467,10 +473,55 @@ err_domains:
return ret;
}
#define BITS_PER_U32 32
static int gs101_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_pinctrl_drv_data *d = bank->drvdata;
u32 bit, wakeup_reg, shift;
bit = bank->eint_num + irqd->hwirq;
wakeup_reg = bit / BITS_PER_U32;
shift = bit - (wakeup_reg * BITS_PER_U32);
if (!on)
eint_wake_mask_values[wakeup_reg] |= BIT_U32(shift);
else
eint_wake_mask_values[wakeup_reg] &= ~BIT_U32(shift);
dev_info(d->dev, "wake %s for irq %d\n", str_enabled_disabled(on),
irqd->irq);
return 0;
}
static void
gs101_pinctrl_set_eint_wakeup_mask(struct samsung_pinctrl_drv_data *drvdata,
struct exynos_irq_chip *irq_chip)
{
struct regmap *pmu_regs;
if (!drvdata->retention_ctrl || !drvdata->retention_ctrl->priv) {
dev_warn(drvdata->dev,
"No PMU syscon available. Wake-up mask will not be set.\n");
return;
}
pmu_regs = drvdata->retention_ctrl->priv;
dev_dbg(drvdata->dev, "Setting external wakeup interrupt mask:\n");
for (int i = 0; i < irq_chip->eint_num_wakeup_reg; i++) {
dev_dbg(drvdata->dev, "\tWAKEUP_MASK%d[0x%X] value[0x%X]\n",
i, irq_chip->eint_wake_mask_reg + i * 4,
eint_wake_mask_values[i]);
regmap_write(pmu_regs, irq_chip->eint_wake_mask_reg + i * 4,
eint_wake_mask_values[i]);
}
}
static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
{
struct irq_chip *chip = irq_data_get_irq_chip(irqd);
struct exynos_irq_chip *our_chip = to_exynos_irq_chip(chip);
struct samsung_pin_bank *bank = irq_data_get_irq_chip_data(irqd);
unsigned long bit = 1UL << (2 * bank->eint_offset + irqd->hwirq);
@ -478,9 +529,9 @@ static int exynos_wkup_irq_set_wake(struct irq_data *irqd, unsigned int on)
irqd->irq, bank->name, irqd->hwirq);
if (!on)
*our_chip->eint_wake_mask_value |= bit;
eint_wake_mask_values[0] |= bit;
else
*our_chip->eint_wake_mask_value &= ~bit;
eint_wake_mask_values[0] &= ~bit;
return 0;
}
@ -500,10 +551,10 @@ exynos_pinctrl_set_eint_wakeup_mask(struct samsung_pinctrl_drv_data *drvdata,
pmu_regs = drvdata->retention_ctrl->priv;
dev_info(drvdata->dev,
"Setting external wakeup interrupt mask: 0x%x\n",
*irq_chip->eint_wake_mask_value);
eint_wake_mask_values[0]);
regmap_write(pmu_regs, irq_chip->eint_wake_mask_reg,
*irq_chip->eint_wake_mask_value);
eint_wake_mask_values[0]);
}
static void
@ -522,11 +573,10 @@ s5pv210_pinctrl_set_eint_wakeup_mask(struct samsung_pinctrl_drv_data *drvdata,
clk_base = (void __iomem *) drvdata->retention_ctrl->priv;
__raw_writel(*irq_chip->eint_wake_mask_value,
__raw_writel(eint_wake_mask_values[0],
clk_base + irq_chip->eint_wake_mask_reg);
}
static u32 eint_wake_mask_value = EXYNOS_EINT_WAKEUP_MASK_DISABLED;
/*
* irq_chip for wakeup interrupts
*/
@ -544,7 +594,7 @@ static const struct exynos_irq_chip s5pv210_wkup_irq_chip __initconst = {
.eint_con = EXYNOS_WKUP_ECON_OFFSET,
.eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
.eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
.eint_wake_mask_value = &eint_wake_mask_value,
.eint_num_wakeup_reg = 1,
/* Only differences with exynos4210_wkup_irq_chip: */
.eint_wake_mask_reg = S5PV210_EINT_WAKEUP_MASK,
.set_eint_wakeup_mask = s5pv210_pinctrl_set_eint_wakeup_mask,
@ -564,7 +614,7 @@ static const struct exynos_irq_chip exynos4210_wkup_irq_chip __initconst = {
.eint_con = EXYNOS_WKUP_ECON_OFFSET,
.eint_mask = EXYNOS_WKUP_EMASK_OFFSET,
.eint_pend = EXYNOS_WKUP_EPEND_OFFSET,
.eint_wake_mask_value = &eint_wake_mask_value,
.eint_num_wakeup_reg = 1,
.eint_wake_mask_reg = EXYNOS_EINT_WAKEUP_MASK,
.set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask,
};
@ -583,7 +633,7 @@ static const struct exynos_irq_chip exynos7_wkup_irq_chip __initconst = {
.eint_con = EXYNOS7_WKUP_ECON_OFFSET,
.eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
.eint_pend = EXYNOS7_WKUP_EPEND_OFFSET,
.eint_wake_mask_value = &eint_wake_mask_value,
.eint_num_wakeup_reg = 1,
.eint_wake_mask_reg = EXYNOS5433_EINT_WAKEUP_MASK,
.set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask,
};
@ -599,13 +649,34 @@ static const struct exynos_irq_chip exynosautov920_wkup_irq_chip __initconst = {
.irq_request_resources = exynos_irq_request_resources,
.irq_release_resources = exynos_irq_release_resources,
},
.eint_wake_mask_value = &eint_wake_mask_value,
.eint_num_wakeup_reg = 1,
.eint_wake_mask_reg = EXYNOS5433_EINT_WAKEUP_MASK,
.set_eint_wakeup_mask = exynos_pinctrl_set_eint_wakeup_mask,
};
static const struct exynos_irq_chip gs101_wkup_irq_chip __initconst = {
.chip = {
.name = "gs101_wkup_irq_chip",
.irq_unmask = exynos_irq_unmask,
.irq_mask = exynos_irq_mask,
.irq_ack = exynos_irq_ack,
.irq_set_type = exynos_irq_set_type,
.irq_set_wake = gs101_wkup_irq_set_wake,
.irq_request_resources = exynos_irq_request_resources,
.irq_release_resources = exynos_irq_release_resources,
},
.eint_con = EXYNOS7_WKUP_ECON_OFFSET,
.eint_mask = EXYNOS7_WKUP_EMASK_OFFSET,
.eint_pend = EXYNOS7_WKUP_EPEND_OFFSET,
.eint_num_wakeup_reg = 3,
.eint_wake_mask_reg = GS101_EINT_WAKEUP_MASK,
.set_eint_wakeup_mask = gs101_pinctrl_set_eint_wakeup_mask,
};
/* list of external wakeup controllers supported */
static const struct of_device_id exynos_wkup_irq_ids[] = {
{ .compatible = "google,gs101-wakeup-eint",
.data = &gs101_wkup_irq_chip },
{ .compatible = "samsung,s5pv210-wakeup-eint",
.data = &s5pv210_wkup_irq_chip },
{ .compatible = "samsung,exynos4210-wakeup-eint",
@ -688,6 +759,7 @@ out:
chained_irq_exit(chip, desc);
}
static int eint_num;
/*
* exynos_eint_wkup_init() - setup handling of external wakeup interrupts.
* @d: driver data of samsung pinctrl driver.
@ -736,6 +808,9 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
return -ENXIO;
}
bank->eint_num = eint_num;
eint_num = eint_num + bank->nr_pins;
if (!fwnode_property_present(bank->fwnode, "interrupts")) {
bank->eint_type = EINT_TYPE_WKUP_MUX;
++muxed_banks;

View File

@ -141,6 +141,7 @@ struct samsung_pin_bank_type {
* @eint_type: type of the external interrupt supported by the bank.
* @eint_mask: bit mask of pins which support EINT function.
* @eint_offset: SoC-specific EINT register or interrupt offset of bank.
* @eint_num: total number of eint pins.
* @eint_con_offset: ExynosAuto SoC-specific EINT control register offset of bank.
* @eint_mask_offset: ExynosAuto SoC-specific EINT mask register offset of bank.
* @eint_pend_offset: ExynosAuto SoC-specific EINT pend register offset of bank.
@ -156,6 +157,7 @@ struct samsung_pin_bank_data {
enum eint_type eint_type;
u32 eint_mask;
u32 eint_offset;
u32 eint_num;
u32 eint_con_offset;
u32 eint_mask_offset;
u32 eint_pend_offset;
@ -174,6 +176,7 @@ struct samsung_pin_bank_data {
* @eint_type: type of the external interrupt supported by the bank.
* @eint_mask: bit mask of pins which support EINT function.
* @eint_offset: SoC-specific EINT register or interrupt offset of bank.
* @eint_num: total number of eint pins.
* @eint_con_offset: ExynosAuto SoC-specific EINT register or interrupt offset of bank.
* @eint_mask_offset: ExynosAuto SoC-specific EINT mask register offset of bank.
* @eint_pend_offset: ExynosAuto SoC-specific EINT pend register offset of bank.
@ -201,6 +204,7 @@ struct samsung_pin_bank {
enum eint_type eint_type;
u32 eint_mask;
u32 eint_offset;
u32 eint_num;
u32 eint_con_offset;
u32 eint_mask_offset;
u32 eint_pend_offset;

View File

@ -181,24 +181,27 @@ static int plgpio_get_value(struct gpio_chip *chip, unsigned offset)
return is_plgpio_set(plgpio->regmap, offset, plgpio->regs.rdata);
}
static void plgpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
static int plgpio_set_value(struct gpio_chip *chip, unsigned int offset,
int value)
{
struct plgpio *plgpio = gpiochip_get_data(chip);
if (offset >= chip->ngpio)
return;
return -EINVAL;
/* get correct offset for "offset" pin */
if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) {
offset = plgpio->p2o(offset);
if (offset == -1)
return;
return -EINVAL;
}
if (value)
plgpio_reg_set(plgpio->regmap, offset, plgpio->regs.wdata);
else
plgpio_reg_reset(plgpio->regmap, offset, plgpio->regs.wdata);
return 0;
}
static int plgpio_request(struct gpio_chip *chip, unsigned offset)
@ -579,7 +582,7 @@ static int plgpio_probe(struct platform_device *pdev)
plgpio->chip.direction_input = plgpio_direction_input;
plgpio->chip.direction_output = plgpio_direction_output;
plgpio->chip.get = plgpio_get_value;
plgpio->chip.set = plgpio_set_value;
plgpio->chip.set_rv = plgpio_set_value;
plgpio->chip.label = dev_name(&pdev->dev);
plgpio->chip.parent = &pdev->dev;
plgpio->chip.owner = THIS_MODULE;

View File

@ -898,7 +898,7 @@ static const struct pinconf_ops starfive_pinconf_ops = {
.is_generic = true,
};
static struct pinctrl_desc starfive_desc = {
static const struct pinctrl_desc starfive_desc = {
.name = DRIVER_NAME,
.pins = starfive_pins,
.npins = ARRAY_SIZE(starfive_pins),
@ -969,8 +969,8 @@ static int starfive_gpio_get(struct gpio_chip *gc, unsigned int gpio)
return !!(readl_relaxed(din) & BIT(gpio % 32));
}
static void starfive_gpio_set(struct gpio_chip *gc, unsigned int gpio,
int value)
static int starfive_gpio_set(struct gpio_chip *gc, unsigned int gpio,
int value)
{
struct starfive_pinctrl *sfp = container_of(gc, struct starfive_pinctrl, gc);
void __iomem *dout = sfp->base + GPON_DOUT_CFG + 8 * gpio;
@ -979,6 +979,8 @@ static void starfive_gpio_set(struct gpio_chip *gc, unsigned int gpio,
raw_spin_lock_irqsave(&sfp->lock, flags);
writel_relaxed(value, dout);
raw_spin_unlock_irqrestore(&sfp->lock, flags);
return 0;
}
static int starfive_gpio_set_config(struct gpio_chip *gc, unsigned int gpio,
@ -1300,7 +1302,7 @@ static int starfive_probe(struct platform_device *pdev)
sfp->gc.direction_input = starfive_gpio_direction_input;
sfp->gc.direction_output = starfive_gpio_direction_output;
sfp->gc.get = starfive_gpio_get;
sfp->gc.set = starfive_gpio_set;
sfp->gc.set_rv = starfive_gpio_set;
sfp->gc.set_config = starfive_gpio_set_config;
sfp->gc.add_pin_ranges = starfive_gpio_add_pin_ranges;
sfp->gc.base = -1;

View File

@ -608,8 +608,7 @@ static int jh7110_gpio_get(struct gpio_chip *gc, unsigned int gpio)
return !!(readl_relaxed(reg) & BIT(gpio % 32));
}
static void jh7110_gpio_set(struct gpio_chip *gc,
unsigned int gpio, int value)
static int jh7110_gpio_set(struct gpio_chip *gc, unsigned int gpio, int value)
{
struct jh7110_pinctrl *sfp = container_of(gc,
struct jh7110_pinctrl, gc);
@ -625,6 +624,8 @@ static void jh7110_gpio_set(struct gpio_chip *gc,
dout |= readl_relaxed(reg_dout) & ~mask;
writel_relaxed(dout, reg_dout);
raw_spin_unlock_irqrestore(&sfp->lock, flags);
return 0;
}
static int jh7110_gpio_set_config(struct gpio_chip *gc,
@ -934,7 +935,7 @@ int jh7110_pinctrl_probe(struct platform_device *pdev)
sfp->gc.direction_input = jh7110_gpio_direction_input;
sfp->gc.direction_output = jh7110_gpio_direction_output;
sfp->gc.get = jh7110_gpio_get;
sfp->gc.set = jh7110_gpio_set;
sfp->gc.set_rv = jh7110_gpio_set;
sfp->gc.set_config = jh7110_gpio_set_config;
sfp->gc.add_pin_ranges = jh7110_gpio_add_pin_ranges;
sfp->gc.base = info->gc_base;

View File

@ -2,7 +2,7 @@
if ARCH_STM32 || COMPILE_TEST
config PINCTRL_STM32
bool
tristate
depends on OF
select PINMUX
select GENERIC_PINCONF
@ -53,8 +53,22 @@ config PINCTRL_STM32MP157
select PINCTRL_STM32
config PINCTRL_STM32MP257
bool "STMicroelectronics STM32MP257 pin control" if COMPILE_TEST && !MACH_STM32MP25
tristate "STMicroelectronics STM32MP257 pin control"
depends on OF && HAS_IOMEM
default MACH_STM32MP25
default MACH_STM32MP25 || (ARCH_STM32 && ARM64)
select PINCTRL_STM32
config PINCTRL_STM32_HDP
tristate "STMicroelectronics STM32 Hardware Debug Port (HDP) pin control"
depends on OF && HAS_IOMEM
default ARCH_STM32 && !ARM_SINGLE_ARMV7M
select PINMUX
select GENERIC_PINCONF
select GPIOLIB
help
The Hardware Debug Port allows the observation of internal signals.
It uses configurable multiplexer to route signals in a dedicated observation register.
This driver also permits the observation of signals on external SoC pins.
It permits the observation of up to 16 signals per HDP line.
endif

View File

@ -11,3 +11,4 @@ obj-$(CONFIG_PINCTRL_STM32H743) += pinctrl-stm32h743.o
obj-$(CONFIG_PINCTRL_STM32MP135) += pinctrl-stm32mp135.o
obj-$(CONFIG_PINCTRL_STM32MP157) += pinctrl-stm32mp157.o
obj-$(CONFIG_PINCTRL_STM32MP257) += pinctrl-stm32mp257.o
obj-$(CONFIG_PINCTRL_STM32_HDP) += pinctrl-stm32-hdp.o

View File

@ -0,0 +1,720 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) STMicroelectronics 2025 - All Rights Reserved
* Author: Clément Le Goffic <clement.legoffic@foss.st.com> for STMicroelectronics.
*/
#include <linux/bits.h>
#include <linux/clk.h>
#include <linux/gpio/driver.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/pinctrl/consumer.h>
#include <linux/pinctrl/pinconf-generic.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>
#include <linux/platform_device.h>
#include <linux/pm.h>
#include "../core.h"
#define DRIVER_NAME "stm32_hdp"
#define HDP_CTRL_ENABLE 1
#define HDP_CTRL_DISABLE 0
#define HDP_CTRL 0x000
#define HDP_MUX 0x004
#define HDP_VAL 0x010
#define HDP_GPOSET 0x014
#define HDP_GPOCLR 0x018
#define HDP_GPOVAL 0x01c
#define HDP_VERR 0x3f4
#define HDP_IPIDR 0x3f8
#define HDP_SIDR 0x3fc
#define HDP_MUX_SHIFT(n) ((n) * 4)
#define HDP_MUX_MASK(n) (GENMASK(3, 0) << HDP_MUX_SHIFT(n))
#define HDP_MUX_GPOVAL(n) (0xf << HDP_MUX_SHIFT(n))
#define HDP_PIN 8
#define HDP_FUNC 16
#define HDP_FUNC_TOTAL (HDP_PIN * HDP_FUNC)
struct stm32_hdp {
struct device *dev;
void __iomem *base;
struct clk *clk;
struct pinctrl_dev *pctl_dev;
struct gpio_chip gpio_chip;
u32 mux_conf;
u32 gposet_conf;
const char * const *func_name;
};
static const struct pinctrl_pin_desc stm32_hdp_pins[] = {
PINCTRL_PIN(0, "HDP0"),
PINCTRL_PIN(1, "HDP1"),
PINCTRL_PIN(2, "HDP2"),
PINCTRL_PIN(3, "HDP3"),
PINCTRL_PIN(4, "HDP4"),
PINCTRL_PIN(5, "HDP5"),
PINCTRL_PIN(6, "HDP6"),
PINCTRL_PIN(7, "HDP7"),
};
static const char * const func_name_mp13[] = {
//HDP0 functions:
"pwr_pwrwake_sys",
"pwr_stop_forbidden",
"pwr_stdby_wakeup",
"pwr_encomp_vddcore",
"bsec_out_sec_niden",
"aiec_sys_wakeup",
"none",
"none",
"ddrctrl_lp_req",
"pwr_ddr_ret_enable_n",
"dts_clk_ptat",
"none",
"sram3ctrl_tamp_erase_act",
"none",
"none",
"gpoval0",
//HDP1 functions:
"pwr_sel_vth_vddcpu",
"pwr_mpu_ram_lowspeed",
"ca7_naxierrirq",
"pwr_okin_mr",
"bsec_out_sec_dbgen",
"aiec_c1_wakeup",
"rcc_pwrds_mpu",
"none",
"ddrctrl_dfi_ctrlupd_req",
"ddrctrl_cactive_ddrc_asr",
"none",
"none",
"sram3ctrl_hw_erase_act",
"nic400_s0_bready",
"none",
"gpoval1",
//HDP2 functions:
"pwr_pwrwake_mpu",
"pwr_mpu_clock_disable_ack",
"ca7_ndbgreset_i",
"none",
"bsec_in_rstcore_n",
"bsec_out_sec_bsc_dis",
"none",
"none",
"ddrctrl_dfi_init_complete",
"ddrctrl_perf_op_is_refresh",
"ddrctrl_gskp_dfi_lp_req",
"none",
"sram3ctrl_sw_erase_act",
"nic400_s0_bvalid",
"none",
"gpoval2",
//HDP3 functions:
"pwr_sel_vth_vddcore",
"pwr_mpu_clock_disable_req",
"ca7_npmuirq0",
"ca7_nfiqout0",
"bsec_out_sec_dftlock",
"bsec_out_sec_jtag_dis",
"rcc_pwrds_sys",
"sram3ctrl_tamp_erase_req",
"ddrctrl_stat_ddrc_reg_selfref_type0",
"none",
"dts_valobus1_0",
"dts_valobus2_0",
"tamp_potential_tamp_erfcfg",
"nic400_s0_wready",
"nic400_s0_rready",
"gpoval3",
//HDP4 functions:
"none",
"pwr_stop2_active",
"ca7_nl2reset_i",
"ca7_npreset_varm_i",
"bsec_out_sec_dften",
"bsec_out_sec_dbgswenable",
"eth1_out_pmt_intr_o",
"eth2_out_pmt_intr_o",
"ddrctrl_stat_ddrc_reg_selfref_type1",
"ddrctrl_cactive_0",
"dts_valobus1_1",
"dts_valobus2_1",
"tamp_nreset_sram_ercfg",
"nic400_s0_wlast",
"nic400_s0_rlast",
"gpoval4",
//HDP5 functions:
"ca7_standbywfil2",
"pwr_vth_vddcore_ack",
"ca7_ncorereset_i",
"ca7_nirqout0",
"bsec_in_pwrok",
"bsec_out_sec_deviceen",
"eth1_out_lpi_intr_o",
"eth2_out_lpi_intr_o",
"ddrctrl_cactive_ddrc",
"ddrctrl_wr_credit_cnt",
"dts_valobus1_2",
"dts_valobus2_2",
"pka_pka_itamp_out",
"nic400_s0_wvalid",
"nic400_s0_rvalid",
"gpoval5",
//HDP6 functions:
"ca7_standbywfe0",
"pwr_vth_vddcpu_ack",
"ca7_evento",
"none",
"bsec_in_tamper_det",
"bsec_out_sec_spniden",
"eth1_out_mac_speed_o1",
"eth2_out_mac_speed_o1",
"ddrctrl_csysack_ddrc",
"ddrctrl_lpr_credit_cnt",
"dts_valobus1_3",
"dts_valobus2_3",
"saes_tamper_out",
"nic400_s0_awready",
"nic400_s0_arready",
"gpoval6",
//HDP7 functions:
"ca7_standbywfi0",
"pwr_rcc_vcpu_rdy",
"ca7_eventi",
"ca7_dbgack0",
"bsec_out_fuse_ok",
"bsec_out_sec_spiden",
"eth1_out_mac_speed_o0",
"eth2_out_mac_speed_o0",
"ddrctrl_csysreq_ddrc",
"ddrctrl_hpr_credit_cnt",
"dts_valobus1_4",
"dts_valobus2_4",
"rng_tamper_out",
"nic400_s0_awavalid",
"nic400_s0_aravalid",
"gpoval7",
};
static const char * const func_name_mp15[] = {
//HDP0 functions:
"pwr_pwrwake_sys",
"cm4_sleepdeep",
"pwr_stdby_wkup",
"pwr_encomp_vddcore",
"bsec_out_sec_niden",
"none",
"rcc_cm4_sleepdeep",
"gpu_dbg7",
"ddrctrl_lp_req",
"pwr_ddr_ret_enable_n",
"dts_clk_ptat",
"none",
"none",
"none",
"none",
"gpoval0",
//HDP1 functions:
"pwr_pwrwake_mcu",
"cm4_halted",
"ca7_naxierrirq",
"pwr_okin_mr",
"bsec_out_sec_dbgen",
"exti_sys_wakeup",
"rcc_pwrds_mpu",
"gpu_dbg6",
"ddrctrl_dfi_ctrlupd_req",
"ddrctrl_cactive_ddrc_asr",
"none",
"none",
"none",
"none",
"none",
"gpoval1",
//HDP2 functions:
"pwr_pwrwake_mpu",
"cm4_rxev",
"ca7_npmuirq1",
"ca7_nfiqout1",
"bsec_in_rstcore_n",
"exti_c2_wakeup",
"rcc_pwrds_mcu",
"gpu_dbg5",
"ddrctrl_dfi_init_complete",
"ddrctrl_perf_op_is_refresh",
"ddrctrl_gskp_dfi_lp_req",
"none",
"none",
"none",
"none",
"gpoval2",
//HDP3 functions:
"pwr_sel_vth_vddcore",
"cm4_txev",
"ca7_npmuirq0",
"ca7_nfiqout0",
"bsec_out_sec_dftlock",
"exti_c1_wakeup",
"rcc_pwrds_sys",
"gpu_dbg4",
"ddrctrl_stat_ddrc_reg_selfref_type0",
"ddrctrl_cactive_1",
"dts_valobus1_0",
"dts_valobus2_0",
"none",
"none",
"none",
"gpoval3",
//HDP4 functions:
"pwr_mpu_pdds_not_cstbydis",
"cm4_sleeping",
"ca7_nreset1",
"ca7_nirqout1",
"bsec_out_sec_dften",
"bsec_out_sec_dbgswenable",
"eth_out_pmt_intr_o",
"gpu_dbg3",
"ddrctrl_stat_ddrc_reg_selfref_type1",
"ddrctrl_cactive_0",
"dts_valobus1_1",
"dts_valobus2_1",
"none",
"none",
"none",
"gpoval4",
//HDP5 functions:
"ca7_standbywfil2",
"pwr_vth_vddcore_ack",
"ca7_nreset0",
"ca7_nirqout0",
"bsec_in_pwrok",
"bsec_out_sec_deviceen",
"eth_out_lpi_intr_o",
"gpu_dbg2",
"ddrctrl_cactive_ddrc",
"ddrctrl_wr_credit_cnt",
"dts_valobus1_2",
"dts_valobus2_2",
"none",
"none",
"none",
"gpoval5",
//HDP6 functions:
"ca7_standbywfi1",
"ca7_standbywfe1",
"ca7_evento",
"ca7_dbgack1",
"none",
"bsec_out_sec_spniden",
"eth_out_mac_speed_o1",
"gpu_dbg1",
"ddrctrl_csysack_ddrc",
"ddrctrl_lpr_credit_cnt",
"dts_valobus1_3",
"dts_valobus2_3",
"none",
"none",
"none",
"gpoval6",
//HDP7 functions:
"ca7_standbywfi0",
"ca7_standbywfe0",
"none",
"ca7_dbgack0",
"bsec_out_fuse_ok",
"bsec_out_sec_spiden",
"eth_out_mac_speed_o0",
"gpu_dbg0",
"ddrctrl_csysreq_ddrc",
"ddrctrl_hpr_credit_cnt",
"dts_valobus1_4",
"dts_valobus2_4",
"none",
"none",
"none",
"gpoval7"
};
static const char * const func_name_mp25[] = {
//HDP0 functions:
"pwr_pwrwake_sys",
"cpu2_sleep_deep",
"bsec_out_tst_sdr_unlock_or_disable_scan",
"bsec_out_nidenm",
"bsec_out_nidena",
"cpu2_state_0",
"rcc_pwrds_sys",
"gpu_dbg7",
"ddrss_csysreq_ddrc",
"ddrss_dfi_phyupd_req",
"cpu3_sleep_deep",
"d2_gbl_per_clk_bus_req",
"pcie_usb_cxpl_debug_info_ei_0",
"pcie_usb_cxpl_debug_info_ei_8",
"d3_state_0",
"gpoval0",
//HDP1 functions:
"pwr_pwrwake_cpu2",
"cpu2_halted",
"cpu2_state_1",
"bsec_out_dbgenm",
"bsec_out_dbgena",
"exti1_sys_wakeup",
"rcc_pwrds_cpu2",
"gpu_dbg6",
"ddrss_csysack_ddrc",
"ddrss_dfi_phymstr_req",
"cpu3_halted",
"d2_gbl_per_dma_req",
"pcie_usb_cxpl_debug_info_ei_1",
"pcie_usb_cxpl_debug_info_ei_9",
"d3_state_1",
"gpoval1",
//HDP2 functions:
"pwr_pwrwake_cpu1",
"cpu2_rxev",
"cpu1_npumirq1",
"cpu1_nfiqout1",
"bsec_out_shdbgen",
"exti1_cpu2_wakeup",
"rcc_pwrds_cpu1",
"gpu_dbg5",
"ddrss_cactive_ddrc",
"ddrss_dfi_lp_req",
"cpu3_rxev",
"hpdma1_clk_bus_req",
"pcie_usb_cxpl_debug_info_ei_2",
"pcie_usb_cxpl_debug_info_ei_10",
"d3_state_2",
"gpoval2",
//HDP3 functions:
"pwr_sel_vth_vddcpu",
"cpu2_txev",
"cpu1_npumirq0",
"cpu1_nfiqout0",
"bsec_out_ddbgen",
"exti1_cpu1_wakeup",
"cpu3_state_0",
"gpu_dbg4",
"ddrss_mcdcg_en",
"ddrss_dfi_freq_0",
"cpu3_txev",
"hpdma2_clk_bus_req",
"pcie_usb_cxpl_debug_info_ei_3",
"pcie_usb_cxpl_debug_info_ei_11",
"d1_state_0",
"gpoval3",
//HDP4 functions:
"pwr_sel_vth_vddcore",
"cpu2_sleeping",
"cpu1_evento",
"cpu1_nirqout1",
"bsec_out_spnidena",
"exti2_d3_wakeup",
"eth1_out_pmt_intr_o",
"gpu_dbg3",
"ddrss_dphycg_en",
"ddrss_obsp0",
"cpu3_sleeping",
"hpdma3_clk_bus_req",
"pcie_usb_cxpl_debug_info_ei_4",
"pcie_usb_cxpl_debug_info_ei_12",
"d1_state_1",
"gpoval4",
//HDP5 functions:
"cpu1_standby_wfil2",
"none",
"none",
"cpu1_nirqout0",
"bsec_out_spidena",
"exti2_cpu3_wakeup",
"eth1_out_lpi_intr_o",
"gpu_dbg2",
"ddrctrl_dfi_init_start",
"ddrss_obsp1",
"cpu3_state_1",
"d3_gbl_per_clk_bus_req",
"pcie_usb_cxpl_debug_info_ei_5",
"pcie_usb_cxpl_debug_info_ei_13",
"d1_state_2",
"gpoval5",
//HDP6 functions:
"cpu1_standby_wfi1",
"cpu1_standby_wfe1",
"cpu1_halted1",
"cpu1_naxierrirq",
"bsec_out_spnidenm",
"exti2_cpu2_wakeup",
"eth2_out_pmt_intr_o",
"gpu_dbg1",
"ddrss_dfi_init_complete",
"ddrss_obsp2",
"d2_state_0",
"d3_gbl_per_dma_req",
"pcie_usb_cxpl_debug_info_ei_6",
"pcie_usb_cxpl_debug_info_ei_14",
"cpu1_state_0",
"gpoval6",
//HDP7 functions:
"cpu1_standby_wfi0",
"cpu1_standby_wfe0",
"cpu1_halted0",
"none",
"bsec_out_spidenm",
"exti2_cpu1__wakeup",
"eth2_out_lpi_intr_o",
"gpu_dbg0",
"ddrss_dfi_ctrlupd_req",
"ddrss_obsp3",
"d2_state_1",
"lpdma1_clk_bus_req",
"pcie_usb_cxpl_debug_info_ei_7",
"pcie_usb_cxpl_debug_info_ei_15",
"cpu1_state_1",
"gpoval7",
};
static const char * const stm32_hdp_pins_group[] = {
"HDP0",
"HDP1",
"HDP2",
"HDP3",
"HDP4",
"HDP5",
"HDP6",
"HDP7"
};
static int stm32_hdp_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)
{
return GPIO_LINE_DIRECTION_OUT;
}
static int stm32_hdp_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
{
return ARRAY_SIZE(stm32_hdp_pins);
}
static const char *stm32_hdp_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
unsigned int selector)
{
return stm32_hdp_pins[selector].name;
}
static int stm32_hdp_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector,
const unsigned int **pins, unsigned int *num_pins)
{
*pins = &stm32_hdp_pins[selector].number;
*num_pins = 1;
return 0;
}
static const struct pinctrl_ops stm32_hdp_pinctrl_ops = {
.get_groups_count = stm32_hdp_pinctrl_get_groups_count,
.get_group_name = stm32_hdp_pinctrl_get_group_name,
.get_group_pins = stm32_hdp_pinctrl_get_group_pins,
.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
.dt_free_map = pinconf_generic_dt_free_map,
};
static int stm32_hdp_pinmux_get_functions_count(struct pinctrl_dev *pctldev)
{
return HDP_FUNC_TOTAL;
}
static const char *stm32_hdp_pinmux_get_function_name(struct pinctrl_dev *pctldev,
unsigned int selector)
{
struct stm32_hdp *hdp = pinctrl_dev_get_drvdata(pctldev);
return hdp->func_name[selector];
}
static int stm32_hdp_pinmux_get_function_groups(struct pinctrl_dev *pctldev, unsigned int selector,
const char *const **groups,
unsigned int *num_groups)
{
u32 index = selector / HDP_FUNC;
*groups = &stm32_hdp_pins[index].name;
*num_groups = 1;
return 0;
}
static int stm32_hdp_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
unsigned int group_selector)
{
struct stm32_hdp *hdp = pinctrl_dev_get_drvdata(pctldev);
unsigned int pin = stm32_hdp_pins[group_selector].number;
u32 mux;
func_selector %= HDP_FUNC;
mux = readl_relaxed(hdp->base + HDP_MUX);
mux &= ~HDP_MUX_MASK(pin);
mux |= func_selector << HDP_MUX_SHIFT(pin);
writel_relaxed(mux, hdp->base + HDP_MUX);
hdp->mux_conf = mux;
return 0;
}
static const struct pinmux_ops stm32_hdp_pinmux_ops = {
.get_functions_count = stm32_hdp_pinmux_get_functions_count,
.get_function_name = stm32_hdp_pinmux_get_function_name,
.get_function_groups = stm32_hdp_pinmux_get_function_groups,
.set_mux = stm32_hdp_pinmux_set_mux,
.gpio_set_direction = NULL,
};
static struct pinctrl_desc stm32_hdp_pdesc = {
.name = DRIVER_NAME,
.pins = stm32_hdp_pins,
.npins = ARRAY_SIZE(stm32_hdp_pins),
.pctlops = &stm32_hdp_pinctrl_ops,
.pmxops = &stm32_hdp_pinmux_ops,
.owner = THIS_MODULE,
};
static const struct of_device_id stm32_hdp_of_match[] = {
{
.compatible = "st,stm32mp131-hdp",
.data = &func_name_mp13,
},
{
.compatible = "st,stm32mp151-hdp",
.data = &func_name_mp15,
},
{
.compatible = "st,stm32mp251-hdp",
.data = &func_name_mp25,
},
{}
};
MODULE_DEVICE_TABLE(of, stm32_hdp_of_match);
static int stm32_hdp_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct stm32_hdp *hdp;
u8 version;
int err;
hdp = devm_kzalloc(dev, sizeof(*hdp), GFP_KERNEL);
if (!hdp)
return -ENOMEM;
hdp->dev = dev;
platform_set_drvdata(pdev, hdp);
hdp->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(hdp->base))
return PTR_ERR(hdp->base);
hdp->func_name = of_device_get_match_data(dev);
if (!hdp->func_name)
return dev_err_probe(dev, -ENODEV, "No function name provided\n");
hdp->clk = devm_clk_get_enabled(dev, NULL);
if (IS_ERR(hdp->clk))
return dev_err_probe(dev, PTR_ERR(hdp->clk), "No HDP clock provided\n");
err = devm_pinctrl_register_and_init(dev, &stm32_hdp_pdesc, hdp, &hdp->pctl_dev);
if (err)
return dev_err_probe(dev, err, "Failed to register pinctrl\n");
err = pinctrl_enable(hdp->pctl_dev);
if (err)
return dev_err_probe(dev, err, "Failed to enable pinctrl\n");
hdp->gpio_chip.get_direction = stm32_hdp_gpio_get_direction;
hdp->gpio_chip.ngpio = ARRAY_SIZE(stm32_hdp_pins);
hdp->gpio_chip.can_sleep = true;
hdp->gpio_chip.names = stm32_hdp_pins_group;
err = bgpio_init(&hdp->gpio_chip, dev, 4,
hdp->base + HDP_GPOVAL,
hdp->base + HDP_GPOSET,
hdp->base + HDP_GPOCLR,
NULL, NULL, BGPIOF_NO_INPUT);
if (err)
return dev_err_probe(dev, err, "Failed to init bgpio\n");
err = devm_gpiochip_add_data(dev, &hdp->gpio_chip, hdp);
if (err)
return dev_err_probe(dev, err, "Failed to add gpiochip\n");
writel_relaxed(HDP_CTRL_ENABLE, hdp->base + HDP_CTRL);
version = readl_relaxed(hdp->base + HDP_VERR);
dev_dbg(dev, "STM32 HDP version %u.%u initialized\n", version >> 4, version & 0x0f);
return 0;
}
static void stm32_hdp_remove(struct platform_device *pdev)
{
struct stm32_hdp *hdp = platform_get_drvdata(pdev);
writel_relaxed(HDP_CTRL_DISABLE, hdp->base + HDP_CTRL);
}
static int stm32_hdp_suspend(struct device *dev)
{
struct stm32_hdp *hdp = dev_get_drvdata(dev);
hdp->gposet_conf = readl_relaxed(hdp->base + HDP_GPOSET);
pinctrl_pm_select_sleep_state(dev);
clk_disable_unprepare(hdp->clk);
return 0;
}
static int stm32_hdp_resume(struct device *dev)
{
struct stm32_hdp *hdp = dev_get_drvdata(dev);
int err;
err = clk_prepare_enable(hdp->clk);
if (err) {
dev_err(dev, "Failed to prepare_enable clk (%d)\n", err);
return err;
}
writel_relaxed(HDP_CTRL_ENABLE, hdp->base + HDP_CTRL);
writel_relaxed(hdp->gposet_conf, hdp->base + HDP_GPOSET);
writel_relaxed(hdp->mux_conf, hdp->base + HDP_MUX);
pinctrl_pm_select_default_state(dev);
return 0;
}
static DEFINE_SIMPLE_DEV_PM_OPS(stm32_hdp_pm_ops, stm32_hdp_suspend, stm32_hdp_resume);
static struct platform_driver stm32_hdp_driver = {
.probe = stm32_hdp_probe,
.remove = stm32_hdp_remove,
.driver = {
.name = DRIVER_NAME,
.pm = pm_sleep_ptr(&stm32_hdp_pm_ops),
.of_match_table = stm32_hdp_of_match,
}
};
module_platform_driver(stm32_hdp_driver);
MODULE_AUTHOR("Clément Le Goffic");
MODULE_DESCRIPTION("STMicroelectronics STM32 Hardware Debug Port driver");
MODULE_LICENSE("GPL");

View File

@ -6,7 +6,9 @@
*
* Heavily based on Mediatek's pinctrl driver
*/
#include <linux/bitfield.h>
#include <linux/clk.h>
#include <linux/export.h>
#include <linux/gpio/driver.h>
#include <linux/hwspinlock.h>
#include <linux/io.h>
@ -36,6 +38,8 @@
#include "../pinctrl-utils.h"
#include "pinctrl-stm32.h"
#define STM32_GPIO_CID1 1
#define STM32_GPIO_MODER 0x00
#define STM32_GPIO_TYPER 0x04
#define STM32_GPIO_SPEEDR 0x08
@ -47,6 +51,8 @@
#define STM32_GPIO_AFRL 0x20
#define STM32_GPIO_AFRH 0x24
#define STM32_GPIO_SECCFGR 0x30
#define STM32_GPIO_CIDCFGR(x) (0x50 + (0x8 * (x)))
#define STM32_GPIO_SEMCR(x) (0x54 + (0x8 * (x)))
/* custom bitfield to backup pin status */
#define STM32_GPIO_BKP_MODE_SHIFT 0
@ -60,6 +66,14 @@
#define STM32_GPIO_BKP_TYPE 10
#define STM32_GPIO_BKP_VAL 11
#define STM32_GPIO_CIDCFGR_CFEN BIT(0)
#define STM32_GPIO_CIDCFGR_SEMEN BIT(1)
#define STM32_GPIO_CIDCFGR_SCID_MASK GENMASK(5, 4)
#define STM32_GPIO_CIDCFGR_SEMWL_CID1 BIT(16 + STM32_GPIO_CID1)
#define STM32_GPIO_SEMCR_SEM_MUTEX BIT(0)
#define STM32_GPIO_SEMCR_SEMCID_MASK GENMASK(5, 4)
#define STM32_GPIO_PINS_PER_BANK 16
#define STM32_GPIO_IRQ_LINE 16
@ -77,6 +91,7 @@ static const char * const stm32_gpio_functions[] = {
"af8", "af9", "af10",
"af11", "af12", "af13",
"af14", "af15", "analog",
"reserved",
};
struct stm32_pinctrl_group {
@ -98,6 +113,7 @@ struct stm32_gpio_bank {
u32 pin_backup[STM32_GPIO_PINS_PER_BANK];
u8 irq_type[STM32_GPIO_PINS_PER_BANK];
bool secure_control;
bool rif_control;
};
struct stm32_pinctrl {
@ -122,6 +138,8 @@ struct stm32_pinctrl {
spinlock_t irqmux_lock;
};
static void stm32_pmx_get_mode(struct stm32_gpio_bank *bank, int pin, u32 *mode, u32 *alt);
static inline int stm32_gpio_pin(int gpio)
{
return gpio % STM32_GPIO_PINS_PER_BANK;
@ -192,6 +210,80 @@ static void stm32_gpio_backup_bias(struct stm32_gpio_bank *bank, u32 offset,
bank->pin_backup[offset] |= bias << STM32_GPIO_BKP_PUPD_SHIFT;
}
/* RIF functions */
static bool stm32_gpio_rif_valid(struct stm32_gpio_bank *bank, unsigned int gpio_nr)
{
u32 cid;
cid = readl_relaxed(bank->base + STM32_GPIO_CIDCFGR(gpio_nr));
if (!(cid & STM32_GPIO_CIDCFGR_CFEN))
return true;
if (!(cid & STM32_GPIO_CIDCFGR_SEMEN)) {
if (FIELD_GET(STM32_GPIO_CIDCFGR_SCID_MASK, cid) == STM32_GPIO_CID1)
return true;
return false;
}
if (cid & STM32_GPIO_CIDCFGR_SEMWL_CID1)
return true;
return false;
}
static bool stm32_gpio_rif_acquire_semaphore(struct stm32_gpio_bank *bank, unsigned int gpio_nr)
{
u32 cid, sem;
cid = readl_relaxed(bank->base + STM32_GPIO_CIDCFGR(gpio_nr));
if (!(cid & STM32_GPIO_CIDCFGR_CFEN))
return true;
if (!(cid & STM32_GPIO_CIDCFGR_SEMEN)) {
if (FIELD_GET(STM32_GPIO_CIDCFGR_SCID_MASK, cid) == STM32_GPIO_CID1)
return true;
return false;
}
if (!(cid & STM32_GPIO_CIDCFGR_SEMWL_CID1))
return false;
sem = readl_relaxed(bank->base + STM32_GPIO_SEMCR(gpio_nr));
if (sem & STM32_GPIO_SEMCR_SEM_MUTEX) {
if (FIELD_GET(STM32_GPIO_SEMCR_SEMCID_MASK, sem) == STM32_GPIO_CID1)
return true;
return false;
}
writel_relaxed(STM32_GPIO_SEMCR_SEM_MUTEX, bank->base + STM32_GPIO_SEMCR(gpio_nr));
sem = readl_relaxed(bank->base + STM32_GPIO_SEMCR(gpio_nr));
if (sem & STM32_GPIO_SEMCR_SEM_MUTEX &&
FIELD_GET(STM32_GPIO_SEMCR_SEMCID_MASK, sem) == STM32_GPIO_CID1)
return true;
return false;
}
static void stm32_gpio_rif_release_semaphore(struct stm32_gpio_bank *bank, unsigned int gpio_nr)
{
u32 cid;
cid = readl_relaxed(bank->base + STM32_GPIO_CIDCFGR(gpio_nr));
if (!(cid & STM32_GPIO_CIDCFGR_CFEN))
return;
if (cid & STM32_GPIO_CIDCFGR_SEMEN)
writel_relaxed(0, bank->base + STM32_GPIO_SEMCR(gpio_nr));
}
/* GPIO functions */
static inline void __stm32_gpio_set(struct stm32_gpio_bank *bank,
@ -218,9 +310,26 @@ static int stm32_gpio_request(struct gpio_chip *chip, unsigned offset)
return -EINVAL;
}
if (bank->rif_control) {
if (!stm32_gpio_rif_acquire_semaphore(bank, offset)) {
dev_err(pctl->dev, "pin %d not available.\n", pin);
return -EINVAL;
}
}
return pinctrl_gpio_request(chip, offset);
}
static void stm32_gpio_free(struct gpio_chip *chip, unsigned int offset)
{
struct stm32_gpio_bank *bank = gpiochip_get_data(chip);
pinctrl_gpio_free(chip, offset);
if (bank->rif_control)
stm32_gpio_rif_release_semaphore(bank, offset);
}
static int stm32_gpio_get(struct gpio_chip *chip, unsigned offset)
{
struct stm32_gpio_bank *bank = gpiochip_get_data(chip);
@ -304,12 +413,25 @@ static int stm32_gpio_init_valid_mask(struct gpio_chip *chip,
}
}
if (bank->rif_control) {
for (i = 0; i < ngpios; i++) {
if (!test_bit(i, valid_mask))
continue;
if (stm32_gpio_rif_valid(bank, i))
continue;
dev_dbg(pctl->dev, "RIF semaphore ownership conflict, GPIO %u", i);
clear_bit(i, valid_mask);
}
}
return 0;
}
static const struct gpio_chip stm32_gpio_template = {
.request = stm32_gpio_request,
.free = pinctrl_gpio_free,
.free = stm32_gpio_free,
.get = stm32_gpio_get,
.set_rv = stm32_gpio_set,
.direction_input = pinctrl_gpio_direction_input,
@ -411,6 +533,7 @@ static struct irq_chip stm32_gpio_irq_chip = {
.irq_set_wake = irq_chip_set_wake_parent,
.irq_request_resources = stm32_gpio_irq_request_resources,
.irq_release_resources = stm32_gpio_irq_release_resources,
.irq_set_affinity = IS_ENABLED(CONFIG_SMP) ? irq_chip_set_affinity_parent : NULL,
};
static int stm32_gpio_domain_translate(struct irq_domain *d,
@ -541,6 +664,9 @@ static bool stm32_pctrl_is_function_valid(struct stm32_pinctrl *pctl,
if (pin->pin.number != pin_num)
continue;
if (fnum == STM32_PIN_RSVD)
return true;
for (k = 0; k < STM32_CONFIG_NUM; k++) {
if (func->num == fnum)
return true;
@ -798,8 +924,7 @@ unlock:
return err;
}
void stm32_pmx_get_mode(struct stm32_gpio_bank *bank, int pin, u32 *mode,
u32 *alt)
static void stm32_pmx_get_mode(struct stm32_gpio_bank *bank, int pin, u32 *mode, u32 *alt)
{
u32 val;
int alt_shift = (pin % 8) * 4;
@ -841,6 +966,11 @@ static int stm32_pmx_set_mux(struct pinctrl_dev *pctldev,
return -EINVAL;
}
if (function == STM32_PIN_RSVD) {
dev_dbg(pctl->dev, "Reserved pins, skipping HW update.\n");
return 0;
}
bank = gpiochip_get_data(range->gc);
pin = stm32_gpio_pin(g->pin);
@ -1348,6 +1478,7 @@ static int stm32_gpiolib_register_bank(struct stm32_pinctrl *pctl, struct fwnode
bank->bank_nr = bank_nr;
bank->bank_ioport_nr = bank_ioport_nr;
bank->secure_control = pctl->match_data->secure_control;
bank->rif_control = pctl->match_data->rif_control;
spin_lock_init(&bank->lock);
if (pctl->domain) {
@ -1664,6 +1795,7 @@ err_register:
clk_bulk_disable_unprepare(banks, pctl->clks);
return ret;
}
EXPORT_SYMBOL(stm32_pctl_probe);
static int __maybe_unused stm32_pinctrl_restore_gpio_regs(
struct stm32_pinctrl *pctl, u32 pin)
@ -1736,6 +1868,7 @@ int __maybe_unused stm32_pinctrl_suspend(struct device *dev)
return 0;
}
EXPORT_SYMBOL(stm32_pinctrl_suspend);
int __maybe_unused stm32_pinctrl_resume(struct device *dev)
{
@ -1752,3 +1885,8 @@ int __maybe_unused stm32_pinctrl_resume(struct device *dev)
return 0;
}
EXPORT_SYMBOL(stm32_pinctrl_resume);
MODULE_AUTHOR("Alexandre Torgue <alexandre.torgue@foss.st.com>");
MODULE_DESCRIPTION("STM32 core pinctrl driver");
MODULE_LICENSE("GPL");

View File

@ -17,7 +17,8 @@
#define STM32_PIN_GPIO 0
#define STM32_PIN_AF(x) ((x) + 1)
#define STM32_PIN_ANALOG (STM32_PIN_AF(15) + 1)
#define STM32_CONFIG_NUM (STM32_PIN_ANALOG + 1)
#define STM32_PIN_RSVD (STM32_PIN_ANALOG + 1)
#define STM32_CONFIG_NUM (STM32_PIN_RSVD + 1)
/* package information */
#define STM32MP_PKG_AA BIT(0)
@ -63,14 +64,25 @@ struct stm32_pinctrl_match_data {
const struct stm32_desc_pin *pins;
const unsigned int npins;
bool secure_control;
bool rif_control;
};
struct stm32_gpio_bank;
/**
* stm32_pctl_probe() - Common probe for stm32 pinctrl drivers.
* @pdev: Pinctrl platform device.
*/
int stm32_pctl_probe(struct platform_device *pdev);
void stm32_pmx_get_mode(struct stm32_gpio_bank *bank,
int pin, u32 *mode, u32 *alt);
/**
* stm32_pinctrl_suspend() - Common suspend for stm32 pinctrl drivers.
* @dev: Pinctrl device.
*/
int stm32_pinctrl_suspend(struct device *dev);
/**
* stm32_pinctrl_resume() - Common resume for stm32 pinctrl drivers.
* @dev: Pinctrl device.
*/
int stm32_pinctrl_resume(struct device *dev);
#endif /* __PINCTRL_STM32_H */

Some files were not shown because too many files have changed in this diff Show More