You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge tag 'pinctrl-v4.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl
Pull pin control updates from Linus Walleij:
"This is the bulk of pin control changes for the v4.16 kernel cycle.
Like with GPIO it is actually a bit calm this time.
Core changes:
- After lengthy discussions and partly due to my ignorance, we have
merged a patch making pinctrl_force_default() and
pinctrl_force_sleep() reprogram the states into the hardware of any
hogged pins, even if they are already in the desired state.
This only apply to hogged pins since groups of pins owned by
drivers need to be managed by each driver, lest they could not do
things like runtime PM and put pins to sleeping state even if the
system as a whole is not in sleep.
New drivers:
- New driver for the Microsemi Ocelot SoC. This is used in ethernet
switches.
- The X-Powers AXP209 GPIO driver was extended to also deal with pin
control and moved over from the GPIO subsystem. This circuit is a
mixed-mode integrated circuit which is part of AllWinner designs.
- New subdriver for the Qualcomm MSM8998 SoC, core of a high end
mobile devices (phones) chipset.
- New subdriver for the ST Microelectronics STM32MP157 MPU and
STM32F769 MCU from the STM32 family.
- New subdriver for the MediaTek MT7622 SoC. This is used for
routers, repeater, gateways and such network infrastructure.
- New subdriver for the NXP (former Freescale) i.MX 6ULL. This SoC
has multimedia features and target "smart devices", I guess in-car
entertainment, in-flight entertainment, industrial control panels
etc.
General improvements:
- Incremental improvements on the SH-PFC subdrivers for things like
the CAN bus.
- Enable the glitch filter on Baytrail GPIOs used for interrupts.
- Proper handling of pins to GPIO ranges on the Semtec SX150X
- An IRQ setup ordering fix on MCP23S08.
- A good set of janitorial coding style fixes"
* tag 'pinctrl-v4.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (102 commits)
pinctrl: mcp23s08: fix irq setup order
pinctrl: Forward declare struct device
pinctrl: sunxi: Use of_clk_get_parent_count() instead of open coding
pinctrl: stm32: add STM32F769 MCU support
pinctrl: sx150x: Add a static gpio/pinctrl pin range mapping
pinctrl: sx150x: Register pinctrl before adding the gpiochip
pinctrl: sx150x: Unregister the pinctrl on release
pinctrl: ingenic: Remove redundant dev_err call in ingenic_pinctrl_probe()
pinctrl: sprd: Use seq_putc() in sprd_pinconf_group_dbg_show()
pinctrl: pinmux: Use seq_putc() in pinmux_pins_show()
pinctrl: abx500: Use seq_putc() in abx500_gpio_dbg_show()
pinctrl: mediatek: mt7622: align error handling of mtk_hw_get_value call
pinctrl: mediatek: mt7622: fix potential uninitialized value being returned
pinctrl: uniphier: refactor drive strength get/set functions
pinctrl: imx7ulp: constify struct imx_cfg_params_decode
pinctrl: imx: constify struct imx_pinctrl_soc_info
pinctrl: imx7d: simplify imx7d_pinctrl_probe
pinctrl: imx: use struct imx_pinctrl_soc_info as a const
pinctrl: sunxi-pinctrl: fix pin funtion can not be match correctly.
pinctrl: qcom: Add msm8998 pinctrl driver
...
This commit is contained in:
@@ -17,6 +17,9 @@ and generic pin config nodes.
|
||||
|
||||
Supported configurations:
|
||||
- skew-delay is supported on the Ethernet pins
|
||||
- drive-strength with 4, 8, 12 or 16 mA as argument is supported for
|
||||
entire groups on the groups "idegrp", "gmii_gmac0_grp", "gmii_gmac1_grp"
|
||||
and "pcigrp".
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@ Please refer to fsl,imx-pinctrl.txt in this directory for common binding part
|
||||
and usage.
|
||||
|
||||
Required properties:
|
||||
- compatible: "fsl,imx6ul-iomuxc"
|
||||
- compatible: "fsl,imx6ul-iomuxc" for main IOMUX controller or
|
||||
"fsl,imx6ull-iomuxc-snvs" for i.MX 6ULL's SNVS IOMUX controller.
|
||||
- fsl,pins: each entry consists of 6 integers and represents the mux and config
|
||||
setting for one pin. The first 5 integers <mux_reg conf_reg input_reg mux_val
|
||||
input_val> are specified using a PIN_FUNC_ID macro, which can be found in
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
Microsemi Ocelot pin controller Device Tree Bindings
|
||||
----------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "mscc,ocelot-pinctrl"
|
||||
- reg : Address and length of the register set for the device
|
||||
- gpio-controller : Indicates this device is a GPIO controller
|
||||
- #gpio-cells : Must be 2.
|
||||
The first cell is the pin number and the
|
||||
second cell specifies GPIO flags, as defined in
|
||||
<dt-bindings/gpio/gpio.h>.
|
||||
- gpio-ranges : Range of pins managed by the GPIO controller.
|
||||
|
||||
|
||||
The ocelot-pinctrl driver uses the generic pin multiplexing and generic pin
|
||||
configuration documented in pinctrl-bindings.txt.
|
||||
|
||||
The following generic properties are supported:
|
||||
- function
|
||||
- pins
|
||||
|
||||
Example:
|
||||
gpio: pinctrl@71070034 {
|
||||
compatible = "mscc,ocelot-pinctrl";
|
||||
reg = <0x71070034 0x28>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
gpio-ranges = <&gpio 0 0 22>;
|
||||
|
||||
uart_pins: uart-pins {
|
||||
pins = "GPIO_6", "GPIO_7";
|
||||
function = "uart";
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
pins = "GPIO_12", "GPIO_13";
|
||||
function = "uart2";
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,351 @@
|
||||
== MediaTek MT7622 pinctrl controller ==
|
||||
|
||||
Required properties for the root node:
|
||||
- compatible: Should be one of the following
|
||||
"mediatek,mt7622-pinctrl" for MT7622 SoC
|
||||
- reg: offset and length of the pinctrl space
|
||||
|
||||
- gpio-controller: Marks the device node as a GPIO controller.
|
||||
- #gpio-cells: Should be two. The first cell is the pin number and the
|
||||
second is the GPIO flags.
|
||||
|
||||
Please refer to pinctrl-bindings.txt in this directory for details of the
|
||||
common pinctrl bindings used by client devices, including the meaning of the
|
||||
phrase "pin configuration node".
|
||||
|
||||
MT7622 pin configuration nodes act as a container for an arbitrary number of
|
||||
subnodes. Each of these subnodes represents some desired configuration for a
|
||||
pin, a group, or a list of pins or groups. This configuration can include the
|
||||
mux function to select on those pin(s)/group(s), and various pin configuration
|
||||
parameters, such as pull-up, slew rate, etc.
|
||||
|
||||
We support 2 types of configuration nodes. Those nodes can be either pinmux
|
||||
nodes or pinconf nodes. Each configuration node can consist of multiple nodes
|
||||
describing the pinmux and pinconf options.
|
||||
|
||||
The name of each subnode doesn't matter as long as it is unique; all subnodes
|
||||
should be enumerated and processed purely based on their content.
|
||||
|
||||
== pinmux nodes content ==
|
||||
|
||||
The following generic properties as defined in pinctrl-bindings.txt are valid
|
||||
to specify in a pinmux subnode:
|
||||
|
||||
Required properties are:
|
||||
- groups: An array of strings. Each string contains the name of a group.
|
||||
Valid values for these names are listed below.
|
||||
- function: A string containing the name of the function to mux to the
|
||||
group. Valid values for function names are listed below.
|
||||
|
||||
== pinconf nodes content ==
|
||||
|
||||
The following generic properties as defined in pinctrl-bindings.txt are valid
|
||||
to specify in a pinconf subnode:
|
||||
|
||||
Required properties are:
|
||||
- pins: An array of strings. Each string contains the name of a pin.
|
||||
Valid values for these names are listed below.
|
||||
- groups: An array of strings. Each string contains the name of a group.
|
||||
Valid values for these names are listed below.
|
||||
|
||||
Optional properies are:
|
||||
bias-disable, bias-pull, bias-pull-down, input-enable,
|
||||
input-schmitt-enable, input-schmitt-disable, output-enable
|
||||
output-low, output-high, drive-strength, slew-rate
|
||||
|
||||
Valid arguments for 'slew-rate' are '0' for no slew rate controlled and '1' for
|
||||
slower slew rate respectively.
|
||||
Valid arguments for 'drive-strength', 4, 8, 12, or 16 in mA.
|
||||
|
||||
The following specific properties as defined are valid to specify in a pinconf
|
||||
subnode:
|
||||
|
||||
Optional properties are:
|
||||
- mediatek,tdsel: An integer describing the steps for output level shifter duty
|
||||
cycle when asserted (high pulse width adjustment). Valid arguments are from 0
|
||||
to 15.
|
||||
- mediatek,rdsel: An integer describing the steps for input level shifter duty
|
||||
cycle when asserted (high pulse width adjustment). Valid arguments are from 0
|
||||
to 63.
|
||||
|
||||
== Valid values for pins, function and groups on MT7622 ==
|
||||
|
||||
Valid values for pins are:
|
||||
pins can be referenced via the pin names as the below table shown and the
|
||||
related physical number is also put ahead of those names which helps cross
|
||||
references to pins between groups to know whether pins assignment conflict
|
||||
happens among devices try to acquire those available pins.
|
||||
|
||||
Pin #: Valid values for pins
|
||||
-----------------------------
|
||||
PIN 0: "GPIO_A"
|
||||
PIN 1: "I2S1_IN"
|
||||
PIN 2: "I2S1_OUT"
|
||||
PIN 3: "I2S_BCLK"
|
||||
PIN 4: "I2S_WS"
|
||||
PIN 5: "I2S_MCLK"
|
||||
PIN 6: "TXD0"
|
||||
PIN 7: "RXD0"
|
||||
PIN 8: "SPI_WP"
|
||||
PIN 9: "SPI_HOLD"
|
||||
PIN 10: "SPI_CLK"
|
||||
PIN 11: "SPI_MOSI"
|
||||
PIN 12: "SPI_MISO"
|
||||
PIN 13: "SPI_CS"
|
||||
PIN 14: "I2C_SDA"
|
||||
PIN 15: "I2C_SCL"
|
||||
PIN 16: "I2S2_IN"
|
||||
PIN 17: "I2S3_IN"
|
||||
PIN 18: "I2S4_IN"
|
||||
PIN 19: "I2S2_OUT"
|
||||
PIN 20: "I2S3_OUT"
|
||||
PIN 21: "I2S4_OUT"
|
||||
PIN 22: "GPIO_B"
|
||||
PIN 23: "MDC"
|
||||
PIN 24: "MDIO"
|
||||
PIN 25: "G2_TXD0"
|
||||
PIN 26: "G2_TXD1"
|
||||
PIN 27: "G2_TXD2"
|
||||
PIN 28: "G2_TXD3"
|
||||
PIN 29: "G2_TXEN"
|
||||
PIN 30: "G2_TXC"
|
||||
PIN 31: "G2_RXD0"
|
||||
PIN 32: "G2_RXD1"
|
||||
PIN 33: "G2_RXD2"
|
||||
PIN 34: "G2_RXD3"
|
||||
PIN 35: "G2_RXDV"
|
||||
PIN 36: "G2_RXC"
|
||||
PIN 37: "NCEB"
|
||||
PIN 38: "NWEB"
|
||||
PIN 39: "NREB"
|
||||
PIN 40: "NDL4"
|
||||
PIN 41: "NDL5"
|
||||
PIN 42: "NDL6"
|
||||
PIN 43: "NDL7"
|
||||
PIN 44: "NRB"
|
||||
PIN 45: "NCLE"
|
||||
PIN 46: "NALE"
|
||||
PIN 47: "NDL0"
|
||||
PIN 48: "NDL1"
|
||||
PIN 49: "NDL2"
|
||||
PIN 50: "NDL3"
|
||||
PIN 51: "MDI_TP_P0"
|
||||
PIN 52: "MDI_TN_P0"
|
||||
PIN 53: "MDI_RP_P0"
|
||||
PIN 54: "MDI_RN_P0"
|
||||
PIN 55: "MDI_TP_P1"
|
||||
PIN 56: "MDI_TN_P1"
|
||||
PIN 57: "MDI_RP_P1"
|
||||
PIN 58: "MDI_RN_P1"
|
||||
PIN 59: "MDI_RP_P2"
|
||||
PIN 60: "MDI_RN_P2"
|
||||
PIN 61: "MDI_TP_P2"
|
||||
PIN 62: "MDI_TN_P2"
|
||||
PIN 63: "MDI_TP_P3"
|
||||
PIN 64: "MDI_TN_P3"
|
||||
PIN 65: "MDI_RP_P3"
|
||||
PIN 66: "MDI_RN_P3"
|
||||
PIN 67: "MDI_RP_P4"
|
||||
PIN 68: "MDI_RN_P4"
|
||||
PIN 69: "MDI_TP_P4"
|
||||
PIN 70: "MDI_TN_P4"
|
||||
PIN 71: "PMIC_SCL"
|
||||
PIN 72: "PMIC_SDA"
|
||||
PIN 73: "SPIC1_CLK"
|
||||
PIN 74: "SPIC1_MOSI"
|
||||
PIN 75: "SPIC1_MISO"
|
||||
PIN 76: "SPIC1_CS"
|
||||
PIN 77: "GPIO_D"
|
||||
PIN 78: "WATCHDOG"
|
||||
PIN 79: "RTS3_N"
|
||||
PIN 80: "CTS3_N"
|
||||
PIN 81: "TXD3"
|
||||
PIN 82: "RXD3"
|
||||
PIN 83: "PERST0_N"
|
||||
PIN 84: "PERST1_N"
|
||||
PIN 85: "WLED_N"
|
||||
PIN 86: "EPHY_LED0_N"
|
||||
PIN 87: "AUXIN0"
|
||||
PIN 88: "AUXIN1"
|
||||
PIN 89: "AUXIN2"
|
||||
PIN 90: "AUXIN3"
|
||||
PIN 91: "TXD4"
|
||||
PIN 92: "RXD4"
|
||||
PIN 93: "RTS4_N"
|
||||
PIN 94: "CST4_N"
|
||||
PIN 95: "PWM1"
|
||||
PIN 96: "PWM2"
|
||||
PIN 97: "PWM3"
|
||||
PIN 98: "PWM4"
|
||||
PIN 99: "PWM5"
|
||||
PIN 100: "PWM6"
|
||||
PIN 101: "PWM7"
|
||||
PIN 102: "GPIO_E"
|
||||
|
||||
Valid values for function are:
|
||||
"emmc", "eth", "i2c", "i2s", "ir", "led", "flash", "pcie",
|
||||
"pmic", "pwm", "sd", "spi", "tdm", "uart", "watchdog"
|
||||
|
||||
Valid values for groups are:
|
||||
additional data is put followingly with valid value allowing us to know which
|
||||
applicable function and which relevant pins (in pin#) are able applied for that
|
||||
group.
|
||||
|
||||
Valid value function pins (in pin#)
|
||||
-------------------------------------------------------------------------
|
||||
"emmc" "emmc" 40, 41, 42, 43, 44, 45,
|
||||
47, 48, 49, 50
|
||||
"emmc_rst" "emmc" 37
|
||||
"esw" "eth" 51, 52, 53, 54, 55, 56,
|
||||
57, 58, 59, 60, 61, 62,
|
||||
63, 64, 65, 66, 67, 68,
|
||||
69, 70
|
||||
"esw_p0_p1" "eth" 51, 52, 53, 54, 55, 56,
|
||||
57, 58
|
||||
"esw_p2_p3_p4" "eth" 59, 60, 61, 62, 63, 64,
|
||||
65, 66, 67, 68, 69, 70
|
||||
"rgmii_via_esw" "eth" 59, 60, 61, 62, 63, 64,
|
||||
65, 66, 67, 68, 69, 70
|
||||
"rgmii_via_gmac1" "eth" 59, 60, 61, 62, 63, 64,
|
||||
65, 66, 67, 68, 69, 70
|
||||
"rgmii_via_gmac2" "eth" 25, 26, 27, 28, 29, 30,
|
||||
31, 32, 33, 34, 35, 36
|
||||
"mdc_mdio" "eth" 23, 24
|
||||
"i2c0" "i2c" 14, 15
|
||||
"i2c1_0" "i2c" 55, 56
|
||||
"i2c1_1" "i2c" 73, 74
|
||||
"i2c1_2" "i2c" 87, 88
|
||||
"i2c2_0" "i2c" 57, 58
|
||||
"i2c2_1" "i2c" 75, 76
|
||||
"i2c2_2" "i2c" 89, 90
|
||||
"i2s_in_mclk_bclk_ws" "i2s" 3, 4, 5
|
||||
"i2s1_in_data" "i2s" 1
|
||||
"i2s2_in_data" "i2s" 16
|
||||
"i2s3_in_data" "i2s" 17
|
||||
"i2s4_in_data" "i2s" 18
|
||||
"i2s_out_mclk_bclk_ws" "i2s" 3, 4, 5
|
||||
"i2s1_out_data" "i2s" 2
|
||||
"i2s2_out_data" "i2s" 19
|
||||
"i2s3_out_data" "i2s" 20
|
||||
"i2s4_out_data" "i2s" 21
|
||||
"ir_0_tx" "ir" 16
|
||||
"ir_1_tx" "ir" 59
|
||||
"ir_2_tx" "ir" 99
|
||||
"ir_0_rx" "ir" 17
|
||||
"ir_1_rx" "ir" 60
|
||||
"ir_2_rx" "ir" 100
|
||||
"ephy_leds" "led" 86, 91, 92, 93, 94
|
||||
"ephy0_led" "led" 86
|
||||
"ephy1_led" "led" 91
|
||||
"ephy2_led" "led" 92
|
||||
"ephy3_led" "led" 93
|
||||
"ephy4_led" "led" 94
|
||||
"wled" "led" 85
|
||||
"par_nand" "flash" 37, 38, 39, 40, 41, 42,
|
||||
43, 44, 45, 46, 47, 48,
|
||||
49, 50
|
||||
"snfi" "flash" 8, 9, 10, 11, 12, 13
|
||||
"spi_nor" "flash" 8, 9, 10, 11, 12, 13
|
||||
"pcie0_0_waken" "pcie" 14
|
||||
"pcie0_1_waken" "pcie" 79
|
||||
"pcie1_0_waken" "pcie" 14
|
||||
"pcie0_0_clkreq" "pcie" 15
|
||||
"pcie0_1_clkreq" "pcie" 80
|
||||
"pcie1_0_clkreq" "pcie" 15
|
||||
"pcie0_pad_perst" "pcie" 83
|
||||
"pcie1_pad_perst" "pcie" 84
|
||||
"pmic_bus" "pmic" 71, 72
|
||||
"pwm_ch1_0" "pwm" 51
|
||||
"pwm_ch1_1" "pwm" 73
|
||||
"pwm_ch1_2" "pwm" 95
|
||||
"pwm_ch2_0" "pwm" 52
|
||||
"pwm_ch2_1" "pwm" 74
|
||||
"pwm_ch2_2" "pwm" 96
|
||||
"pwm_ch3_0" "pwm" 53
|
||||
"pwm_ch3_1" "pwm" 75
|
||||
"pwm_ch3_2" "pwm" 97
|
||||
"pwm_ch4_0" "pwm" 54
|
||||
"pwm_ch4_1" "pwm" 67
|
||||
"pwm_ch4_2" "pwm" 76
|
||||
"pwm_ch4_3" "pwm" 98
|
||||
"pwm_ch5_0" "pwm" 68
|
||||
"pwm_ch5_1" "pwm" 77
|
||||
"pwm_ch5_2" "pwm" 99
|
||||
"pwm_ch6_0" "pwm" 69
|
||||
"pwm_ch6_1" "pwm" 78
|
||||
"pwm_ch6_2" "pwm" 81
|
||||
"pwm_ch6_3" "pwm" 100
|
||||
"pwm_ch7_0" "pwm" 70
|
||||
"pwm_ch7_1" "pwm" 82
|
||||
"pwm_ch7_2" "pwm" 101
|
||||
"sd_0" "sd" 16, 17, 18, 19, 20, 21
|
||||
"sd_1" "sd" 25, 26, 27, 28, 29, 30
|
||||
"spic0_0" "spi" 63, 64, 65, 66
|
||||
"spic0_1" "spi" 79, 80, 81, 82
|
||||
"spic1_0" "spi" 67, 68, 69, 70
|
||||
"spic1_1" "spi" 73, 74, 75, 76
|
||||
"spic2_0_wp_hold" "spi" 8, 9
|
||||
"spic2_0" "spi" 10, 11, 12, 13
|
||||
"tdm_0_out_mclk_bclk_ws" "tdm" 8, 9, 10
|
||||
"tdm_0_in_mclk_bclk_ws" "tdm" 11, 12, 13
|
||||
"tdm_0_out_data" "tdm" 20
|
||||
"tdm_0_in_data" "tdm" 21
|
||||
"tdm_1_out_mclk_bclk_ws" "tdm" 57, 58, 59
|
||||
"tdm_1_in_mclk_bclk_ws" "tdm" 60, 61, 62
|
||||
"tdm_1_out_data" "tdm" 55
|
||||
"tdm_1_in_data" "tdm" 56
|
||||
"uart0_0_tx_rx" "uart" 6, 7
|
||||
"uart1_0_tx_rx" "uart" 55, 56
|
||||
"uart1_0_rts_cts" "uart" 57, 58
|
||||
"uart1_1_tx_rx" "uart" 73, 74
|
||||
"uart1_1_rts_cts" "uart" 75, 76
|
||||
"uart2_0_tx_rx" "uart" 3, 4
|
||||
"uart2_0_rts_cts" "uart" 1, 2
|
||||
"uart2_1_tx_rx" "uart" 51, 52
|
||||
"uart2_1_rts_cts" "uart" 53, 54
|
||||
"uart2_2_tx_rx" "uart" 59, 60
|
||||
"uart2_2_rts_cts" "uart" 61, 62
|
||||
"uart2_3_tx_rx" "uart" 95, 96
|
||||
"uart3_0_tx_rx" "uart" 57, 58
|
||||
"uart3_1_tx_rx" "uart" 81, 82
|
||||
"uart3_1_rts_cts" "uart" 79, 80
|
||||
"uart4_0_tx_rx" "uart" 61, 62
|
||||
"uart4_1_tx_rx" "uart" 91, 92
|
||||
"uart4_1_rts_cts" "uart" 93, 94
|
||||
"uart4_2_tx_rx" "uart" 97, 98
|
||||
"uart4_2_rts_cts" "uart" 95, 96
|
||||
"watchdog" "watchdog" 78
|
||||
|
||||
Example:
|
||||
|
||||
pio: pinctrl@10211000 {
|
||||
compatible = "mediatek,mt7622-pinctrl";
|
||||
reg = <0 0x10211000 0 0x1000>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
|
||||
pinctrl_eth_default: eth-default {
|
||||
mux-mdio {
|
||||
groups = "mdc_mdio";
|
||||
function = "eth";
|
||||
drive-strength = <12>;
|
||||
};
|
||||
|
||||
mux-gmac2 {
|
||||
groups = "gmac2";
|
||||
function = "eth";
|
||||
drive-strength = <12>;
|
||||
};
|
||||
|
||||
mux-esw {
|
||||
groups = "esw";
|
||||
function = "eth";
|
||||
drive-strength = <8>;
|
||||
};
|
||||
|
||||
conf-mdio {
|
||||
pins = "MDC";
|
||||
bias-pull-up;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,193 @@
|
||||
Qualcomm MSM8998 TLMM block
|
||||
|
||||
This binding describes the Top Level Mode Multiplexer block found in the
|
||||
MSM8998 platform.
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be "qcom,msm8998-pinctrl"
|
||||
|
||||
- reg:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: the base address and size of the TLMM register space.
|
||||
|
||||
- interrupts:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: should specify the TLMM summary IRQ.
|
||||
|
||||
- interrupt-controller:
|
||||
Usage: required
|
||||
Value type: <none>
|
||||
Definition: identifies this node as an interrupt controller
|
||||
|
||||
- #interrupt-cells:
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be 2. Specifying the pin number and flags, as defined
|
||||
in <dt-bindings/interrupt-controller/irq.h>
|
||||
|
||||
- gpio-controller:
|
||||
Usage: required
|
||||
Value type: <none>
|
||||
Definition: identifies this node as a gpio controller
|
||||
|
||||
- #gpio-cells:
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be 2. Specifying the pin number and flags, as defined
|
||||
in <dt-bindings/gpio/gpio.h>
|
||||
|
||||
Please refer to ../gpio/gpio.txt and ../interrupt-controller/interrupts.txt for
|
||||
a general description of GPIO and interrupt bindings.
|
||||
|
||||
Please refer to pinctrl-bindings.txt in this directory for details of the
|
||||
common pinctrl bindings used by client devices, including the meaning of the
|
||||
phrase "pin configuration node".
|
||||
|
||||
The pin configuration nodes act as a container for an arbitrary number of
|
||||
subnodes. Each of these subnodes represents some desired configuration for a
|
||||
pin, a group, or a list of pins or groups. This configuration can include the
|
||||
mux function to select on those pin(s)/group(s), and various pin configuration
|
||||
parameters, such as pull-up, drive strength, etc.
|
||||
|
||||
|
||||
PIN CONFIGURATION NODES:
|
||||
|
||||
The name of each subnode is not important; all subnodes should be enumerated
|
||||
and processed purely based on their content.
|
||||
|
||||
Each subnode only affects those parameters that are explicitly listed. In
|
||||
other words, a subnode that lists a mux function but no pin configuration
|
||||
parameters implies no information about any pin configuration parameters.
|
||||
Similarly, a pin subnode that describes a pullup parameter implies no
|
||||
information about e.g. the mux function.
|
||||
|
||||
|
||||
The following generic properties as defined in pinctrl-bindings.txt are valid
|
||||
to specify in a pin configuration subnode:
|
||||
|
||||
- pins:
|
||||
Usage: required
|
||||
Value type: <string-array>
|
||||
Definition: List of gpio pins affected by the properties specified in
|
||||
this subnode.
|
||||
|
||||
Valid pins are:
|
||||
gpio0-gpio149
|
||||
Supports mux, bias and drive-strength
|
||||
|
||||
sdc2_clk, sdc2_cmd, sdc2_data
|
||||
Supports bias and drive-strength
|
||||
|
||||
ufs_reset
|
||||
Supports bias and drive-strength
|
||||
|
||||
- function:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: Specify the alternative function to be configured for the
|
||||
specified pins. Functions are only valid for gpio pins.
|
||||
Valid values are:
|
||||
|
||||
gpio, adsp_ext, agera_pll, atest_char, atest_gpsadc0,
|
||||
atest_gpsadc1, atest_tsens, atest_tsens2, atest_usb1,
|
||||
atest_usb10, atest_usb11, atest_usb12, atest_usb13,
|
||||
audio_ref, bimc_dte0, bimc_dte1, blsp10_spi, blsp10_spi_a,
|
||||
blsp10_spi_b, blsp11_i2c, blsp1_spi, blsp1_spi_a,
|
||||
blsp1_spi_b, blsp2_spi, blsp9_spi, blsp_i2c1, blsp_i2c2,
|
||||
blsp_i2c3, blsp_i2c4, blsp_i2c5, blsp_i2c6, blsp_i2c7,
|
||||
blsp_i2c8, blsp_i2c9, blsp_i2c10, blsp_i2c11, blsp_i2c12,
|
||||
blsp_spi1, blsp_spi2, blsp_spi3, blsp_spi4, blsp_spi5,
|
||||
blsp_spi6, blsp_spi7, blsp_spi8, blsp_spi9, blsp_spi10,
|
||||
blsp_spi11, blsp_spi12, blsp_uart1_a, blsp_uart1_b,
|
||||
blsp_uart2_a, blsp_uart2_b, blsp_uart3_a, blsp_uart3_b,
|
||||
blsp_uart7_a, blsp_uart7_b, blsp_uart8, blsp_uart8_a,
|
||||
blsp_uart8_b, blsp_uart9_a, blsp_uart9_b, blsp_uim1_a,
|
||||
blsp_uim1_b, blsp_uim2_a, blsp_uim2_b, blsp_uim3_a,
|
||||
blsp_uim3_b, blsp_uim7_a, blsp_uim7_b, blsp_uim8_a,
|
||||
blsp_uim8_b, blsp_uim9_a, blsp_uim9_b, bt_reset,
|
||||
btfm_slimbus, cam_mclk, cci_async, cci_i2c, cci_timer0,
|
||||
cci_timer1, cci_timer2, cci_timer3, cci_timer4, cri_trng,
|
||||
cri_trng0, cri_trng1, dbg_out, ddr_bist, edp_hot, edp_lcd,
|
||||
gcc_gp1_a, gcc_gp1_b, gcc_gp2_a, gcc_gp2_b, gcc_gp3_a,
|
||||
gcc_gp3_b, hdmi_cec, hdmi_ddc, hdmi_hot, hdmi_rcv,
|
||||
isense_dbg, jitter_bist, ldo_en, ldo_update, lpass_slimbus,
|
||||
m_voc, mdp_vsync, mdp_vsync0, mdp_vsync1, mdp_vsync2,
|
||||
mdp_vsync3, mdp_vsync_a, mdp_vsync_b, modem_tsync, mss_lte,
|
||||
nav_dr, nav_pps, pa_indicator, pci_e0, phase_flag,
|
||||
pll_bypassnl, pll_reset, pri_mi2s, pri_mi2s_ws, prng_rosc,
|
||||
pwr_crypto, pwr_modem, pwr_nav, qdss_cti0_a, qdss_cti0_b,
|
||||
qdss_cti1_a, qdss_cti1_b, qdss, qlink_enable,
|
||||
qlink_request, qua_mi2s, sd_card, sd_write, sdc40, sdc41,
|
||||
sdc42, sdc43, sdc4_clk, sdc4_cmd, sec_mi2s, sp_cmu,
|
||||
spkr_i2s, ssbi1, ssc_irq, ter_mi2s, tgu_ch0, tgu_ch1,
|
||||
tsense_pwm1, tsense_pwm2, tsif1_clk, tsif1_data, tsif1_en,
|
||||
tsif1_error, tsif1_sync, tsif2_clk, tsif2_data, tsif2_en,
|
||||
tsif2_error, tsif2_sync, uim1_clk, uim1_data, uim1_present,
|
||||
uim1_reset, uim2_clk, uim2_data, uim2_present, uim2_reset,
|
||||
uim_batt, usb_phy, vfr_1, vsense_clkout, vsense_data0,
|
||||
vsense_data1, vsense_mode, wlan1_adc0, wlan1_adc1,
|
||||
wlan2_adc0, wlan2_adc1,
|
||||
|
||||
- bias-disable:
|
||||
Usage: optional
|
||||
Value type: <none>
|
||||
Definition: The specified pins should be configued as no pull.
|
||||
|
||||
- bias-pull-down:
|
||||
Usage: optional
|
||||
Value type: <none>
|
||||
Definition: The specified pins should be configued as pull down.
|
||||
|
||||
- bias-pull-up:
|
||||
Usage: optional
|
||||
Value type: <none>
|
||||
Definition: The specified pins should be configued as pull up.
|
||||
|
||||
- output-high:
|
||||
Usage: optional
|
||||
Value type: <none>
|
||||
Definition: The specified pins are configured in output mode, driven
|
||||
high.
|
||||
Not valid for sdc pins.
|
||||
|
||||
- output-low:
|
||||
Usage: optional
|
||||
Value type: <none>
|
||||
Definition: The specified pins are configured in output mode, driven
|
||||
low.
|
||||
Not valid for sdc pins.
|
||||
|
||||
- drive-strength:
|
||||
Usage: optional
|
||||
Value type: <u32>
|
||||
Definition: Selects the drive strength for the specified pins, in mA.
|
||||
Valid values are: 2, 4, 6, 8, 10, 12, 14 and 16
|
||||
|
||||
Example:
|
||||
|
||||
tlmm: pinctrl@03400000 {
|
||||
compatible = "qcom,msm8998-pinctrl";
|
||||
reg = <0x03400000 0xc00000>;
|
||||
interrupts = <0 208 0>;
|
||||
gpio-controller;
|
||||
#gpio-cells = <2>;
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <2>;
|
||||
|
||||
uart_console_active: uart_console_active {
|
||||
mux {
|
||||
pins = "gpio4", "gpio5";
|
||||
function = "blsp_uart8_a";
|
||||
};
|
||||
|
||||
config {
|
||||
pins = "gpio4", "gpio5";
|
||||
drive-strength = <2>;
|
||||
bias-disable;
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -24,6 +24,7 @@ Required Properties:
|
||||
- "renesas,pfc-r8a7794": for R8A7794 (R-Car E2) compatible pin-controller.
|
||||
- "renesas,pfc-r8a7795": for R8A7795 (R-Car H3) compatible pin-controller.
|
||||
- "renesas,pfc-r8a7796": for R8A7796 (R-Car M3-W) compatible pin-controller.
|
||||
- "renesas,pfc-r8a77970": for R8A77970 (R-Car V3M) compatible pin-controller.
|
||||
- "renesas,pfc-r8a77995": for R8A77995 (R-Car D3) compatible pin-controller.
|
||||
- "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller.
|
||||
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
UniPhier SoCs pin controller
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of the following:
|
||||
"socionext,uniphier-ld4-pinctrl" - for LD4 SoC
|
||||
"socionext,uniphier-pro4-pinctrl" - for Pro4 SoC
|
||||
"socionext,uniphier-sld8-pinctrl" - for sLD8 SoC
|
||||
"socionext,uniphier-pro5-pinctrl" - for Pro5 SoC
|
||||
"socionext,uniphier-pxs2-pinctrl" - for PXs2 SoC
|
||||
"socionext,uniphier-ld6b-pinctrl" - for LD6b SoC
|
||||
"socionext,uniphier-ld11-pinctrl" - for LD11 SoC
|
||||
"socionext,uniphier-ld20-pinctrl" - for LD20 SoC
|
||||
"socionext,uniphier-pxs3-pinctrl" - for PXs3 SoC
|
||||
|
||||
Note:
|
||||
The UniPhier pinctrl should be a subnode of a "syscon" compatible node.
|
||||
|
||||
Example:
|
||||
soc-glue@5f800000 {
|
||||
compatible = "socionext,uniphier-pro4-soc-glue",
|
||||
"simple-mfd", "syscon";
|
||||
reg = <0x5f800000 0x2000>;
|
||||
|
||||
pinctrl: pinctrl {
|
||||
compatible = "socionext,uniphier-pro4-pinctrl";
|
||||
};
|
||||
};
|
||||
@@ -12,6 +12,8 @@ Required properies:
|
||||
"st,stm32f469-pinctrl"
|
||||
"st,stm32f746-pinctrl"
|
||||
"st,stm32h743-pinctrl"
|
||||
"st,stm32mp157-pinctrl"
|
||||
"st,stm32mp157-z-pinctrl"
|
||||
- #address-cells: The value of this property must be 1
|
||||
- #size-cells : The value of this property must be 1
|
||||
- ranges : defines mapping between pin controller node (parent) to
|
||||
|
||||
+11
@@ -2086,6 +2086,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-uniphier.git
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/gpio/gpio-uniphier.txt
|
||||
F: Documentation/devicetree/bindings/pinctrl/socionext,uniphier-pinctrl.txt
|
||||
F: arch/arm/boot/dts/uniphier*
|
||||
F: arch/arm/include/asm/hardware/cache-uniphier.h
|
||||
F: arch/arm/mach-uniphier/
|
||||
@@ -10875,6 +10876,16 @@ M: Heikki Krogerus <heikki.krogerus@linux.intel.com>
|
||||
S: Maintained
|
||||
F: drivers/pinctrl/intel/
|
||||
|
||||
PIN CONTROLLER - MEDIATEK
|
||||
M: Sean Wang <sean.wang@mediatek.com>
|
||||
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/pinctrl/pinctrl-mt65xx.txt
|
||||
F: Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt
|
||||
F: drivers/pinctrl/mediatek/pinctrl-mtk-common.*
|
||||
F: drivers/pinctrl/mediatek/pinctrl-mt2701.c
|
||||
F: drivers/pinctrl/mediatek/pinctrl-mt7622.c
|
||||
|
||||
PIN CONTROLLER - QUALCOMM
|
||||
M: Bjorn Andersson <bjorn.andersson@linaro.org>
|
||||
S: Maintained
|
||||
|
||||
@@ -505,4 +505,4 @@ module_platform_driver(uniphier_gpio_driver);
|
||||
|
||||
MODULE_AUTHOR("Masahiro Yamada <yamada.masahiro@socionext.com>");
|
||||
MODULE_DESCRIPTION("UniPhier GPIO driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
@@ -58,58 +58,6 @@ static int acpi_gpiochip_find(struct gpio_chip *gc, void *data)
|
||||
return ACPI_HANDLE(gc->parent) == data;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PINCTRL
|
||||
/**
|
||||
* acpi_gpiochip_pin_to_gpio_offset() - translates ACPI GPIO to Linux GPIO
|
||||
* @gdev: GPIO device
|
||||
* @pin: ACPI GPIO pin number from GpioIo/GpioInt resource
|
||||
*
|
||||
* Function takes ACPI GpioIo/GpioInt pin number as a parameter and
|
||||
* translates it to a corresponding offset suitable to be passed to a
|
||||
* GPIO controller driver.
|
||||
*
|
||||
* Typically the returned offset is same as @pin, but if the GPIO
|
||||
* controller uses pin controller and the mapping is not contiguous the
|
||||
* offset might be different.
|
||||
*/
|
||||
static int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev, int pin)
|
||||
{
|
||||
struct gpio_pin_range *pin_range;
|
||||
|
||||
/* If there are no ranges in this chip, use 1:1 mapping */
|
||||
if (list_empty(&gdev->pin_ranges))
|
||||
return pin;
|
||||
|
||||
list_for_each_entry(pin_range, &gdev->pin_ranges, node) {
|
||||
const struct pinctrl_gpio_range *range = &pin_range->range;
|
||||
int i;
|
||||
|
||||
if (range->pins) {
|
||||
for (i = 0; i < range->npins; i++) {
|
||||
if (range->pins[i] == pin)
|
||||
return range->base + i - gdev->base;
|
||||
}
|
||||
} else {
|
||||
if (pin >= range->pin_base &&
|
||||
pin < range->pin_base + range->npins) {
|
||||
unsigned gpio_base;
|
||||
|
||||
gpio_base = range->base - gdev->base;
|
||||
return gpio_base + pin - range->pin_base;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
#else
|
||||
static inline int acpi_gpiochip_pin_to_gpio_offset(struct gpio_device *gdev,
|
||||
int pin)
|
||||
{
|
||||
return pin;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* acpi_get_gpiod() - Translate ACPI GPIO pin to GPIO descriptor usable with GPIO API
|
||||
* @path: ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
|
||||
@@ -125,7 +73,6 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
|
||||
struct gpio_chip *chip;
|
||||
acpi_handle handle;
|
||||
acpi_status status;
|
||||
int offset;
|
||||
|
||||
status = acpi_get_handle(NULL, path, &handle);
|
||||
if (ACPI_FAILURE(status))
|
||||
@@ -135,11 +82,7 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
|
||||
if (!chip)
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
|
||||
offset = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
|
||||
if (offset < 0)
|
||||
return ERR_PTR(offset);
|
||||
|
||||
return gpiochip_get_desc(chip, offset);
|
||||
return gpiochip_get_desc(chip, pin);
|
||||
}
|
||||
|
||||
static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
|
||||
@@ -216,10 +159,6 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
|
||||
if (!handler)
|
||||
return AE_OK;
|
||||
|
||||
pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
|
||||
if (pin < 0)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
||||
desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
|
||||
if (IS_ERR(desc)) {
|
||||
dev_err(chip->parent, "Failed to request GPIO\n");
|
||||
@@ -871,12 +810,6 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
|
||||
struct gpio_desc *desc;
|
||||
bool found;
|
||||
|
||||
pin = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, pin);
|
||||
if (pin < 0) {
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&achip->conn_lock);
|
||||
|
||||
found = false;
|
||||
@@ -1009,11 +942,7 @@ static struct gpio_desc *acpi_gpiochip_parse_own_gpio(
|
||||
if (ret < 0)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ret = acpi_gpiochip_pin_to_gpio_offset(chip->gpiodev, gpios[0]);
|
||||
if (ret < 0)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
desc = gpiochip_get_desc(chip, ret);
|
||||
desc = gpiochip_get_desc(chip, gpios[0]);
|
||||
if (IS_ERR(desc))
|
||||
return desc;
|
||||
|
||||
|
||||
@@ -66,6 +66,10 @@ config PINCTRL_AS3722
|
||||
config PINCTRL_AXP209
|
||||
tristate "X-Powers AXP209 PMIC pinctrl and GPIO Support"
|
||||
depends on MFD_AXP20X
|
||||
depends on OF
|
||||
select PINMUX
|
||||
select GENERIC_PINCONF
|
||||
select GPIOLIB
|
||||
help
|
||||
AXP PMICs provides multiple GPIOs that can be muxed for different
|
||||
functions. This driver bundles a pinctrl driver to select the function
|
||||
@@ -353,6 +357,17 @@ config PINCTRL_RK805
|
||||
help
|
||||
This selects the pinctrl driver for RK805.
|
||||
|
||||
config PINCTRL_OCELOT
|
||||
bool "Pinctrl driver for the Microsemi Ocelot SoCs"
|
||||
default y
|
||||
depends on OF
|
||||
depends on MSCC_OCELOT || COMPILE_TEST
|
||||
select GPIOLIB
|
||||
select GENERIC_PINCONF
|
||||
select GENERIC_PINCTRL_GROUPS
|
||||
select GENERIC_PINMUX_FUNCTIONS
|
||||
select REGMAP_MMIO
|
||||
|
||||
source "drivers/pinctrl/aspeed/Kconfig"
|
||||
source "drivers/pinctrl/bcm/Kconfig"
|
||||
source "drivers/pinctrl/berlin/Kconfig"
|
||||
|
||||
@@ -46,6 +46,7 @@ obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o
|
||||
obj-$(CONFIG_PINCTRL_ZYNQ) += pinctrl-zynq.o
|
||||
obj-$(CONFIG_PINCTRL_INGENIC) += pinctrl-ingenic.o
|
||||
obj-$(CONFIG_PINCTRL_RK805) += pinctrl-rk805.o
|
||||
obj-$(CONFIG_PINCTRL_OCELOT) += pinctrl-ocelot.o
|
||||
|
||||
obj-$(CONFIG_ARCH_ASPEED) += aspeed/
|
||||
obj-y += bcm/
|
||||
@@ -65,5 +66,5 @@ obj-$(CONFIG_PINCTRL_SUNXI) += sunxi/
|
||||
obj-y += ti/
|
||||
obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
|
||||
obj-$(CONFIG_ARCH_VT8500) += vt8500/
|
||||
obj-$(CONFIG_PINCTRL_MTK) += mediatek/
|
||||
obj-y += mediatek/
|
||||
obj-$(CONFIG_PINCTRL_ZX) += zte/
|
||||
|
||||
+17
-7
@@ -1189,19 +1189,16 @@ struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
|
||||
EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
|
||||
|
||||
/**
|
||||
* pinctrl_select_state() - select/activate/program a pinctrl state to HW
|
||||
* pinctrl_commit_state() - select/activate/program a pinctrl state to HW
|
||||
* @p: the pinctrl handle for the device that requests configuration
|
||||
* @state: the state handle to select/activate/program
|
||||
*/
|
||||
int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
|
||||
static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
|
||||
{
|
||||
struct pinctrl_setting *setting, *setting2;
|
||||
struct pinctrl_state *old_state = p->state;
|
||||
int ret;
|
||||
|
||||
if (p->state == state)
|
||||
return 0;
|
||||
|
||||
if (p->state) {
|
||||
/*
|
||||
* For each pinmux setting in the old state, forget SW's record
|
||||
@@ -1265,6 +1262,19 @@ unapply_new_state:
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* pinctrl_select_state() - select/activate/program a pinctrl state to HW
|
||||
* @p: the pinctrl handle for the device that requests configuration
|
||||
* @state: the state handle to select/activate/program
|
||||
*/
|
||||
int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
|
||||
{
|
||||
if (p->state == state)
|
||||
return 0;
|
||||
|
||||
return pinctrl_commit_state(p, state);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pinctrl_select_state);
|
||||
|
||||
static void devm_pinctrl_release(struct device *dev, void *res)
|
||||
@@ -1430,7 +1440,7 @@ void pinctrl_unregister_map(const struct pinctrl_map *map)
|
||||
int pinctrl_force_sleep(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_sleep))
|
||||
return pinctrl_select_state(pctldev->p, pctldev->hog_sleep);
|
||||
return pinctrl_commit_state(pctldev->p, pctldev->hog_sleep);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
|
||||
@@ -1442,7 +1452,7 @@ EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
|
||||
int pinctrl_force_default(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_default))
|
||||
return pinctrl_select_state(pctldev->p, pctldev->hog_default);
|
||||
return pinctrl_commit_state(pctldev->p, pctldev->hog_default);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pinctrl_force_default);
|
||||
|
||||
@@ -62,7 +62,6 @@ static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
|
||||
struct pinctrl_map **map, unsigned *num_maps)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct group_desc *grp;
|
||||
struct pinctrl_map *new_map;
|
||||
struct device_node *parent;
|
||||
@@ -75,7 +74,7 @@ static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
|
||||
*/
|
||||
grp = imx_pinctrl_find_group_by_name(pctldev, np->name);
|
||||
if (!grp) {
|
||||
dev_err(info->dev, "unable to find group for node %s\n",
|
||||
dev_err(ipctl->dev, "unable to find group for node %s\n",
|
||||
np->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -146,7 +145,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
unsigned group)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg;
|
||||
unsigned int npins, pin_id;
|
||||
int i;
|
||||
@@ -174,7 +173,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
struct imx_pin *pin = &((struct imx_pin *)(grp->data))[i];
|
||||
|
||||
pin_id = pin->pin;
|
||||
pin_reg = &info->pin_regs[pin_id];
|
||||
pin_reg = &ipctl->pin_regs[pin_id];
|
||||
|
||||
if (pin_reg->mux_reg == -1) {
|
||||
dev_dbg(ipctl->dev, "Pin(%s) does not support mux function\n",
|
||||
@@ -255,8 +254,8 @@ static u32 imx_pinconf_decode_generic_config(struct imx_pinctrl *ipctl,
|
||||
unsigned long *configs,
|
||||
unsigned int num_configs)
|
||||
{
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
struct imx_cfg_params_decode *decode;
|
||||
const struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_cfg_params_decode *decode;
|
||||
enum pin_config_param param;
|
||||
u32 raw_config = 0;
|
||||
u32 param_val;
|
||||
@@ -289,7 +288,7 @@ static u32 imx_pinconf_decode_generic_config(struct imx_pinctrl *ipctl,
|
||||
static u32 imx_pinconf_parse_generic_config(struct device_node *np,
|
||||
struct imx_pinctrl *ipctl)
|
||||
{
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
struct pinctrl_dev *pctl = ipctl->pctl;
|
||||
unsigned int num_configs;
|
||||
unsigned long *configs;
|
||||
@@ -310,11 +309,11 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev,
|
||||
unsigned pin_id, unsigned long *config)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
|
||||
const struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg = &ipctl->pin_regs[pin_id];
|
||||
|
||||
if (pin_reg->conf_reg == -1) {
|
||||
dev_err(info->dev, "Pin(%s) does not support config function\n",
|
||||
dev_err(ipctl->dev, "Pin(%s) does not support config function\n",
|
||||
info->pins[pin_id].name);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -332,12 +331,12 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev,
|
||||
unsigned num_configs)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
|
||||
const struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg = &ipctl->pin_regs[pin_id];
|
||||
int i;
|
||||
|
||||
if (pin_reg->conf_reg == -1) {
|
||||
dev_err(info->dev, "Pin(%s) does not support config function\n",
|
||||
dev_err(ipctl->dev, "Pin(%s) does not support config function\n",
|
||||
info->pins[pin_id].name);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -368,8 +367,7 @@ static void imx_pinconf_dbg_show(struct pinctrl_dev *pctldev,
|
||||
struct seq_file *s, unsigned pin_id)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
|
||||
const struct imx_pin_reg *pin_reg = &ipctl->pin_regs[pin_id];
|
||||
unsigned long config;
|
||||
|
||||
if (!pin_reg || pin_reg->conf_reg == -1) {
|
||||
@@ -427,13 +425,13 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
struct imx_pinctrl *ipctl,
|
||||
u32 index)
|
||||
{
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
int size, pin_size;
|
||||
const __be32 *list;
|
||||
int i;
|
||||
u32 config;
|
||||
|
||||
dev_dbg(info->dev, "group(%d): %s\n", index, np->name);
|
||||
dev_dbg(ipctl->dev, "group(%d): %s\n", index, np->name);
|
||||
|
||||
if (info->flags & SHARE_MUX_CONF_REG)
|
||||
pin_size = SHARE_FSL_PIN_SIZE;
|
||||
@@ -460,7 +458,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
if (!list) {
|
||||
list = of_get_property(np, "pinmux", &size);
|
||||
if (!list) {
|
||||
dev_err(info->dev,
|
||||
dev_err(ipctl->dev,
|
||||
"no fsl,pins and pins property in node %pOF\n", np);
|
||||
return -EINVAL;
|
||||
}
|
||||
@@ -468,7 +466,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
|
||||
/* we do not check return since it's safe node passed down */
|
||||
if (!size || size % pin_size) {
|
||||
dev_err(info->dev, "Invalid fsl,pins or pins property in node %pOF\n", np);
|
||||
dev_err(ipctl->dev, "Invalid fsl,pins or pins property in node %pOF\n", np);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -476,9 +474,9 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
config = imx_pinconf_parse_generic_config(np, ipctl);
|
||||
|
||||
grp->num_pins = size / pin_size;
|
||||
grp->data = devm_kzalloc(info->dev, grp->num_pins *
|
||||
grp->data = devm_kzalloc(ipctl->dev, grp->num_pins *
|
||||
sizeof(struct imx_pin), GFP_KERNEL);
|
||||
grp->pins = devm_kzalloc(info->dev, grp->num_pins *
|
||||
grp->pins = devm_kzalloc(ipctl->dev, grp->num_pins *
|
||||
sizeof(unsigned int), GFP_KERNEL);
|
||||
if (!grp->pins || !grp->data)
|
||||
return -ENOMEM;
|
||||
@@ -502,7 +500,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
}
|
||||
|
||||
pin_id = (mux_reg != -1) ? mux_reg / 4 : conf_reg / 4;
|
||||
pin_reg = &info->pin_regs[pin_id];
|
||||
pin_reg = &ipctl->pin_regs[pin_id];
|
||||
pin->pin = pin_id;
|
||||
grp->pins[i] = pin_id;
|
||||
pin_reg->mux_reg = mux_reg;
|
||||
@@ -524,7 +522,7 @@ static int imx_pinctrl_parse_groups(struct device_node *np,
|
||||
pin->config = config & ~IMX_PAD_SION;
|
||||
}
|
||||
|
||||
dev_dbg(info->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,
|
||||
dev_dbg(ipctl->dev, "%s: 0x%x 0x%08lx", info->pins[pin_id].name,
|
||||
pin->mux_mode, pin->config);
|
||||
}
|
||||
|
||||
@@ -536,13 +534,12 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
|
||||
u32 index)
|
||||
{
|
||||
struct pinctrl_dev *pctl = ipctl->pctl;
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
struct device_node *child;
|
||||
struct function_desc *func;
|
||||
struct group_desc *grp;
|
||||
u32 i = 0;
|
||||
|
||||
dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name);
|
||||
dev_dbg(pctl->dev, "parse function(%d): %s\n", index, np->name);
|
||||
|
||||
func = pinmux_generic_get_function(pctl, index);
|
||||
if (!func)
|
||||
@@ -552,10 +549,10 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
|
||||
func->name = np->name;
|
||||
func->num_group_names = of_get_child_count(np);
|
||||
if (func->num_group_names == 0) {
|
||||
dev_err(info->dev, "no groups defined in %pOF\n", np);
|
||||
dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
|
||||
return -EINVAL;
|
||||
}
|
||||
func->group_names = devm_kcalloc(info->dev, func->num_group_names,
|
||||
func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
|
||||
sizeof(char *), GFP_KERNEL);
|
||||
if (!func->group_names)
|
||||
return -ENOMEM;
|
||||
@@ -563,15 +560,15 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
|
||||
for_each_child_of_node(np, child) {
|
||||
func->group_names[i] = child->name;
|
||||
|
||||
grp = devm_kzalloc(info->dev, sizeof(struct group_desc),
|
||||
grp = devm_kzalloc(ipctl->dev, sizeof(struct group_desc),
|
||||
GFP_KERNEL);
|
||||
if (!grp)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&info->mutex);
|
||||
mutex_lock(&ipctl->mutex);
|
||||
radix_tree_insert(&pctl->pin_group_tree,
|
||||
info->group_index++, grp);
|
||||
mutex_unlock(&info->mutex);
|
||||
ipctl->group_index++, grp);
|
||||
mutex_unlock(&ipctl->mutex);
|
||||
|
||||
imx_pinctrl_parse_groups(child, grp, ipctl, i++);
|
||||
}
|
||||
@@ -608,7 +605,6 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
|
||||
struct device_node *np = pdev->dev.of_node;
|
||||
struct device_node *child;
|
||||
struct pinctrl_dev *pctl = ipctl->pctl;
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
u32 nfuncs = 0;
|
||||
u32 i = 0;
|
||||
bool flat_funcs;
|
||||
@@ -635,13 +631,13 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
|
||||
if (!function)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&info->mutex);
|
||||
mutex_lock(&ipctl->mutex);
|
||||
radix_tree_insert(&pctl->pin_function_tree, i, function);
|
||||
mutex_unlock(&info->mutex);
|
||||
mutex_unlock(&ipctl->mutex);
|
||||
}
|
||||
pctl->num_functions = nfuncs;
|
||||
|
||||
info->group_index = 0;
|
||||
ipctl->group_index = 0;
|
||||
if (flat_funcs) {
|
||||
pctl->num_groups = of_get_child_count(np);
|
||||
} else {
|
||||
@@ -672,7 +668,7 @@ static void imx_free_resources(struct imx_pinctrl *ipctl)
|
||||
}
|
||||
|
||||
int imx_pinctrl_probe(struct platform_device *pdev,
|
||||
struct imx_pinctrl_soc_info *info)
|
||||
const struct imx_pinctrl_soc_info *info)
|
||||
{
|
||||
struct regmap_config config = { .name = "gpr" };
|
||||
struct device_node *dev_np = pdev->dev.of_node;
|
||||
@@ -687,7 +683,6 @@ int imx_pinctrl_probe(struct platform_device *pdev,
|
||||
dev_err(&pdev->dev, "wrong pinctrl info\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
info->dev = &pdev->dev;
|
||||
|
||||
if (info->gpr_compatible) {
|
||||
gpr = syscon_regmap_lookup_by_compatible(info->gpr_compatible);
|
||||
@@ -700,14 +695,14 @@ int imx_pinctrl_probe(struct platform_device *pdev,
|
||||
if (!ipctl)
|
||||
return -ENOMEM;
|
||||
|
||||
info->pin_regs = devm_kmalloc(&pdev->dev, sizeof(*info->pin_regs) *
|
||||
ipctl->pin_regs = devm_kmalloc(&pdev->dev, sizeof(*ipctl->pin_regs) *
|
||||
info->npins, GFP_KERNEL);
|
||||
if (!info->pin_regs)
|
||||
if (!ipctl->pin_regs)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < info->npins; i++) {
|
||||
info->pin_regs[i].mux_reg = -1;
|
||||
info->pin_regs[i].conf_reg = -1;
|
||||
ipctl->pin_regs[i].mux_reg = -1;
|
||||
ipctl->pin_regs[i].conf_reg = -1;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
@@ -751,10 +746,10 @@ int imx_pinctrl_probe(struct platform_device *pdev,
|
||||
/* platform specific callback */
|
||||
imx_pmx_ops.gpio_set_direction = info->gpio_set_direction;
|
||||
|
||||
mutex_init(&info->mutex);
|
||||
mutex_init(&ipctl->mutex);
|
||||
|
||||
ipctl->info = info;
|
||||
ipctl->dev = info->dev;
|
||||
ipctl->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, ipctl);
|
||||
ret = devm_pinctrl_register_and_init(&pdev->dev,
|
||||
imx_pinctrl_desc, ipctl,
|
||||
|
||||
@@ -58,14 +58,10 @@ struct imx_cfg_params_decode {
|
||||
};
|
||||
|
||||
struct imx_pinctrl_soc_info {
|
||||
struct device *dev;
|
||||
const struct pinctrl_pin_desc *pins;
|
||||
unsigned int npins;
|
||||
struct imx_pin_reg *pin_regs;
|
||||
unsigned int group_index;
|
||||
unsigned int flags;
|
||||
const char *gpr_compatible;
|
||||
struct mutex mutex;
|
||||
|
||||
/* MUX_MODE shift and mask in case SHARE_MUX_CONF_REG */
|
||||
unsigned int mux_mask;
|
||||
@@ -75,7 +71,7 @@ struct imx_pinctrl_soc_info {
|
||||
bool generic_pinconf;
|
||||
const struct pinconf_generic_params *custom_params;
|
||||
unsigned int num_custom_params;
|
||||
struct imx_cfg_params_decode *decodes;
|
||||
const struct imx_cfg_params_decode *decodes;
|
||||
unsigned int num_decodes;
|
||||
void (*fixup)(unsigned long *configs, unsigned int num_configs,
|
||||
u32 *raw_config);
|
||||
@@ -95,7 +91,10 @@ struct imx_pinctrl {
|
||||
struct pinctrl_dev *pctl;
|
||||
void __iomem *base;
|
||||
void __iomem *input_sel_base;
|
||||
struct imx_pinctrl_soc_info *info;
|
||||
const struct imx_pinctrl_soc_info *info;
|
||||
struct imx_pin_reg *pin_regs;
|
||||
unsigned int group_index;
|
||||
struct mutex mutex;
|
||||
};
|
||||
|
||||
#define IMX_CFG_PARAMS_DECODE(p, m, o) \
|
||||
@@ -117,5 +116,5 @@ struct imx_pinctrl {
|
||||
#define IOMUXC_CONFIG_SION (0x1 << 4)
|
||||
|
||||
int imx_pinctrl_probe(struct platform_device *pdev,
|
||||
struct imx_pinctrl_soc_info *info);
|
||||
const struct imx_pinctrl_soc_info *info);
|
||||
#endif /* __DRIVERS_PINCTRL_IMX_H */
|
||||
|
||||
@@ -309,7 +309,7 @@ static const struct pinctrl_pin_desc imx25_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX25_PAD_BOOT_MODE1),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx25_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx25_pinctrl_info = {
|
||||
.pins = imx25_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx25_pinctrl_pads),
|
||||
};
|
||||
|
||||
@@ -999,7 +999,7 @@ static const struct pinctrl_pin_desc imx35_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX35_PAD_TEST_MODE),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx35_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx35_pinctrl_info = {
|
||||
.pins = imx35_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx35_pinctrl_pads),
|
||||
};
|
||||
|
||||
@@ -385,7 +385,7 @@ static const struct pinctrl_pin_desc imx50_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX50_PAD_EIM_CRE),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx50_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx50_pinctrl_info = {
|
||||
.pins = imx50_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx50_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx50-iomuxc-gpr",
|
||||
|
||||
@@ -762,7 +762,7 @@ static const struct pinctrl_pin_desc imx51_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX51_PAD_CSI1_MCLK),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx51_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx51_pinctrl_info = {
|
||||
.pins = imx51_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx51_pinctrl_pads),
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user