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:
commit
186f3edfdd
@ -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
|
||||
|
@ -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";
|
||||
};
|
||||
};
|
||||
};
|
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
133
Documentation/devicetree/bindings/pinctrl/qcom,milos-tlmm.yaml
Normal file
133
Documentation/devicetree/bindings/pinctrl/qcom,milos-tlmm.yaml
Normal 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;
|
||||
};
|
||||
};
|
||||
...
|
@ -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
|
||||
|
@ -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.
|
||||
|
187
Documentation/devicetree/bindings/pinctrl/st,stm32-hdp.yaml
Normal file
187
Documentation/devicetree/bindings/pinctrl/st,stm32-hdp.yaml
Normal 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";
|
||||
};
|
||||
};
|
@ -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
|
||||
|
14
MAINTAINERS
14
MAINTAINERS
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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/
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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",
|
||||
},
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
};
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
1700
drivers/pinctrl/mediatek/pinctrl-mt8189.c
Normal file
1700
drivers/pinctrl/mediatek/pinctrl-mt8189.c
Normal file
File diff suppressed because it is too large
Load Diff
2452
drivers/pinctrl/mediatek/pinctrl-mtk-mt8189.h
Normal file
2452
drivers/pinctrl/mediatek/pinctrl-mtk-mt8189.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
@ -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[] = {
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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)) {
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
704
drivers/pinctrl/pinctrl-eic7700.c
Normal file
704
drivers/pinctrl/pinctrl-eic7700.c
Normal 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");
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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),
|
||||
|
@ -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)) {
|
||||
|
@ -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, \
|
||||
|
@ -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)) {
|
||||
|
@ -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,
|
||||
|
@ -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),
|
||||
|
@ -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,
|
||||
|
@ -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),
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
1339
drivers/pinctrl/qcom/pinctrl-milos.c
Normal file
1339
drivers/pinctrl/qcom/pinctrl-milos.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -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 },
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
720
drivers/pinctrl/stm32/pinctrl-stm32-hdp.c
Normal file
720
drivers/pinctrl/stm32/pinctrl-stm32-hdp.c
Normal 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");
|
@ -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");
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user