This is the bulk of pin control changes for the v4.16 kernel cycle:
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. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJadGEKAAoJEEEQszewGV1zA4QQALs8edxhv4qV5vm50mTdrO3n QtRhJNb53j6MIKtjFnazMvh6MXRIP+08SyX9sDLi5AxINIVuyQh3mrcB6Zc9zN58 +6jFFOIbfm5E8by4n3wnKm3F/WAbNBZph9eT2Rn3cDv9o9hQbyNJ50sQkQMCjd9X WGR353c3OL4zb3vU8t72G/RPYUY1w1SkG9bGzRuSif8LawDcN6v6MMo2XhZA6RqM 3qYIG29vJ1n0weggUIBeSAJIzk4eMwcoWCbVWxhns5JGxw5VPES1zbSp1D+mbzRC 01i5Pt/gD+cWN/Kk/zKIMo1OqLAl+uLr6hzepj6W+5wu9CcQz/BgvRx7HUqnqgyh S8cN4AOgWmW+T75pHypd1WVic3q0RCXkFY8jjHpCATDY+Z+js0lZRs3y4DBiJ2ys DMVBeumDINKqaZ6aLH6lVkm+SxXOUy143arQQIzi0/F7fAp68i+9ofIO8B5smEmd 0S+3sT0sO5QXVgZJ0t0iGUUG5irXi8XtF5qvRmuFZUe0OLGgKX20oCdC0pH0WU4M OZO1Bvb8vmn1tddogO2WlHeg6amWdwxtDuBsLRO3YILLu3jwPjhNqNmErXzXEmWt TY9l2M1uQmoJibNpmTjOzSfj4OtUHMwkDrFRJHAcUPcKwdEy4MyzFL16ATnIwgY9 AmyMLNWJd8Wazgc6BK6w =gLY/ -----END PGP SIGNATURE----- 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:
commit
ef991796be
@ -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";
|
||||
};
|
||||
};
|
351
Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt
Normal file
351
Documentation/devicetree/bindings/pinctrl/pinctrl-mt7622.txt
Normal file
@ -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
MAINTAINERS
11
MAINTAINERS
@ -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/
|
||||
|
@ -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),
|
||||
};
|
||||
|
@ -448,7 +448,7 @@ static const struct pinctrl_pin_desc imx53_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX53_PAD_GPIO_18),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx53_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx53_pinctrl_info = {
|
||||
.pins = imx53_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx53_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx53-iomuxc-gpr",
|
||||
|
@ -457,7 +457,7 @@ static const struct pinctrl_pin_desc imx6dl_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6DL_PAD_SD4_DAT7),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx6dl_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx6dl_pinctrl_info = {
|
||||
.pins = imx6dl_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx6dl_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx6q-iomuxc-gpr",
|
||||
|
@ -460,7 +460,7 @@ static const struct pinctrl_pin_desc imx6q_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6Q_PAD_SD2_DAT3),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx6q_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx6q_pinctrl_info = {
|
||||
.pins = imx6q_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx6q_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx6q-iomuxc-gpr",
|
||||
|
@ -363,7 +363,7 @@ static const struct pinctrl_pin_desc imx6sl_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6SL_PAD_WDOG_B),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx6sl_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx6sl_pinctrl_info = {
|
||||
.pins = imx6sl_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx6sl_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx6sl-iomuxc-gpr",
|
||||
|
@ -367,7 +367,7 @@ static const struct pinctrl_pin_desc imx6sx_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6SX_PAD_USB_H_STROBE),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx6sx_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx6sx_pinctrl_info = {
|
||||
.pins = imx6sx_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx6sx_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx6sx-iomuxc-gpr",
|
||||
|
@ -150,6 +150,21 @@ enum imx6ul_pads {
|
||||
MX6UL_PAD_CSI_DATA07 = 128,
|
||||
};
|
||||
|
||||
enum imx6ull_lpsr_pads {
|
||||
MX6ULL_PAD_BOOT_MODE0 = 0,
|
||||
MX6ULL_PAD_BOOT_MODE1 = 1,
|
||||
MX6ULL_PAD_SNVS_TAMPER0 = 2,
|
||||
MX6ULL_PAD_SNVS_TAMPER1 = 3,
|
||||
MX6ULL_PAD_SNVS_TAMPER2 = 4,
|
||||
MX6ULL_PAD_SNVS_TAMPER3 = 5,
|
||||
MX6ULL_PAD_SNVS_TAMPER4 = 6,
|
||||
MX6ULL_PAD_SNVS_TAMPER5 = 7,
|
||||
MX6ULL_PAD_SNVS_TAMPER6 = 8,
|
||||
MX6ULL_PAD_SNVS_TAMPER7 = 9,
|
||||
MX6ULL_PAD_SNVS_TAMPER8 = 10,
|
||||
MX6ULL_PAD_SNVS_TAMPER9 = 11,
|
||||
};
|
||||
|
||||
/* Pad names for the pinmux subsystem */
|
||||
static const struct pinctrl_pin_desc imx6ul_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6UL_PAD_RESERVE0),
|
||||
@ -283,20 +298,49 @@ static const struct pinctrl_pin_desc imx6ul_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6UL_PAD_CSI_DATA07),
|
||||
};
|
||||
|
||||
static struct imx_pinctrl_soc_info imx6ul_pinctrl_info = {
|
||||
/* pad for i.MX6ULL lpsr pinmux */
|
||||
static const struct pinctrl_pin_desc imx6ull_snvs_pinctrl_pads[] = {
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_BOOT_MODE0),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_BOOT_MODE1),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER0),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER1),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER2),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER3),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER4),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER5),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER6),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER7),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER8),
|
||||
IMX_PINCTRL_PIN(MX6ULL_PAD_SNVS_TAMPER9),
|
||||
};
|
||||
|
||||
static const struct imx_pinctrl_soc_info imx6ul_pinctrl_info = {
|
||||
.pins = imx6ul_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx6ul_pinctrl_pads),
|
||||
.gpr_compatible = "fsl,imx6ul-iomuxc-gpr",
|
||||
};
|
||||
|
||||
static struct of_device_id imx6ul_pinctrl_of_match[] = {
|
||||
{ .compatible = "fsl,imx6ul-iomuxc", },
|
||||
static const struct imx_pinctrl_soc_info imx6ull_snvs_pinctrl_info = {
|
||||
.pins = imx6ull_snvs_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx6ull_snvs_pinctrl_pads),
|
||||
.flags = ZERO_OFFSET_VALID,
|
||||
};
|
||||
|
||||
static const struct of_device_id imx6ul_pinctrl_of_match[] = {
|
||||
{ .compatible = "fsl,imx6ul-iomuxc", .data = &imx6ul_pinctrl_info, },
|
||||
{ .compatible = "fsl,imx6ull-iomuxc-snvs", .data = &imx6ull_snvs_pinctrl_info, },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
static int imx6ul_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
return imx_pinctrl_probe(pdev, &imx6ul_pinctrl_info);
|
||||
const struct imx_pinctrl_soc_info *pinctrl_info;
|
||||
|
||||
pinctrl_info = of_device_get_match_data(&pdev->dev);
|
||||
if (!pinctrl_info)
|
||||
return -ENODEV;
|
||||
|
||||
return imx_pinctrl_probe(pdev, pinctrl_info);
|
||||
}
|
||||
|
||||
static struct platform_driver imx6ul_pinctrl_driver = {
|
||||
|
@ -378,16 +378,12 @@ static const struct of_device_id imx7d_pinctrl_of_match[] = {
|
||||
|
||||
static int imx7d_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct imx_pinctrl_soc_info *pinctrl_info;
|
||||
const struct imx_pinctrl_soc_info *pinctrl_info;
|
||||
|
||||
match = of_match_device(imx7d_pinctrl_of_match, &pdev->dev);
|
||||
|
||||
if (!match)
|
||||
pinctrl_info = of_device_get_match_data(&pdev->dev);
|
||||
if (!pinctrl_info)
|
||||
return -ENODEV;
|
||||
|
||||
pinctrl_info = (struct imx_pinctrl_soc_info *) match->data;
|
||||
|
||||
return imx_pinctrl_probe(pdev, pinctrl_info);
|
||||
}
|
||||
|
||||
|
@ -266,7 +266,7 @@ static const struct pinctrl_pin_desc imx7ulp_pinctrl_pads[] = {
|
||||
#define BP_MUX_MODE 8
|
||||
#define BM_PULL_ENABLED BIT(1)
|
||||
|
||||
struct imx_cfg_params_decode imx7ulp_cfg_decodes[] = {
|
||||
static const struct imx_cfg_params_decode imx7ulp_cfg_decodes[] = {
|
||||
IMX_CFG_PARAMS_DECODE(PIN_CONFIG_DRIVE_STRENGTH, BIT(6), 6),
|
||||
IMX_CFG_PARAMS_DECODE(PIN_CONFIG_DRIVE_PUSH_PULL, BIT(5), 5),
|
||||
IMX_CFG_PARAMS_DECODE(PIN_CONFIG_SLEW_RATE, BIT(2), 2),
|
||||
@ -307,11 +307,10 @@ static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
unsigned offset, bool input)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg;
|
||||
u32 reg;
|
||||
|
||||
pin_reg = &info->pin_regs[offset];
|
||||
pin_reg = &ipctl->pin_regs[offset];
|
||||
if (pin_reg->mux_reg == -1)
|
||||
return -EINVAL;
|
||||
|
||||
@ -325,7 +324,7 @@ static int imx7ulp_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info imx7ulp_pinctrl_info = {
|
||||
.pins = imx7ulp_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(imx7ulp_pinctrl_pads),
|
||||
.flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
|
||||
|
@ -300,11 +300,10 @@ static int vf610_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
unsigned offset, bool input)
|
||||
{
|
||||
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct imx_pinctrl_soc_info *info = ipctl->info;
|
||||
const struct imx_pin_reg *pin_reg;
|
||||
u32 reg;
|
||||
|
||||
pin_reg = &info->pin_regs[offset];
|
||||
pin_reg = &ipctl->pin_regs[offset];
|
||||
if (pin_reg->mux_reg == -1)
|
||||
return -EINVAL;
|
||||
|
||||
@ -319,7 +318,7 @@ static int vf610_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct imx_pinctrl_soc_info vf610_pinctrl_info = {
|
||||
static const struct imx_pinctrl_soc_info vf610_pinctrl_info = {
|
||||
.pins = vf610_pinctrl_pads,
|
||||
.npins = ARRAY_SIZE(vf610_pinctrl_pads),
|
||||
.flags = SHARE_MUX_CONF_REG | ZERO_OFFSET_VALID,
|
||||
|
@ -46,6 +46,9 @@
|
||||
#define BYT_TRIG_POS BIT(25)
|
||||
#define BYT_TRIG_LVL BIT(24)
|
||||
#define BYT_DEBOUNCE_EN BIT(20)
|
||||
#define BYT_GLITCH_FILTER_EN BIT(19)
|
||||
#define BYT_GLITCH_F_SLOW_CLK BIT(17)
|
||||
#define BYT_GLITCH_F_FAST_CLK BIT(16)
|
||||
#define BYT_PULL_STR_SHIFT 9
|
||||
#define BYT_PULL_STR_MASK (3 << BYT_PULL_STR_SHIFT)
|
||||
#define BYT_PULL_STR_2K (0 << BYT_PULL_STR_SHIFT)
|
||||
@ -1579,6 +1582,9 @@ static int byt_irq_type(struct irq_data *d, unsigned int type)
|
||||
*/
|
||||
value &= ~(BYT_DIRECT_IRQ_EN | BYT_TRIG_POS | BYT_TRIG_NEG |
|
||||
BYT_TRIG_LVL);
|
||||
/* Enable glitch filtering */
|
||||
value |= BYT_GLITCH_FILTER_EN | BYT_GLITCH_F_SLOW_CLK |
|
||||
BYT_GLITCH_F_FAST_CLK;
|
||||
|
||||
writel(value, reg);
|
||||
|
||||
|
@ -23,13 +23,16 @@
|
||||
#define CNL_HOSTSW_OWN 0x0b0
|
||||
#define CNL_GPI_IE 0x120
|
||||
|
||||
#define CNL_GPP(r, s, e) \
|
||||
#define CNL_GPP(r, s, e, g) \
|
||||
{ \
|
||||
.reg_num = (r), \
|
||||
.base = (s), \
|
||||
.size = ((e) - (s) + 1), \
|
||||
.gpio_base = (g), \
|
||||
}
|
||||
|
||||
#define CNL_NO_GPIO -1
|
||||
|
||||
#define CNL_COMMUNITY(b, s, e, g) \
|
||||
{ \
|
||||
.barno = (b), \
|
||||
@ -363,32 +366,32 @@ static const struct pinctrl_pin_desc cnlh_pins[] = {
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnlh_community0_gpps[] = {
|
||||
CNL_GPP(0, 0, 24), /* GPP_A */
|
||||
CNL_GPP(1, 25, 50), /* GPP_B */
|
||||
CNL_GPP(0, 0, 24, 0), /* GPP_A */
|
||||
CNL_GPP(1, 25, 50, 32), /* GPP_B */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnlh_community1_gpps[] = {
|
||||
CNL_GPP(0, 51, 74), /* GPP_C */
|
||||
CNL_GPP(1, 75, 98), /* GPP_D */
|
||||
CNL_GPP(2, 99, 106), /* GPP_G */
|
||||
CNL_GPP(3, 107, 114), /* AZA */
|
||||
CNL_GPP(4, 115, 146), /* vGPIO_0 */
|
||||
CNL_GPP(5, 147, 154), /* vGPIO_1 */
|
||||
CNL_GPP(0, 51, 74, 64), /* GPP_C */
|
||||
CNL_GPP(1, 75, 98, 96), /* GPP_D */
|
||||
CNL_GPP(2, 99, 106, 128), /* GPP_G */
|
||||
CNL_GPP(3, 107, 114, CNL_NO_GPIO), /* AZA */
|
||||
CNL_GPP(4, 115, 146, 160), /* vGPIO_0 */
|
||||
CNL_GPP(5, 147, 154, CNL_NO_GPIO), /* vGPIO_1 */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnlh_community3_gpps[] = {
|
||||
CNL_GPP(0, 155, 178), /* GPP_K */
|
||||
CNL_GPP(1, 179, 202), /* GPP_H */
|
||||
CNL_GPP(2, 203, 215), /* GPP_E */
|
||||
CNL_GPP(3, 216, 239), /* GPP_F */
|
||||
CNL_GPP(4, 240, 248), /* SPI */
|
||||
CNL_GPP(0, 155, 178, 192), /* GPP_K */
|
||||
CNL_GPP(1, 179, 202, 224), /* GPP_H */
|
||||
CNL_GPP(2, 203, 215, 258), /* GPP_E */
|
||||
CNL_GPP(3, 216, 239, 288), /* GPP_F */
|
||||
CNL_GPP(4, 240, 248, CNL_NO_GPIO), /* SPI */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnlh_community4_gpps[] = {
|
||||
CNL_GPP(0, 249, 259), /* CPU */
|
||||
CNL_GPP(1, 260, 268), /* JTAG */
|
||||
CNL_GPP(2, 269, 286), /* GPP_I */
|
||||
CNL_GPP(3, 287, 298), /* GPP_J */
|
||||
CNL_GPP(0, 249, 259, CNL_NO_GPIO), /* CPU */
|
||||
CNL_GPP(1, 260, 268, CNL_NO_GPIO), /* JTAG */
|
||||
CNL_GPP(2, 269, 286, 320), /* GPP_I */
|
||||
CNL_GPP(3, 287, 298, 352), /* GPP_J */
|
||||
};
|
||||
|
||||
static const unsigned int cnlh_spi0_pins[] = { 40, 41, 42, 43 };
|
||||
@ -785,25 +788,25 @@ static const struct intel_function cnllp_functions[] = {
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnllp_community0_gpps[] = {
|
||||
CNL_GPP(0, 0, 24), /* GPP_A */
|
||||
CNL_GPP(1, 25, 50), /* GPP_B */
|
||||
CNL_GPP(2, 51, 58), /* GPP_G */
|
||||
CNL_GPP(3, 59, 67), /* SPI */
|
||||
CNL_GPP(0, 0, 24, 0), /* GPP_A */
|
||||
CNL_GPP(1, 25, 50, 32), /* GPP_B */
|
||||
CNL_GPP(2, 51, 58, 64), /* GPP_G */
|
||||
CNL_GPP(3, 59, 67, CNL_NO_GPIO), /* SPI */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnllp_community1_gpps[] = {
|
||||
CNL_GPP(0, 68, 92), /* GPP_D */
|
||||
CNL_GPP(1, 93, 116), /* GPP_F */
|
||||
CNL_GPP(2, 117, 140), /* GPP_H */
|
||||
CNL_GPP(3, 141, 172), /* vGPIO */
|
||||
CNL_GPP(4, 173, 180), /* vGPIO */
|
||||
CNL_GPP(0, 68, 92, 96), /* GPP_D */
|
||||
CNL_GPP(1, 93, 116, 128), /* GPP_F */
|
||||
CNL_GPP(2, 117, 140, 160), /* GPP_H */
|
||||
CNL_GPP(3, 141, 172, 192), /* vGPIO */
|
||||
CNL_GPP(4, 173, 180, 224), /* vGPIO */
|
||||
};
|
||||
|
||||
static const struct intel_padgroup cnllp_community4_gpps[] = {
|
||||
CNL_GPP(0, 181, 204), /* GPP_C */
|
||||
CNL_GPP(1, 205, 228), /* GPP_E */
|
||||
CNL_GPP(2, 229, 237), /* JTAG */
|
||||
CNL_GPP(3, 238, 243), /* HVCMOS */
|
||||
CNL_GPP(0, 181, 204, 256), /* GPP_C */
|
||||
CNL_GPP(1, 205, 228, 288), /* GPP_E */
|
||||
CNL_GPP(2, 229, 237, CNL_NO_GPIO), /* JTAG */
|
||||
CNL_GPP(3, 238, 243, CNL_NO_GPIO), /* HVCMOS */
|
||||
};
|
||||
|
||||
static const struct intel_community cnllp_communities[] = {
|
||||
|
@ -131,10 +131,8 @@ struct chv_gpio_pinrange {
|
||||
* @ngroups: Number of groups
|
||||
* @functions: All functions in this community
|
||||
* @nfunctions: Number of functions
|
||||
* @ngpios: Number of GPIOs in this community
|
||||
* @gpio_ranges: An array of GPIO ranges in this community
|
||||
* @ngpio_ranges: Number of GPIO ranges
|
||||
* @ngpios: Total number of GPIOs in this community
|
||||
* @nirqs: Total number of IRQs this community can generate
|
||||
*/
|
||||
struct chv_community {
|
||||
@ -147,7 +145,6 @@ struct chv_community {
|
||||
size_t nfunctions;
|
||||
const struct chv_gpio_pinrange *gpio_ranges;
|
||||
size_t ngpio_ranges;
|
||||
size_t ngpios;
|
||||
size_t nirqs;
|
||||
acpi_adr_space_type acpi_space_id;
|
||||
};
|
||||
@ -399,7 +396,6 @@ static const struct chv_community southwest_community = {
|
||||
.nfunctions = ARRAY_SIZE(southwest_functions),
|
||||
.gpio_ranges = southwest_gpio_ranges,
|
||||
.ngpio_ranges = ARRAY_SIZE(southwest_gpio_ranges),
|
||||
.ngpios = ARRAY_SIZE(southwest_pins),
|
||||
/*
|
||||
* Southwest community can benerate GPIO interrupts only for the
|
||||
* first 8 interrupts. The upper half (8-15) can only be used to
|
||||
@ -489,7 +485,6 @@ static const struct chv_community north_community = {
|
||||
.npins = ARRAY_SIZE(north_pins),
|
||||
.gpio_ranges = north_gpio_ranges,
|
||||
.ngpio_ranges = ARRAY_SIZE(north_gpio_ranges),
|
||||
.ngpios = ARRAY_SIZE(north_pins),
|
||||
/*
|
||||
* North community can generate GPIO interrupts only for the first
|
||||
* 8 interrupts. The upper half (8-15) can only be used to trigger
|
||||
@ -538,7 +533,6 @@ static const struct chv_community east_community = {
|
||||
.npins = ARRAY_SIZE(east_pins),
|
||||
.gpio_ranges = east_gpio_ranges,
|
||||
.ngpio_ranges = ARRAY_SIZE(east_gpio_ranges),
|
||||
.ngpios = ARRAY_SIZE(east_pins),
|
||||
.nirqs = 16,
|
||||
.acpi_space_id = 0x93,
|
||||
};
|
||||
@ -665,7 +659,6 @@ static const struct chv_community southeast_community = {
|
||||
.nfunctions = ARRAY_SIZE(southeast_functions),
|
||||
.gpio_ranges = southeast_gpio_ranges,
|
||||
.ngpio_ranges = ARRAY_SIZE(southeast_gpio_ranges),
|
||||
.ngpios = ARRAY_SIZE(southeast_pins),
|
||||
.nirqs = 16,
|
||||
.acpi_space_id = 0x94,
|
||||
};
|
||||
@ -1253,21 +1246,14 @@ static struct pinctrl_desc chv_pinctrl_desc = {
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static unsigned chv_gpio_offset_to_pin(struct chv_pinctrl *pctrl,
|
||||
unsigned offset)
|
||||
{
|
||||
return pctrl->community->pins[offset].number;
|
||||
}
|
||||
|
||||
static int chv_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(chip);
|
||||
int pin = chv_gpio_offset_to_pin(pctrl, offset);
|
||||
unsigned long flags;
|
||||
u32 ctrl0, cfg;
|
||||
|
||||
raw_spin_lock_irqsave(&chv_lock, flags);
|
||||
ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0));
|
||||
ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0));
|
||||
raw_spin_unlock_irqrestore(&chv_lock, flags);
|
||||
|
||||
cfg = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK;
|
||||
@ -1281,14 +1267,13 @@ static int chv_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(chip);
|
||||
unsigned pin = chv_gpio_offset_to_pin(pctrl, offset);
|
||||
unsigned long flags;
|
||||
void __iomem *reg;
|
||||
u32 ctrl0;
|
||||
|
||||
raw_spin_lock_irqsave(&chv_lock, flags);
|
||||
|
||||
reg = chv_padreg(pctrl, pin, CHV_PADCTRL0);
|
||||
reg = chv_padreg(pctrl, offset, CHV_PADCTRL0);
|
||||
ctrl0 = readl(reg);
|
||||
|
||||
if (value)
|
||||
@ -1304,12 +1289,11 @@ static void chv_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
static int chv_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(chip);
|
||||
unsigned pin = chv_gpio_offset_to_pin(pctrl, offset);
|
||||
u32 ctrl0, direction;
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&chv_lock, flags);
|
||||
ctrl0 = readl(chv_padreg(pctrl, pin, CHV_PADCTRL0));
|
||||
ctrl0 = readl(chv_padreg(pctrl, offset, CHV_PADCTRL0));
|
||||
raw_spin_unlock_irqrestore(&chv_lock, flags);
|
||||
|
||||
direction = ctrl0 & CHV_PADCTRL0_GPIOCFG_MASK;
|
||||
@ -1345,7 +1329,7 @@ static void chv_gpio_irq_ack(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
int pin = chv_gpio_offset_to_pin(pctrl, irqd_to_hwirq(d));
|
||||
int pin = irqd_to_hwirq(d);
|
||||
u32 intr_line;
|
||||
|
||||
raw_spin_lock(&chv_lock);
|
||||
@ -1362,7 +1346,7 @@ static void chv_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
int pin = chv_gpio_offset_to_pin(pctrl, irqd_to_hwirq(d));
|
||||
int pin = irqd_to_hwirq(d);
|
||||
u32 value, intr_line;
|
||||
unsigned long flags;
|
||||
|
||||
@ -1407,8 +1391,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
|
||||
if (irqd_get_trigger_type(d) == IRQ_TYPE_NONE) {
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
unsigned offset = irqd_to_hwirq(d);
|
||||
int pin = chv_gpio_offset_to_pin(pctrl, offset);
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
irq_flow_handler_t handler;
|
||||
unsigned long flags;
|
||||
u32 intsel, value;
|
||||
@ -1426,7 +1409,7 @@ static unsigned chv_gpio_irq_startup(struct irq_data *d)
|
||||
|
||||
if (!pctrl->intr_lines[intsel]) {
|
||||
irq_set_handler_locked(d, handler);
|
||||
pctrl->intr_lines[intsel] = offset;
|
||||
pctrl->intr_lines[intsel] = pin;
|
||||
}
|
||||
raw_spin_unlock_irqrestore(&chv_lock, flags);
|
||||
}
|
||||
@ -1439,8 +1422,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct chv_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
unsigned offset = irqd_to_hwirq(d);
|
||||
int pin = chv_gpio_offset_to_pin(pctrl, offset);
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
unsigned long flags;
|
||||
u32 value;
|
||||
|
||||
@ -1486,7 +1468,7 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type)
|
||||
value &= CHV_PADCTRL0_INTSEL_MASK;
|
||||
value >>= CHV_PADCTRL0_INTSEL_SHIFT;
|
||||
|
||||
pctrl->intr_lines[value] = offset;
|
||||
pctrl->intr_lines[value] = pin;
|
||||
|
||||
if (type & IRQ_TYPE_EDGE_BOTH)
|
||||
irq_set_handler_locked(d, handle_edge_irq);
|
||||
@ -1576,12 +1558,12 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
|
||||
const struct chv_gpio_pinrange *range;
|
||||
struct gpio_chip *chip = &pctrl->chip;
|
||||
bool need_valid_mask = !dmi_check_system(chv_no_valid_mask);
|
||||
int ret, i, offset;
|
||||
int irq_base;
|
||||
const struct chv_community *community = pctrl->community;
|
||||
int ret, i, irq_base;
|
||||
|
||||
*chip = chv_gpio_chip;
|
||||
|
||||
chip->ngpio = pctrl->community->ngpios;
|
||||
chip->ngpio = community->pins[community->npins - 1].number + 1;
|
||||
chip->label = dev_name(pctrl->dev);
|
||||
chip->parent = pctrl->dev;
|
||||
chip->base = -1;
|
||||
@ -1593,30 +1575,29 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0, offset = 0; i < pctrl->community->ngpio_ranges; i++) {
|
||||
range = &pctrl->community->gpio_ranges[i];
|
||||
ret = gpiochip_add_pin_range(chip, dev_name(pctrl->dev), offset,
|
||||
range->base, range->npins);
|
||||
for (i = 0; i < community->ngpio_ranges; i++) {
|
||||
range = &community->gpio_ranges[i];
|
||||
ret = gpiochip_add_pin_range(chip, dev_name(pctrl->dev),
|
||||
range->base, range->base,
|
||||
range->npins);
|
||||
if (ret) {
|
||||
dev_err(pctrl->dev, "failed to add GPIO pin range\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
offset += range->npins;
|
||||
}
|
||||
|
||||
/* Do not add GPIOs that can only generate GPEs to the IRQ domain */
|
||||
for (i = 0; i < pctrl->community->npins; i++) {
|
||||
for (i = 0; i < community->npins; i++) {
|
||||
const struct pinctrl_pin_desc *desc;
|
||||
u32 intsel;
|
||||
|
||||
desc = &pctrl->community->pins[i];
|
||||
desc = &community->pins[i];
|
||||
|
||||
intsel = readl(chv_padreg(pctrl, desc->number, CHV_PADCTRL0));
|
||||
intsel &= CHV_PADCTRL0_INTSEL_MASK;
|
||||
intsel >>= CHV_PADCTRL0_INTSEL_SHIFT;
|
||||
|
||||
if (need_valid_mask && intsel >= pctrl->community->nirqs)
|
||||
if (need_valid_mask && intsel >= community->nirqs)
|
||||
clear_bit(i, chip->irq.valid_mask);
|
||||
}
|
||||
|
||||
|
@ -425,6 +425,18 @@ static void __intel_gpio_set_direction(void __iomem *padcfg0, bool input)
|
||||
writel(value, padcfg0);
|
||||
}
|
||||
|
||||
static void intel_gpio_set_gpio_mode(void __iomem *padcfg0)
|
||||
{
|
||||
u32 value;
|
||||
|
||||
/* Put the pad into GPIO mode */
|
||||
value = readl(padcfg0) & ~PADCFG0_PMODE_MASK;
|
||||
/* Disable SCI/SMI/NMI generation */
|
||||
value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
|
||||
value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
|
||||
writel(value, padcfg0);
|
||||
}
|
||||
|
||||
static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
||||
struct pinctrl_gpio_range *range,
|
||||
unsigned pin)
|
||||
@ -432,7 +444,6 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
||||
struct intel_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
|
||||
void __iomem *padcfg0;
|
||||
unsigned long flags;
|
||||
u32 value;
|
||||
|
||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
@ -442,13 +453,7 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,
|
||||
}
|
||||
|
||||
padcfg0 = intel_get_padcfg(pctrl, pin, PADCFG0);
|
||||
/* Put the pad into GPIO mode */
|
||||
value = readl(padcfg0) & ~PADCFG0_PMODE_MASK;
|
||||
/* Disable SCI/SMI/NMI generation */
|
||||
value &= ~(PADCFG0_GPIROUTIOXAPIC | PADCFG0_GPIROUTSCI);
|
||||
value &= ~(PADCFG0_GPIROUTSMI | PADCFG0_GPIROUTNMI);
|
||||
writel(value, padcfg0);
|
||||
|
||||
intel_gpio_set_gpio_mode(padcfg0);
|
||||
/* Disable TX buffer and enable RX (this will be input) */
|
||||
__intel_gpio_set_direction(padcfg0, true);
|
||||
|
||||
@ -806,22 +811,63 @@ static const struct gpio_chip intel_gpio_chip = {
|
||||
.set_config = gpiochip_generic_config,
|
||||
};
|
||||
|
||||
/**
|
||||
* intel_gpio_to_pin() - Translate from GPIO offset to pin number
|
||||
* @pctrl: Pinctrl structure
|
||||
* @offset: GPIO offset from gpiolib
|
||||
* @commmunity: Community is filled here if not %NULL
|
||||
* @padgrp: Pad group is filled here if not %NULL
|
||||
*
|
||||
* When coming through gpiolib irqchip, the GPIO offset is not
|
||||
* automatically translated to pinctrl pin number. This function can be
|
||||
* used to find out the corresponding pinctrl pin.
|
||||
*/
|
||||
static int intel_gpio_to_pin(struct intel_pinctrl *pctrl, unsigned offset,
|
||||
const struct intel_community **community,
|
||||
const struct intel_padgroup **padgrp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < pctrl->ncommunities; i++) {
|
||||
const struct intel_community *comm = &pctrl->communities[i];
|
||||
int j;
|
||||
|
||||
for (j = 0; j < comm->ngpps; j++) {
|
||||
const struct intel_padgroup *pgrp = &comm->gpps[j];
|
||||
|
||||
if (pgrp->gpio_base < 0)
|
||||
continue;
|
||||
|
||||
if (offset >= pgrp->gpio_base &&
|
||||
offset < pgrp->gpio_base + pgrp->size) {
|
||||
int pin;
|
||||
|
||||
pin = pgrp->base + offset - pgrp->gpio_base;
|
||||
if (community)
|
||||
*community = comm;
|
||||
if (padgrp)
|
||||
*padgrp = pgrp;
|
||||
|
||||
return pin;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void intel_gpio_irq_ack(struct irq_data *d)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
const struct intel_community *community;
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
const struct intel_padgroup *padgrp;
|
||||
int pin;
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
if (community) {
|
||||
const struct intel_padgroup *padgrp;
|
||||
pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
|
||||
if (pin >= 0) {
|
||||
unsigned gpp, gpp_offset, is_offset;
|
||||
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return;
|
||||
|
||||
gpp = padgrp->reg_num;
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
is_offset = community->is_offset + gpp * 4;
|
||||
@ -837,19 +883,15 @@ static void intel_gpio_irq_enable(struct irq_data *d)
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
const struct intel_community *community;
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
const struct intel_padgroup *padgrp;
|
||||
int pin;
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
if (community) {
|
||||
const struct intel_padgroup *padgrp;
|
||||
pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
|
||||
if (pin >= 0) {
|
||||
unsigned gpp, gpp_offset, is_offset;
|
||||
unsigned long flags;
|
||||
u32 value;
|
||||
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return;
|
||||
|
||||
gpp = padgrp->reg_num;
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
is_offset = community->is_offset + gpp * 4;
|
||||
@ -870,20 +912,16 @@ static void intel_gpio_irq_mask_unmask(struct irq_data *d, bool mask)
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
const struct intel_community *community;
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
const struct intel_padgroup *padgrp;
|
||||
int pin;
|
||||
|
||||
community = intel_get_community(pctrl, pin);
|
||||
if (community) {
|
||||
const struct intel_padgroup *padgrp;
|
||||
pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), &community, &padgrp);
|
||||
if (pin >= 0) {
|
||||
unsigned gpp, gpp_offset;
|
||||
unsigned long flags;
|
||||
void __iomem *reg;
|
||||
u32 value;
|
||||
|
||||
padgrp = intel_community_get_padgroup(community, pin);
|
||||
if (!padgrp)
|
||||
return;
|
||||
|
||||
gpp = padgrp->reg_num;
|
||||
gpp_offset = padgroup_offset(padgrp, pin);
|
||||
|
||||
@ -914,7 +952,7 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned type)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
unsigned pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
|
||||
unsigned long flags;
|
||||
void __iomem *reg;
|
||||
u32 value;
|
||||
@ -935,6 +973,8 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned type)
|
||||
|
||||
raw_spin_lock_irqsave(&pctrl->lock, flags);
|
||||
|
||||
intel_gpio_set_gpio_mode(reg);
|
||||
|
||||
value = readl(reg);
|
||||
|
||||
value &= ~(PADCFG0_RXEVCFG_MASK | PADCFG0_RXINV);
|
||||
@ -969,7 +1009,7 @@ static int intel_gpio_irq_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct intel_pinctrl *pctrl = gpiochip_get_data(gc);
|
||||
unsigned pin = irqd_to_hwirq(d);
|
||||
unsigned pin = intel_gpio_to_pin(pctrl, irqd_to_hwirq(d), NULL, NULL);
|
||||
|
||||
if (on)
|
||||
enable_irq_wake(pctrl->irq);
|
||||
@ -1000,14 +1040,10 @@ static irqreturn_t intel_gpio_community_irq_handler(struct intel_pinctrl *pctrl,
|
||||
pending &= enabled;
|
||||
|
||||
for_each_set_bit(gpp_offset, &pending, padgrp->size) {
|
||||
unsigned padno, irq;
|
||||
|
||||
padno = padgrp->base - community->pin_base + gpp_offset;
|
||||
if (padno >= community->npins)
|
||||
break;
|
||||
unsigned irq;
|
||||
|
||||
irq = irq_find_mapping(gc->irq.domain,
|
||||
community->pin_base + padno);
|
||||
padgrp->gpio_base + gpp_offset);
|
||||
generic_handle_irq(irq);
|
||||
|
||||
ret |= IRQ_HANDLED;
|
||||
@ -1044,13 +1080,56 @@ static struct irq_chip intel_gpio_irqchip = {
|
||||
.flags = IRQCHIP_MASK_ON_SUSPEND,
|
||||
};
|
||||
|
||||
static int intel_gpio_add_pin_ranges(struct intel_pinctrl *pctrl,
|
||||
const struct intel_community *community)
|
||||
{
|
||||
int ret = 0, i;
|
||||
|
||||
for (i = 0; i < community->ngpps; i++) {
|
||||
const struct intel_padgroup *gpp = &community->gpps[i];
|
||||
|
||||
if (gpp->gpio_base < 0)
|
||||
continue;
|
||||
|
||||
ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
|
||||
gpp->gpio_base, gpp->base,
|
||||
gpp->size);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static unsigned intel_gpio_ngpio(const struct intel_pinctrl *pctrl)
|
||||
{
|
||||
const struct intel_community *community;
|
||||
unsigned ngpio = 0;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < pctrl->ncommunities; i++) {
|
||||
community = &pctrl->communities[i];
|
||||
for (j = 0; j < community->ngpps; j++) {
|
||||
const struct intel_padgroup *gpp = &community->gpps[j];
|
||||
|
||||
if (gpp->gpio_base < 0)
|
||||
continue;
|
||||
|
||||
if (gpp->gpio_base + gpp->size > ngpio)
|
||||
ngpio = gpp->gpio_base + gpp->size;
|
||||
}
|
||||
}
|
||||
|
||||
return ngpio;
|
||||
}
|
||||
|
||||
static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
|
||||
{
|
||||
int ret;
|
||||
int ret, i;
|
||||
|
||||
pctrl->chip = intel_gpio_chip;
|
||||
|
||||
pctrl->chip.ngpio = pctrl->soc->npins;
|
||||
pctrl->chip.ngpio = intel_gpio_ngpio(pctrl);
|
||||
pctrl->chip.label = dev_name(pctrl->dev);
|
||||
pctrl->chip.parent = pctrl->dev;
|
||||
pctrl->chip.base = -1;
|
||||
@ -1062,11 +1141,14 @@ static int intel_gpio_probe(struct intel_pinctrl *pctrl, int irq)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev),
|
||||
0, 0, pctrl->soc->npins);
|
||||
if (ret) {
|
||||
dev_err(pctrl->dev, "failed to add GPIO pin range\n");
|
||||
return ret;
|
||||
for (i = 0; i < pctrl->ncommunities; i++) {
|
||||
struct intel_community *community = &pctrl->communities[i];
|
||||
|
||||
ret = intel_gpio_add_pin_ranges(pctrl, community);
|
||||
if (ret) {
|
||||
dev_err(pctrl->dev, "failed to add GPIO pin range\n");
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1126,6 +1208,9 @@ static int intel_pinctrl_add_padgroups(struct intel_pinctrl *pctrl,
|
||||
if (gpps[i].size > 32)
|
||||
return -EINVAL;
|
||||
|
||||
if (!gpps[i].gpio_base)
|
||||
gpps[i].gpio_base = gpps[i].base;
|
||||
|
||||
gpps[i].padown_num = padown_num;
|
||||
|
||||
/*
|
||||
|
@ -51,6 +51,8 @@ struct intel_function {
|
||||
* @reg_num: GPI_IS register number
|
||||
* @base: Starting pin of this group
|
||||
* @size: Size of this group (maximum is 32).
|
||||
* @gpio_base: Starting GPIO base of this group (%0 if matches with @base,
|
||||
* and %-1 if no GPIO mapping should be created)
|
||||
* @padown_num: PAD_OWN register number (assigned by the core driver)
|
||||
*
|
||||
* If pad groups of a community are not the same size, use this structure
|
||||
@ -60,6 +62,7 @@ struct intel_padgroup {
|
||||
unsigned reg_num;
|
||||
unsigned base;
|
||||
unsigned size;
|
||||
int gpio_base;
|
||||
unsigned padown_num;
|
||||
};
|
||||
|
||||
|
@ -931,10 +931,17 @@ static int mrfld_pinctrl_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id mrfld_acpi_table[] = {
|
||||
{ "INTC1002" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, mrfld_acpi_table);
|
||||
|
||||
static struct platform_driver mrfld_pinctrl_driver = {
|
||||
.probe = mrfld_pinctrl_probe,
|
||||
.driver = {
|
||||
.name = "pinctrl-merrifield",
|
||||
.acpi_match_table = mrfld_acpi_table,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
if ARCH_MEDIATEK || COMPILE_TEST
|
||||
menu "MediaTek pinctrl drivers"
|
||||
depends on ARCH_MEDIATEK || COMPILE_TEST
|
||||
|
||||
config PINCTRL_MTK
|
||||
bool
|
||||
@ -31,6 +32,16 @@ config PINCTRL_MT8127
|
||||
select PINCTRL_MTK
|
||||
|
||||
# For ARMv8 SoCs
|
||||
config PINCTRL_MT7622
|
||||
bool "MediaTek MT7622 pin control"
|
||||
depends on OF
|
||||
depends on ARM64 || COMPILE_TEST
|
||||
select GENERIC_PINCONF
|
||||
select GENERIC_PINCTRL_GROUPS
|
||||
select GENERIC_PINMUX_FUNCTIONS
|
||||
select GPIOLIB
|
||||
select OF_GPIO
|
||||
|
||||
config PINCTRL_MT8173
|
||||
bool "Mediatek MT8173 pin control"
|
||||
depends on OF
|
||||
@ -46,4 +57,4 @@ config PINCTRL_MT6397
|
||||
default MFD_MT6397
|
||||
select PINCTRL_MTK
|
||||
|
||||
endif
|
||||
endmenu
|
||||
|
@ -1,10 +1,11 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
# Core
|
||||
obj-y += pinctrl-mtk-common.o
|
||||
obj-$(CONFIG_PINCTRL_MTK) += pinctrl-mtk-common.o
|
||||
|
||||
# SoC Drivers
|
||||
obj-$(CONFIG_PINCTRL_MT2701) += pinctrl-mt2701.o
|
||||
obj-$(CONFIG_PINCTRL_MT8135) += pinctrl-mt8135.o
|
||||
obj-$(CONFIG_PINCTRL_MT8127) += pinctrl-mt8127.o
|
||||
obj-$(CONFIG_PINCTRL_MT7622) += pinctrl-mt7622.o
|
||||
obj-$(CONFIG_PINCTRL_MT8173) += pinctrl-mt8173.o
|
||||
obj-$(CONFIG_PINCTRL_MT6397) += pinctrl-mt6397.o
|
||||
|
1597
drivers/pinctrl/mediatek/pinctrl-mt7622.c
Normal file
1597
drivers/pinctrl/mediatek/pinctrl-mt7622.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -38,4 +38,13 @@ config PINCTRL_MESON_GXL
|
||||
config PINCTRL_MESON8_PMX
|
||||
bool
|
||||
|
||||
config PINCTRL_MESON_AXG
|
||||
bool "Meson axg Soc pinctrl driver"
|
||||
depends on ARM64
|
||||
select PINCTRL_MESON_AXG_PMX
|
||||
default y
|
||||
|
||||
config PINCTRL_MESON_AXG_PMX
|
||||
bool
|
||||
|
||||
endif
|
||||
|
@ -4,3 +4,5 @@ obj-$(CONFIG_PINCTRL_MESON8) += pinctrl-meson8.o
|
||||
obj-$(CONFIG_PINCTRL_MESON8B) += pinctrl-meson8b.o
|
||||
obj-$(CONFIG_PINCTRL_MESON_GXBB) += pinctrl-meson-gxbb.o
|
||||
obj-$(CONFIG_PINCTRL_MESON_GXL) += pinctrl-meson-gxl.o
|
||||
obj-$(CONFIG_PINCTRL_MESON_AXG_PMX) += pinctrl-meson-axg-pmx.o
|
||||
obj-$(CONFIG_PINCTRL_MESON_AXG) += pinctrl-meson-axg.o
|
||||
|
118
drivers/pinctrl/meson/pinctrl-meson-axg-pmx.c
Normal file
118
drivers/pinctrl/meson/pinctrl-meson-axg-pmx.c
Normal file
@ -0,0 +1,118 @@
|
||||
/*
|
||||
* Second generation of pinmux driver for Amlogic Meson-AXG SoC.
|
||||
*
|
||||
* Copyright (c) 2017 Baylibre SAS.
|
||||
* Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
*
|
||||
* Copyright (c) 2017 Amlogic, Inc. All rights reserved.
|
||||
* Author: Xingyu Chen <xingyu.chen@amlogic.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||
*/
|
||||
|
||||
/*
|
||||
* This new generation of pinctrl IP is mainly adopted by the
|
||||
* Meson-AXG SoC and later series, which use 4-width continuous
|
||||
* register bit to select the function for each pin.
|
||||
*
|
||||
* The value 0 is always selecting the GPIO mode, while other
|
||||
* values (start from 1) for selecting the function mode.
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
|
||||
#include "pinctrl-meson.h"
|
||||
#include "pinctrl-meson-axg-pmx.h"
|
||||
|
||||
static int meson_axg_pmx_get_bank(struct meson_pinctrl *pc,
|
||||
unsigned int pin,
|
||||
struct meson_pmx_bank **bank)
|
||||
{
|
||||
int i;
|
||||
struct meson_axg_pmx_data *pmx = pc->data->pmx_data;
|
||||
|
||||
for (i = 0; i < pmx->num_pmx_banks; i++)
|
||||
if (pin >= pmx->pmx_banks[i].first &&
|
||||
pin <= pmx->pmx_banks[i].last) {
|
||||
*bank = &pmx->pmx_banks[i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int meson_pmx_calc_reg_and_offset(struct meson_pmx_bank *bank,
|
||||
unsigned int pin, unsigned int *reg,
|
||||
unsigned int *offset)
|
||||
{
|
||||
int shift;
|
||||
|
||||
shift = pin - bank->first;
|
||||
|
||||
*reg = bank->reg + (bank->offset + (shift << 2)) / 32;
|
||||
*offset = (bank->offset + (shift << 2)) % 32;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_axg_pmx_update_function(struct meson_pinctrl *pc,
|
||||
unsigned int pin, unsigned int func)
|
||||
{
|
||||
int ret;
|
||||
int reg;
|
||||
int offset;
|
||||
struct meson_pmx_bank *bank;
|
||||
|
||||
ret = meson_axg_pmx_get_bank(pc, pin, &bank);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
meson_pmx_calc_reg_and_offset(bank, pin, ®, &offset);
|
||||
|
||||
ret = regmap_update_bits(pc->reg_mux, reg << 2,
|
||||
0xf << offset, (func & 0xf) << offset);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int meson_axg_pmx_set_mux(struct pinctrl_dev *pcdev,
|
||||
unsigned int func_num, unsigned int group_num)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
|
||||
struct meson_pmx_func *func = &pc->data->funcs[func_num];
|
||||
struct meson_pmx_group *group = &pc->data->groups[group_num];
|
||||
struct meson_pmx_axg_data *pmx_data =
|
||||
(struct meson_pmx_axg_data *)group->data;
|
||||
|
||||
dev_dbg(pc->dev, "enable function %s, group %s\n", func->name,
|
||||
group->name);
|
||||
|
||||
for (i = 0; i < group->num_pins; i++) {
|
||||
ret = meson_axg_pmx_update_function(pc, group->pins[i],
|
||||
pmx_data->func);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meson_axg_pmx_request_gpio(struct pinctrl_dev *pcdev,
|
||||
struct pinctrl_gpio_range *range, unsigned int offset)
|
||||
{
|
||||
struct meson_pinctrl *pc = pinctrl_dev_get_drvdata(pcdev);
|
||||
|
||||
return meson_axg_pmx_update_function(pc, offset, 0);
|
||||
}
|
||||
|
||||
const struct pinmux_ops meson_axg_pmx_ops = {
|
||||
.set_mux = meson_axg_pmx_set_mux,
|
||||
.get_functions_count = meson_pmx_get_funcs_count,
|
||||
.get_function_name = meson_pmx_get_func_name,
|
||||
.get_function_groups = meson_pmx_get_groups,
|
||||
.gpio_request_enable = meson_axg_pmx_request_gpio,
|
||||
};
|
62
drivers/pinctrl/meson/pinctrl-meson-axg-pmx.h
Normal file
62
drivers/pinctrl/meson/pinctrl-meson-axg-pmx.h
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2017 Baylibre SAS.
|
||||
* Author: Jerome Brunet <jbrunet@baylibre.com>
|
||||
*
|
||||
* Copyright (c) 2017 Amlogic, Inc. All rights reserved.
|
||||
* Author: Xingyu Chen <xingyu.chen@amlogic.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||
*/
|
||||
|
||||
struct meson_pmx_bank {
|
||||
const char *name;
|
||||
unsigned int first;
|
||||
unsigned int last;
|
||||
unsigned int reg;
|
||||
unsigned int offset;
|
||||
};
|
||||
|
||||
struct meson_axg_pmx_data {
|
||||
struct meson_pmx_bank *pmx_banks;
|
||||
unsigned int num_pmx_banks;
|
||||
};
|
||||
|
||||
#define BANK_PMX(n, f, l, r, o) \
|
||||
{ \
|
||||
.name = n, \
|
||||
.first = f, \
|
||||
.last = l, \
|
||||
.reg = r, \
|
||||
.offset = o, \
|
||||
}
|
||||
|
||||
struct meson_pmx_axg_data {
|
||||
unsigned int func;
|
||||
};
|
||||
|
||||
#define PMX_DATA(f) \
|
||||
{ \
|
||||
.func = f, \
|
||||
}
|
||||
|
||||
#define GROUP(grp, f) \
|
||||
{ \
|
||||
.name = #grp, \
|
||||
.pins = grp ## _pins, \
|
||||
.num_pins = ARRAY_SIZE(grp ## _pins), \
|
||||
.data = (const struct meson_pmx_axg_data[]){ \
|
||||
PMX_DATA(f), \
|
||||
}, \
|
||||
}
|
||||
|
||||
#define GPIO_GROUP(gpio) \
|
||||
{ \
|
||||
.name = #gpio, \
|
||||
.pins = (const unsigned int[]){ gpio }, \
|
||||
.num_pins = 1, \
|
||||
.data = (const struct meson_pmx_axg_data[]){ \
|
||||
PMX_DATA(0), \
|
||||
}, \
|
||||
}
|
||||
|
||||
extern const struct pinmux_ops meson_axg_pmx_ops;
|
975
drivers/pinctrl/meson/pinctrl-meson-axg.c
Normal file
975
drivers/pinctrl/meson/pinctrl-meson-axg.c
Normal file
@ -0,0 +1,975 @@
|
||||
/*
|
||||
* Pin controller and GPIO driver for Amlogic Meson AXG SoC.
|
||||
*
|
||||
* Copyright (c) 2017 Amlogic, Inc. All rights reserved.
|
||||
* Author: Xingyu Chen <xingyu.chen@amlogic.com>
|
||||
*
|
||||
* SPDX-License-Identifier: (GPL-2.0+ or MIT)
|
||||
*/
|
||||
|
||||
#include <dt-bindings/gpio/meson-axg-gpio.h>
|
||||
#include "pinctrl-meson.h"
|
||||
#include "pinctrl-meson-axg-pmx.h"
|
||||
|
||||
static const struct pinctrl_pin_desc meson_axg_periphs_pins[] = {
|
||||
MESON_PIN(GPIOZ_0),
|
||||
MESON_PIN(GPIOZ_1),
|
||||
MESON_PIN(GPIOZ_2),
|
||||
MESON_PIN(GPIOZ_3),
|
||||
MESON_PIN(GPIOZ_4),
|
||||
MESON_PIN(GPIOZ_5),
|
||||
MESON_PIN(GPIOZ_6),
|
||||
MESON_PIN(GPIOZ_7),
|
||||
MESON_PIN(GPIOZ_8),
|
||||
MESON_PIN(GPIOZ_9),
|
||||
MESON_PIN(GPIOZ_10),
|
||||
MESON_PIN(BOOT_0),
|
||||
MESON_PIN(BOOT_1),
|
||||
MESON_PIN(BOOT_2),
|
||||
MESON_PIN(BOOT_3),
|
||||
MESON_PIN(BOOT_4),
|
||||
MESON_PIN(BOOT_5),
|
||||
MESON_PIN(BOOT_6),
|
||||
MESON_PIN(BOOT_7),
|
||||
MESON_PIN(BOOT_8),
|
||||
MESON_PIN(BOOT_9),
|
||||
MESON_PIN(BOOT_10),
|
||||
MESON_PIN(BOOT_11),
|
||||
MESON_PIN(BOOT_12),
|
||||
MESON_PIN(BOOT_13),
|
||||
MESON_PIN(BOOT_14),
|
||||
MESON_PIN(GPIOA_0),
|
||||
MESON_PIN(GPIOA_1),
|
||||
MESON_PIN(GPIOA_2),
|
||||
MESON_PIN(GPIOA_3),
|
||||
MESON_PIN(GPIOA_4),
|
||||
MESON_PIN(GPIOA_5),
|
||||
MESON_PIN(GPIOA_6),
|
||||
MESON_PIN(GPIOA_7),
|
||||
MESON_PIN(GPIOA_8),
|
||||
MESON_PIN(GPIOA_9),
|
||||
MESON_PIN(GPIOA_10),
|
||||
MESON_PIN(GPIOA_11),
|
||||
MESON_PIN(GPIOA_12),
|
||||
MESON_PIN(GPIOA_13),
|
||||
MESON_PIN(GPIOA_14),
|
||||
MESON_PIN(GPIOA_15),
|
||||
MESON_PIN(GPIOA_16),
|
||||
MESON_PIN(GPIOA_17),
|
||||
MESON_PIN(GPIOA_18),
|
||||
MESON_PIN(GPIOA_19),
|
||||
MESON_PIN(GPIOA_20),
|
||||
MESON_PIN(GPIOX_0),
|
||||
MESON_PIN(GPIOX_1),
|
||||
MESON_PIN(GPIOX_2),
|
||||
MESON_PIN(GPIOX_3),
|
||||
MESON_PIN(GPIOX_4),
|
||||
MESON_PIN(GPIOX_5),
|
||||
MESON_PIN(GPIOX_6),
|
||||
MESON_PIN(GPIOX_7),
|
||||
MESON_PIN(GPIOX_8),
|
||||
MESON_PIN(GPIOX_9),
|
||||
MESON_PIN(GPIOX_10),
|
||||
MESON_PIN(GPIOX_11),
|
||||
MESON_PIN(GPIOX_12),
|
||||
MESON_PIN(GPIOX_13),
|
||||
MESON_PIN(GPIOX_14),
|
||||
MESON_PIN(GPIOX_15),
|
||||
MESON_PIN(GPIOX_16),
|
||||
MESON_PIN(GPIOX_17),
|
||||
MESON_PIN(GPIOX_18),
|
||||
MESON_PIN(GPIOX_19),
|
||||
MESON_PIN(GPIOX_20),
|
||||
MESON_PIN(GPIOX_21),
|
||||
MESON_PIN(GPIOX_22),
|
||||
MESON_PIN(GPIOY_0),
|
||||
MESON_PIN(GPIOY_1),
|
||||
MESON_PIN(GPIOY_2),
|
||||
MESON_PIN(GPIOY_3),
|
||||
MESON_PIN(GPIOY_4),
|
||||
MESON_PIN(GPIOY_5),
|
||||
MESON_PIN(GPIOY_6),
|
||||
MESON_PIN(GPIOY_7),
|
||||
MESON_PIN(GPIOY_8),
|
||||
MESON_PIN(GPIOY_9),
|
||||
MESON_PIN(GPIOY_10),
|
||||
MESON_PIN(GPIOY_11),
|
||||
MESON_PIN(GPIOY_12),
|
||||
MESON_PIN(GPIOY_13),
|
||||
MESON_PIN(GPIOY_14),
|
||||
MESON_PIN(GPIOY_15),
|
||||
};
|
||||
|
||||
static const struct pinctrl_pin_desc meson_axg_aobus_pins[] = {
|
||||
MESON_PIN(GPIOAO_0),
|
||||
MESON_PIN(GPIOAO_1),
|
||||
MESON_PIN(GPIOAO_2),
|
||||
MESON_PIN(GPIOAO_3),
|
||||
MESON_PIN(GPIOAO_4),
|
||||
MESON_PIN(GPIOAO_5),
|
||||
MESON_PIN(GPIOAO_6),
|
||||
MESON_PIN(GPIOAO_7),
|
||||
MESON_PIN(GPIOAO_8),
|
||||
MESON_PIN(GPIOAO_9),
|
||||
MESON_PIN(GPIOAO_10),
|
||||
MESON_PIN(GPIOAO_11),
|
||||
MESON_PIN(GPIOAO_12),
|
||||
MESON_PIN(GPIOAO_13),
|
||||
MESON_PIN(GPIO_TEST_N),
|
||||
};
|
||||
|
||||
/* emmc */
|
||||
static const unsigned int emmc_nand_d0_pins[] = {BOOT_0};
|
||||
static const unsigned int emmc_nand_d1_pins[] = {BOOT_1};
|
||||
static const unsigned int emmc_nand_d2_pins[] = {BOOT_2};
|
||||
static const unsigned int emmc_nand_d3_pins[] = {BOOT_3};
|
||||
static const unsigned int emmc_nand_d4_pins[] = {BOOT_4};
|
||||
static const unsigned int emmc_nand_d5_pins[] = {BOOT_5};
|
||||
static const unsigned int emmc_nand_d6_pins[] = {BOOT_6};
|
||||
static const unsigned int emmc_nand_d7_pins[] = {BOOT_7};
|
||||
|
||||
static const unsigned int emmc_clk_pins[] = {BOOT_8};
|
||||
static const unsigned int emmc_cmd_pins[] = {BOOT_10};
|
||||
static const unsigned int emmc_ds_pins[] = {BOOT_13};
|
||||
|
||||
/* nand */
|
||||
static const unsigned int nand_ce0_pins[] = {BOOT_8};
|
||||
static const unsigned int nand_ale_pins[] = {BOOT_9};
|
||||
static const unsigned int nand_cle_pins[] = {BOOT_10};
|
||||
static const unsigned int nand_wen_clk_pins[] = {BOOT_11};
|
||||
static const unsigned int nand_ren_wr_pins[] = {BOOT_12};
|
||||
static const unsigned int nand_rb0_pins[] = {BOOT_13};
|
||||
|
||||
/* nor */
|
||||
static const unsigned int nor_hold_pins[] = {BOOT_3};
|
||||
static const unsigned int nor_d_pins[] = {BOOT_4};
|
||||
static const unsigned int nor_q_pins[] = {BOOT_5};
|
||||
static const unsigned int nor_c_pins[] = {BOOT_6};
|
||||
static const unsigned int nor_wp_pins[] = {BOOT_9};
|
||||
static const unsigned int nor_cs_pins[] = {BOOT_14};
|
||||
|
||||
/* sdio */
|
||||
static const unsigned int sdio_d0_pins[] = {GPIOX_0};
|
||||
static const unsigned int sdio_d1_pins[] = {GPIOX_1};
|
||||
static const unsigned int sdio_d2_pins[] = {GPIOX_2};
|
||||
static const unsigned int sdio_d3_pins[] = {GPIOX_3};
|
||||
static const unsigned int sdio_clk_pins[] = {GPIOX_4};
|
||||
static const unsigned int sdio_cmd_pins[] = {GPIOX_5};
|
||||
|
||||
/* spi0 */
|
||||
static const unsigned int spi0_clk_pins[] = {GPIOZ_0};
|
||||
static const unsigned int spi0_mosi_pins[] = {GPIOZ_1};
|
||||
static const unsigned int spi0_miso_pins[] = {GPIOZ_2};
|
||||
static const unsigned int spi0_ss0_pins[] = {GPIOZ_3};
|
||||
static const unsigned int spi0_ss1_pins[] = {GPIOZ_4};
|
||||
static const unsigned int spi0_ss2_pins[] = {GPIOZ_5};
|
||||
|
||||
/* spi1 */
|
||||
static const unsigned int spi1_clk_x_pins[] = {GPIOX_19};
|
||||
static const unsigned int spi1_mosi_x_pins[] = {GPIOX_17};
|
||||
static const unsigned int spi1_miso_x_pins[] = {GPIOX_18};
|
||||
static const unsigned int spi1_ss0_x_pins[] = {GPIOX_16};
|
||||
|
||||
static const unsigned int spi1_clk_a_pins[] = {GPIOA_4};
|
||||
static const unsigned int spi1_mosi_a_pins[] = {GPIOA_2};
|
||||
static const unsigned int spi1_miso_a_pins[] = {GPIOA_3};
|
||||
static const unsigned int spi1_ss0_a_pins[] = {GPIOA_5};
|
||||
static const unsigned int spi1_ss1_pins[] = {GPIOA_6};
|
||||
|
||||
/* i2c0 */
|
||||
static const unsigned int i2c0_sck_pins[] = {GPIOZ_6};
|
||||
static const unsigned int i2c0_sda_pins[] = {GPIOZ_7};
|
||||
|
||||
/* i2c1 */
|
||||
static const unsigned int i2c1_sck_z_pins[] = {GPIOZ_8};
|
||||
static const unsigned int i2c1_sda_z_pins[] = {GPIOZ_9};
|
||||
|
||||
static const unsigned int i2c1_sck_x_pins[] = {GPIOX_16};
|
||||
static const unsigned int i2c1_sda_x_pins[] = {GPIOX_17};
|
||||
|
||||
/* i2c2 */
|
||||
static const unsigned int i2c2_sck_x_pins[] = {GPIOX_18};
|
||||
static const unsigned int i2c2_sda_x_pins[] = {GPIOX_19};
|
||||
|
||||
static const unsigned int i2c2_sda_a_pins[] = {GPIOA_17};
|
||||
static const unsigned int i2c2_sck_a_pins[] = {GPIOA_18};
|
||||
|
||||
/* i2c3 */
|
||||
static const unsigned int i2c3_sda_a6_pins[] = {GPIOA_6};
|
||||
static const unsigned int i2c3_sck_a7_pins[] = {GPIOA_7};
|
||||
|
||||
static const unsigned int i2c3_sda_a12_pins[] = {GPIOA_12};
|
||||
static const unsigned int i2c3_sck_a13_pins[] = {GPIOA_13};
|
||||
|
||||
static const unsigned int i2c3_sda_a19_pins[] = {GPIOA_19};
|
||||
static const unsigned int i2c3_sck_a20_pins[] = {GPIOA_20};
|
||||
|
||||
/* uart_a */
|
||||
static const unsigned int uart_rts_a_pins[] = {GPIOX_11};
|
||||
static const unsigned int uart_cts_a_pins[] = {GPIOX_10};
|
||||
static const unsigned int uart_tx_a_pins[] = {GPIOX_8};
|
||||
static const unsigned int uart_rx_a_pins[] = {GPIOX_9};
|
||||
|
||||
/* uart_b */
|
||||
static const unsigned int uart_rts_b_z_pins[] = {GPIOZ_0};
|
||||
static const unsigned int uart_cts_b_z_pins[] = {GPIOZ_1};
|
||||
static const unsigned int uart_tx_b_z_pins[] = {GPIOZ_2};
|
||||
static const unsigned int uart_rx_b_z_pins[] = {GPIOZ_3};
|
||||
|
||||
static const unsigned int uart_rts_b_x_pins[] = {GPIOX_18};
|
||||
static const unsigned int uart_cts_b_x_pins[] = {GPIOX_19};
|
||||
static const unsigned int uart_tx_b_x_pins[] = {GPIOX_16};
|
||||
static const unsigned int uart_rx_b_x_pins[] = {GPIOX_17};
|
||||
|
||||
/* uart_ao_b */
|
||||
static const unsigned int uart_ao_tx_b_z_pins[] = {GPIOZ_8};
|
||||
static const unsigned int uart_ao_rx_b_z_pins[] = {GPIOZ_9};
|
||||
static const unsigned int uart_ao_cts_b_z_pins[] = {GPIOZ_6};
|
||||
static const unsigned int uart_ao_rts_b_z_pins[] = {GPIOZ_7};
|
||||
|
||||
/* pwm_a */
|
||||
static const unsigned int pwm_a_z_pins[] = {GPIOZ_5};
|
||||
|
||||
static const unsigned int pwm_a_x18_pins[] = {GPIOX_18};
|
||||
static const unsigned int pwm_a_x20_pins[] = {GPIOX_20};
|
||||
|
||||
static const unsigned int pwm_a_a_pins[] = {GPIOA_14};
|
||||
|
||||
/* pwm_b */
|
||||
static const unsigned int pwm_b_z_pins[] = {GPIOZ_4};
|
||||
|
||||
static const unsigned int pwm_b_x_pins[] = {GPIOX_19};
|
||||
|
||||
static const unsigned int pwm_b_a_pins[] = {GPIOA_15};
|
||||
|
||||
/* pwm_c */
|
||||
static const unsigned int pwm_c_x10_pins[] = {GPIOX_10};
|
||||
static const unsigned int pwm_c_x17_pins[] = {GPIOX_17};
|
||||
|
||||
static const unsigned int pwm_c_a_pins[] = {GPIOA_16};
|
||||
|
||||
/* pwm_d */
|
||||
static const unsigned int pwm_d_x11_pins[] = {GPIOX_11};
|
||||
static const unsigned int pwm_d_x16_pins[] = {GPIOX_16};
|
||||
|
||||
/* pwm_vs */
|
||||
static const unsigned int pwm_vs_pins[] = {GPIOA_0};
|
||||
|
||||
/* spdif_in */
|
||||
static const unsigned int spdif_in_z_pins[] = {GPIOZ_4};
|
||||
|
||||
static const unsigned int spdif_in_a1_pins[] = {GPIOA_1};
|
||||
static const unsigned int spdif_in_a7_pins[] = {GPIOA_7};
|
||||
static const unsigned int spdif_in_a19_pins[] = {GPIOA_19};
|
||||
static const unsigned int spdif_in_a20_pins[] = {GPIOA_20};
|
||||
|
||||
/* spdif_out */
|
||||
static const unsigned int spdif_out_z_pins[] = {GPIOZ_5};
|
||||
|
||||
static const unsigned int spdif_out_a1_pins[] = {GPIOA_1};
|
||||
static const unsigned int spdif_out_a11_pins[] = {GPIOA_11};
|
||||
static const unsigned int spdif_out_a19_pins[] = {GPIOA_19};
|
||||
static const unsigned int spdif_out_a20_pins[] = {GPIOA_20};
|
||||
|
||||
/* jtag_ee */
|
||||
static const unsigned int jtag_tdo_x_pins[] = {GPIOX_0};
|
||||
static const unsigned int jtag_tdi_x_pins[] = {GPIOX_1};
|
||||
static const unsigned int jtag_clk_x_pins[] = {GPIOX_4};
|
||||
static const unsigned int jtag_tms_x_pins[] = {GPIOX_5};
|
||||
|
||||
/* eth */
|
||||
static const unsigned int eth_txd0_x_pins[] = {GPIOX_8};
|
||||
static const unsigned int eth_txd1_x_pins[] = {GPIOX_9};
|
||||
static const unsigned int eth_txen_x_pins[] = {GPIOX_10};
|
||||
static const unsigned int eth_rgmii_rx_clk_x_pins[] = {GPIOX_12};
|
||||
static const unsigned int eth_rxd0_x_pins[] = {GPIOX_13};
|
||||
static const unsigned int eth_rxd1_x_pins[] = {GPIOX_14};
|
||||
static const unsigned int eth_rx_dv_x_pins[] = {GPIOX_15};
|
||||
static const unsigned int eth_mdio_x_pins[] = {GPIOX_21};
|
||||
static const unsigned int eth_mdc_x_pins[] = {GPIOX_22};
|
||||
|
||||
static const unsigned int eth_txd0_y_pins[] = {GPIOY_10};
|
||||
static const unsigned int eth_txd1_y_pins[] = {GPIOY_11};
|
||||
static const unsigned int eth_txen_y_pins[] = {GPIOY_9};
|
||||
static const unsigned int eth_rgmii_rx_clk_y_pins[] = {GPIOY_2};
|
||||
static const unsigned int eth_rxd0_y_pins[] = {GPIOY_4};
|
||||
static const unsigned int eth_rxd1_y_pins[] = {GPIOY_5};
|
||||
static const unsigned int eth_rx_dv_y_pins[] = {GPIOY_3};
|
||||
static const unsigned int eth_mdio_y_pins[] = {GPIOY_0};
|
||||
static const unsigned int eth_mdc_y_pins[] = {GPIOY_1};
|
||||
|
||||
static const unsigned int eth_rxd2_rgmii_pins[] = {GPIOY_6};
|
||||
static const unsigned int eth_rxd3_rgmii_pins[] = {GPIOY_7};
|
||||
static const unsigned int eth_rgmii_tx_clk_pins[] = {GPIOY_8};
|
||||
static const unsigned int eth_txd2_rgmii_pins[] = {GPIOY_12};
|
||||
static const unsigned int eth_txd3_rgmii_pins[] = {GPIOY_13};
|
||||
|
||||
/* pdm */
|
||||
static const unsigned int pdm_dclk_a14_pins[] = {GPIOA_14};
|
||||
static const unsigned int pdm_dclk_a19_pins[] = {GPIOA_19};
|
||||
static const unsigned int pdm_din0_pins[] = {GPIOA_15};
|
||||
static const unsigned int pdm_din1_pins[] = {GPIOA_16};
|
||||
static const unsigned int pdm_din2_pins[] = {GPIOA_17};
|
||||
static const unsigned int pdm_din3_pins[] = {GPIOA_18};
|
||||
|
||||
static struct meson_pmx_group meson_axg_periphs_groups[] = {
|
||||
GPIO_GROUP(GPIOZ_0),
|
||||
GPIO_GROUP(GPIOZ_1),
|
||||
GPIO_GROUP(GPIOZ_2),
|
||||
GPIO_GROUP(GPIOZ_3),
|
||||
GPIO_GROUP(GPIOZ_4),
|
||||
GPIO_GROUP(GPIOZ_5),
|
||||
GPIO_GROUP(GPIOZ_6),
|
||||
GPIO_GROUP(GPIOZ_7),
|
||||
GPIO_GROUP(GPIOZ_8),
|
||||
GPIO_GROUP(GPIOZ_9),
|
||||
GPIO_GROUP(GPIOZ_10),
|
||||
|
||||
GPIO_GROUP(BOOT_0),
|
||||
GPIO_GROUP(BOOT_1),
|
||||
GPIO_GROUP(BOOT_2),
|
||||
GPIO_GROUP(BOOT_3),
|
||||
GPIO_GROUP(BOOT_4),
|
||||
GPIO_GROUP(BOOT_5),
|
||||
GPIO_GROUP(BOOT_6),
|
||||
GPIO_GROUP(BOOT_7),
|
||||
GPIO_GROUP(BOOT_8),
|
||||
GPIO_GROUP(BOOT_9),
|
||||
GPIO_GROUP(BOOT_10),
|
||||
GPIO_GROUP(BOOT_11),
|
||||
GPIO_GROUP(BOOT_12),
|
||||
GPIO_GROUP(BOOT_13),
|
||||
GPIO_GROUP(BOOT_14),
|
||||
|
||||
GPIO_GROUP(GPIOA_0),
|
||||
GPIO_GROUP(GPIOA_1),
|
||||
GPIO_GROUP(GPIOA_2),
|
||||
GPIO_GROUP(GPIOA_3),
|
||||
GPIO_GROUP(GPIOA_4),
|
||||
GPIO_GROUP(GPIOA_5),
|
||||
GPIO_GROUP(GPIOA_6),
|
||||
GPIO_GROUP(GPIOA_7),
|
||||
GPIO_GROUP(GPIOA_8),
|
||||
GPIO_GROUP(GPIOA_9),
|
||||
GPIO_GROUP(GPIOA_10),
|
||||
GPIO_GROUP(GPIOA_11),
|
||||
GPIO_GROUP(GPIOA_12),
|
||||
GPIO_GROUP(GPIOA_13),
|
||||
GPIO_GROUP(GPIOA_14),
|
||||
GPIO_GROUP(GPIOA_15),
|
||||
GPIO_GROUP(GPIOA_16),
|
||||
GPIO_GROUP(GPIOA_17),
|
||||
GPIO_GROUP(GPIOA_19),
|
||||
GPIO_GROUP(GPIOA_20),
|
||||
|
||||
GPIO_GROUP(GPIOX_0),
|
||||
GPIO_GROUP(GPIOX_1),
|
||||
GPIO_GROUP(GPIOX_2),
|
||||
GPIO_GROUP(GPIOX_3),
|
||||
GPIO_GROUP(GPIOX_4),
|
||||
GPIO_GROUP(GPIOX_5),
|
||||
GPIO_GROUP(GPIOX_6),
|
||||
GPIO_GROUP(GPIOX_7),
|
||||
GPIO_GROUP(GPIOX_8),
|
||||
GPIO_GROUP(GPIOX_9),
|
||||
GPIO_GROUP(GPIOX_10),
|
||||
GPIO_GROUP(GPIOX_11),
|
||||
GPIO_GROUP(GPIOX_12),
|
||||
GPIO_GROUP(GPIOX_13),
|
||||
GPIO_GROUP(GPIOX_14),
|
||||
GPIO_GROUP(GPIOX_15),
|
||||
GPIO_GROUP(GPIOX_16),
|
||||
GPIO_GROUP(GPIOX_17),
|
||||
GPIO_GROUP(GPIOX_18),
|
||||
GPIO_GROUP(GPIOX_19),
|
||||
GPIO_GROUP(GPIOX_20),
|
||||
GPIO_GROUP(GPIOX_21),
|
||||
GPIO_GROUP(GPIOX_22),
|
||||
|
||||
GPIO_GROUP(GPIOY_0),
|
||||
GPIO_GROUP(GPIOY_1),
|
||||
GPIO_GROUP(GPIOY_2),
|
||||
GPIO_GROUP(GPIOY_3),
|
||||
GPIO_GROUP(GPIOY_4),
|
||||
GPIO_GROUP(GPIOY_5),
|
||||
GPIO_GROUP(GPIOY_6),
|
||||
GPIO_GROUP(GPIOY_7),
|
||||
GPIO_GROUP(GPIOY_8),
|
||||
GPIO_GROUP(GPIOY_9),
|
||||
GPIO_GROUP(GPIOY_10),
|
||||
GPIO_GROUP(GPIOY_11),
|
||||
GPIO_GROUP(GPIOY_12),
|
||||
GPIO_GROUP(GPIOY_13),
|
||||
GPIO_GROUP(GPIOY_14),
|
||||
GPIO_GROUP(GPIOY_15),
|
||||
|
||||
/* bank BOOT */
|
||||
GROUP(emmc_nand_d0, 1),
|
||||
GROUP(emmc_nand_d1, 1),
|
||||
GROUP(emmc_nand_d2, 1),
|
||||
GROUP(emmc_nand_d3, 1),
|
||||
GROUP(emmc_nand_d4, 1),
|
||||
GROUP(emmc_nand_d5, 1),
|
||||
GROUP(emmc_nand_d6, 1),
|
||||
GROUP(emmc_nand_d7, 1),
|
||||
GROUP(emmc_clk, 1),
|
||||
GROUP(emmc_cmd, 1),
|
||||
GROUP(emmc_ds, 1),
|
||||
GROUP(nand_ce0, 2),
|
||||
GROUP(nand_ale, 2),
|
||||
GROUP(nand_cle, 2),
|
||||
GROUP(nand_wen_clk, 2),
|
||||
GROUP(nand_ren_wr, 2),
|
||||
GROUP(nand_rb0, 2),
|
||||
GROUP(nor_hold, 3),
|
||||
GROUP(nor_d, 3),
|
||||
GROUP(nor_q, 3),
|
||||
GROUP(nor_c, 3),
|
||||
GROUP(nor_wp, 3),
|
||||
GROUP(nor_cs, 3),
|
||||
|
||||
/* bank GPIOZ */
|
||||
GROUP(spi0_clk, 1),
|
||||
GROUP(spi0_mosi, 1),
|
||||
GROUP(spi0_miso, 1),
|
||||
GROUP(spi0_ss0, 1),
|
||||
GROUP(spi0_ss1, 1),
|
||||
GROUP(spi0_ss2, 1),
|
||||
GROUP(i2c0_sck, 1),
|
||||
GROUP(i2c0_sda, 1),
|
||||
GROUP(i2c1_sck_z, 1),
|
||||
GROUP(i2c1_sda_z, 1),
|
||||
GROUP(uart_rts_b_z, 2),
|
||||
GROUP(uart_cts_b_z, 2),
|
||||
GROUP(uart_tx_b_z, 2),
|
||||
GROUP(uart_rx_b_z, 2),
|
||||
GROUP(pwm_a_z, 2),
|
||||
GROUP(pwm_b_z, 2),
|
||||
GROUP(spdif_in_z, 3),
|
||||
GROUP(spdif_out_z, 3),
|
||||
GROUP(uart_ao_tx_b_z, 2),
|
||||
GROUP(uart_ao_rx_b_z, 2),
|
||||
GROUP(uart_ao_cts_b_z, 2),
|
||||
GROUP(uart_ao_rts_b_z, 2),
|
||||
|
||||
/* bank GPIOX */
|
||||
GROUP(sdio_d0, 1),
|
||||
GROUP(sdio_d1, 1),
|
||||
GROUP(sdio_d2, 1),
|
||||
GROUP(sdio_d3, 1),
|
||||
GROUP(sdio_clk, 1),
|
||||
GROUP(sdio_cmd, 1),
|
||||
GROUP(i2c1_sck_x, 1),
|
||||
GROUP(i2c1_sda_x, 1),
|
||||
GROUP(i2c2_sck_x, 1),
|
||||
GROUP(i2c2_sda_x, 1),
|
||||
GROUP(uart_rts_a, 1),
|
||||
GROUP(uart_cts_a, 1),
|
||||
GROUP(uart_tx_a, 1),
|
||||
GROUP(uart_rx_a, 1),
|
||||
GROUP(uart_rts_b_x, 2),
|
||||
GROUP(uart_cts_b_x, 2),
|
||||
GROUP(uart_tx_b_x, 2),
|
||||
GROUP(uart_rx_b_x, 2),
|
||||
GROUP(jtag_tdo_x, 2),
|
||||
GROUP(jtag_tdi_x, 2),
|
||||
GROUP(jtag_clk_x, 2),
|
||||
GROUP(jtag_tms_x, 2),
|
||||
GROUP(spi1_clk_x, 4),
|
||||
GROUP(spi1_mosi_x, 4),
|
||||
GROUP(spi1_miso_x, 4),
|
||||
GROUP(spi1_ss0_x, 4),
|
||||
GROUP(pwm_a_x18, 3),
|
||||
GROUP(pwm_a_x20, 1),
|
||||
GROUP(pwm_b_x, 3),
|
||||
GROUP(pwm_c_x10, 3),
|
||||
GROUP(pwm_c_x17, 3),
|
||||
GROUP(pwm_d_x11, 3),
|
||||
GROUP(pwm_d_x16, 3),
|
||||
GROUP(eth_txd0_x, 4),
|
||||
GROUP(eth_txd1_x, 4),
|
||||
GROUP(eth_txen_x, 4),
|
||||
GROUP(eth_rgmii_rx_clk_x, 4),
|
||||
GROUP(eth_rxd0_x, 4),
|
||||
GROUP(eth_rxd1_x, 4),
|
||||
GROUP(eth_rx_dv_x, 4),
|
||||
GROUP(eth_mdio_x, 4),
|
||||
GROUP(eth_mdc_x, 4),
|
||||
|
||||
/* bank GPIOY */
|
||||
GROUP(eth_txd0_y, 1),
|
||||
GROUP(eth_txd1_y, 1),
|
||||
GROUP(eth_txen_y, 1),
|
||||
GROUP(eth_rgmii_rx_clk_y, 1),
|
||||
GROUP(eth_rxd0_y, 1),
|
||||
GROUP(eth_rxd1_y, 1),
|
||||
GROUP(eth_rx_dv_y, 1),
|
||||
GROUP(eth_mdio_y, 1),
|
||||
GROUP(eth_mdc_y, 1),
|
||||
GROUP(eth_rxd2_rgmii, 1),
|
||||
GROUP(eth_rxd3_rgmii, 1),
|
||||
GROUP(eth_rgmii_tx_clk, 1),
|
||||
GROUP(eth_txd2_rgmii, 1),
|
||||
GROUP(eth_txd3_rgmii, 1),
|
||||
|
||||
/* bank GPIOA */
|
||||
GROUP(spdif_out_a1, 4),
|
||||
GROUP(spdif_out_a11, 3),
|
||||
GROUP(spdif_out_a19, 2),
|
||||
GROUP(spdif_out_a20, 1),
|
||||
GROUP(spdif_in_a1, 3),
|
||||
GROUP(spdif_in_a7, 3),
|
||||
GROUP(spdif_in_a19, 1),
|
||||
GROUP(spdif_in_a20, 2),
|
||||
GROUP(spi1_clk_a, 3),
|
||||
GROUP(spi1_mosi_a, 3),
|
||||
GROUP(spi1_miso_a, 3),
|
||||
GROUP(spi1_ss0_a, 3),
|
||||
GROUP(spi1_ss1, 3),
|
||||
GROUP(pwm_a_a, 3),
|
||||
GROUP(pwm_b_a, 3),
|
||||
GROUP(pwm_c_a, 3),
|
||||
GROUP(pwm_vs, 2),
|
||||
GROUP(i2c2_sda_a, 3),
|
||||
GROUP(i2c2_sck_a, 3),
|
||||
GROUP(i2c3_sda_a6, 4),
|
||||
GROUP(i2c3_sck_a7, 4),
|
||||
GROUP(i2c3_sda_a12, 4),
|
||||
GROUP(i2c3_sck_a13, 4),
|
||||
GROUP(i2c3_sda_a19, 4),
|
||||
GROUP(i2c3_sck_a20, 4),
|
||||
GROUP(pdm_dclk_a14, 1),
|
||||
GROUP(pdm_dclk_a19, 3),
|
||||
GROUP(pdm_din0, 1),
|
||||
GROUP(pdm_din1, 1),
|
||||
GROUP(pdm_din2, 1),
|
||||
GROUP(pdm_din3, 1),
|
||||
};
|
||||
|
||||
/* uart_ao_a */
|
||||
static const unsigned int uart_ao_tx_a_pins[] = {GPIOAO_0};
|
||||
static const unsigned int uart_ao_rx_a_pins[] = {GPIOAO_1};
|
||||
static const unsigned int uart_ao_cts_a_pins[] = {GPIOAO_2};
|
||||
static const unsigned int uart_ao_rts_a_pins[] = {GPIOAO_3};
|
||||
|
||||
/* uart_ao_b */
|
||||
static const unsigned int uart_ao_tx_b_pins[] = {GPIOAO_4};
|
||||
static const unsigned int uart_ao_rx_b_pins[] = {GPIOAO_5};
|
||||
static const unsigned int uart_ao_cts_b_pins[] = {GPIOAO_2};
|
||||
static const unsigned int uart_ao_rts_b_pins[] = {GPIOAO_3};
|
||||
|
||||
/* i2c_ao */
|
||||
static const unsigned int i2c_ao_sck_4_pins[] = {GPIOAO_4};
|
||||
static const unsigned int i2c_ao_sda_5_pins[] = {GPIOAO_5};
|
||||
static const unsigned int i2c_ao_sck_8_pins[] = {GPIOAO_8};
|
||||
static const unsigned int i2c_ao_sda_9_pins[] = {GPIOAO_9};
|
||||
static const unsigned int i2c_ao_sck_10_pins[] = {GPIOAO_10};
|
||||
static const unsigned int i2c_ao_sda_11_pins[] = {GPIOAO_11};
|
||||
|
||||
/* i2c_ao_slave */
|
||||
static const unsigned int i2c_ao_slave_sck_pins[] = {GPIOAO_10};
|
||||
static const unsigned int i2c_ao_slave_sda_pins[] = {GPIOAO_11};
|
||||
|
||||
/* ir_in */
|
||||
static const unsigned int remote_input_ao_pins[] = {GPIOAO_6};
|
||||
|
||||
/* ir_out */
|
||||
static const unsigned int remote_out_ao_pins[] = {GPIOAO_7};
|
||||
|
||||
/* pwm_ao_a */
|
||||
static const unsigned int pwm_ao_a_pins[] = {GPIOAO_3};
|
||||
|
||||
/* pwm_ao_b */
|
||||
static const unsigned int pwm_ao_b_ao2_pins[] = {GPIOAO_2};
|
||||
static const unsigned int pwm_ao_b_ao12_pins[] = {GPIOAO_12};
|
||||
|
||||
/* pwm_ao_c */
|
||||
static const unsigned int pwm_ao_c_ao8_pins[] = {GPIOAO_8};
|
||||
static const unsigned int pwm_ao_c_ao13_pins[] = {GPIOAO_13};
|
||||
|
||||
/* pwm_ao_d */
|
||||
static const unsigned int pwm_ao_d_pins[] = {GPIOAO_9};
|
||||
|
||||
/* jtag_ao */
|
||||
static const unsigned int jtag_ao_tdi_pins[] = {GPIOAO_3};
|
||||
static const unsigned int jtag_ao_tdo_pins[] = {GPIOAO_4};
|
||||
static const unsigned int jtag_ao_clk_pins[] = {GPIOAO_5};
|
||||
static const unsigned int jtag_ao_tms_pins[] = {GPIOAO_7};
|
||||
|
||||
static struct meson_pmx_group meson_axg_aobus_groups[] = {
|
||||
GPIO_GROUP(GPIOAO_0),
|
||||
GPIO_GROUP(GPIOAO_1),
|
||||
GPIO_GROUP(GPIOAO_2),
|
||||
GPIO_GROUP(GPIOAO_3),
|
||||
GPIO_GROUP(GPIOAO_4),
|
||||
GPIO_GROUP(GPIOAO_5),
|
||||
GPIO_GROUP(GPIOAO_6),
|
||||
GPIO_GROUP(GPIOAO_7),
|
||||
GPIO_GROUP(GPIOAO_8),
|
||||
GPIO_GROUP(GPIOAO_9),
|
||||
GPIO_GROUP(GPIOAO_10),
|
||||
GPIO_GROUP(GPIOAO_11),
|
||||
GPIO_GROUP(GPIOAO_12),
|
||||
GPIO_GROUP(GPIOAO_13),
|
||||
GPIO_GROUP(GPIO_TEST_N),
|
||||
|
||||
/* bank AO */
|
||||
GROUP(uart_ao_tx_a, 1),
|
||||
GROUP(uart_ao_rx_a, 1),
|
||||
GROUP(uart_ao_cts_a, 2),
|
||||
GROUP(uart_ao_rts_a, 2),
|
||||
GROUP(uart_ao_tx_b, 1),
|
||||
GROUP(uart_ao_rx_b, 1),
|
||||
GROUP(uart_ao_cts_b, 1),
|
||||
GROUP(uart_ao_rts_b, 1),
|
||||
GROUP(i2c_ao_sck_4, 2),
|
||||
GROUP(i2c_ao_sda_5, 2),
|
||||
GROUP(i2c_ao_sck_8, 2),
|
||||
GROUP(i2c_ao_sda_9, 2),
|
||||
GROUP(i2c_ao_sck_10, 2),
|
||||
GROUP(i2c_ao_sda_11, 2),
|
||||
GROUP(i2c_ao_slave_sck, 1),
|
||||
GROUP(i2c_ao_slave_sda, 1),
|
||||
GROUP(remote_input_ao, 1),
|
||||
GROUP(remote_out_ao, 1),
|
||||
GROUP(pwm_ao_a, 3),
|
||||
GROUP(pwm_ao_b_ao2, 3),
|
||||
GROUP(pwm_ao_b_ao12, 3),
|
||||
GROUP(pwm_ao_c_ao8, 3),
|
||||
GROUP(pwm_ao_c_ao13, 3),
|
||||
GROUP(pwm_ao_d, 3),
|
||||
GROUP(jtag_ao_tdi, 4),
|
||||
GROUP(jtag_ao_tdo, 4),
|
||||
GROUP(jtag_ao_clk, 4),
|
||||
GROUP(jtag_ao_tms, 4),
|
||||
};
|
||||
|
||||
static const char * const gpio_periphs_groups[] = {
|
||||
"GPIOZ_0", "GPIOZ_1", "GPIOZ_2", "GPIOZ_3", "GPIOZ_4",
|
||||
"GPIOZ_5", "GPIOZ_6", "GPIOZ_7", "GPIOZ_8", "GPIOZ_9",
|
||||
"GPIOZ_10",
|
||||
|
||||
"BOOT_0", "BOOT_1", "BOOT_2", "BOOT_3", "BOOT_4",
|
||||
"BOOT_5", "BOOT_6", "BOOT_7", "BOOT_8", "BOOT_9",
|
||||
"BOOT_10", "BOOT_11", "BOOT_12", "BOOT_13", "BOOT_14",
|
||||
|
||||
"GPIOA_0", "GPIOA_1", "GPIOA_2", "GPIOA_3", "GPIOA_4",
|
||||
"GPIOA_5", "GPIOA_6", "GPIOA_7", "GPIOA_8", "GPIOA_9",
|
||||
"GPIOA_10", "GPIOA_11", "GPIOA_12", "GPIOA_13", "GPIOA_14",
|
||||
"GPIOA_15", "GPIOA_16", "GPIOA_17", "GPIOA_18", "GPIOA_19",
|
||||
"GPIOA_20",
|
||||
|
||||
"GPIOX_0", "GPIOX_1", "GPIOX_2", "GPIOX_3", "GPIOX_4",
|
||||
"GPIOX_5", "GPIOX_6", "GPIOX_7", "GPIOX_8", "GPIOX_9",
|
||||
"GPIOX_10", "GPIOX_11", "GPIOX_12", "GPIOX_13", "GPIOX_14",
|
||||
"GPIOX_15", "GPIOX_16", "GPIOX_17", "GPIOX_18", "GPIOX_19",
|
||||
"GPIOX_20", "GPIOX_21", "GPIOX_22",
|
||||
|
||||
"GPIOY_0", "GPIOY_1", "GPIOY_2", "GPIOY_3", "GPIOY_4",
|
||||
"GPIOY_5", "GPIOY_6", "GPIOY_7", "GPIOY_8", "GPIOY_9",
|
||||
"GPIOY_10", "GPIOY_11", "GPIOY_12", "GPIOY_13", "GPIOY_14",
|
||||
"GPIOY_15",
|
||||
};
|
||||
|
||||
static const char * const emmc_groups[] = {
|
||||
"emmc_nand_d0", "emmc_nand_d1", "emmc_nand_d2",
|
||||
"emmc_nand_d3", "emmc_nand_d4", "emmc_nand_d5",
|
||||
"emmc_nand_d6", "emmc_nand_d7",
|
||||
"emmc_clk", "emmc_cmd", "emmc_ds",
|
||||
};
|
||||
|
||||
static const char * const nand_groups[] = {
|
||||
"emmc_nand_d0", "emmc_nand_d1", "emmc_nand_d2",
|
||||
"emmc_nand_d3", "emmc_nand_d4", "emmc_nand_d5",
|
||||
"emmc_nand_d6", "emmc_nand_d7",
|
||||
"nand_ce0", "nand_ale", "nand_cle",
|
||||
"nand_wen_clk", "nand_ren_wr", "nand_rb0",
|
||||
};
|
||||
|
||||
static const char * const nor_groups[] = {
|
||||
"nor_d", "nor_q", "nor_c", "nor_cs",
|
||||
"nor_hold", "nor_wp",
|
||||
};
|
||||
|
||||
static const char * const sdio_groups[] = {
|
||||
"sdio_d0", "sdio_d1", "sdio_d2", "sdio_d3",
|
||||
"sdio_cmd", "sdio_clk",
|
||||
};
|
||||
|
||||
static const char * const spi0_groups[] = {
|
||||
"spi0_clk", "spi0_mosi", "spi0_miso", "spi0_ss0",
|
||||
"spi0_ss1", "spi0_ss2"
|
||||
};
|
||||
|
||||
static const char * const spi1_groups[] = {
|
||||
"spi1_clk_x", "spi1_mosi_x", "spi1_miso_x", "spi1_ss0_x",
|
||||
"spi1_clk_a", "spi1_mosi_a", "spi1_miso_a", "spi1_ss0_a",
|
||||
"spi1_ss1"
|
||||
};
|
||||
|
||||
static const char * const uart_a_groups[] = {
|
||||
"uart_tx_a", "uart_rx_a", "uart_cts_a", "uart_rts_a",
|
||||
};
|
||||
|
||||
static const char * const uart_b_groups[] = {
|
||||
"uart_tx_b_z", "uart_rx_b_z", "uart_cts_b_z", "uart_rts_b_z",
|
||||
"uart_tx_b_x", "uart_rx_b_x", "uart_cts_b_x", "uart_rts_b_x",
|
||||
};
|
||||
|
||||
static const char * const uart_ao_b_gpioz_groups[] = {
|
||||
"uart_ao_tx_b_z", "uart_ao_rx_b_z",
|
||||
"uart_ao_cts_b_z", "uart_ao_rts_b_z",
|
||||
};
|
||||
|
||||
static const char * const i2c0_groups[] = {
|
||||
"i2c0_sck", "i2c0_sda",
|
||||
};
|
||||
|
||||
static const char * const i2c1_groups[] = {
|
||||
"i2c1_sck_z", "i2c1_sda_z",
|
||||
"i2c1_sck_x", "i2c1_sda_x",
|
||||
};
|
||||
|
||||
static const char * const i2c2_groups[] = {
|
||||
"i2c2_sck_x", "i2c2_sda_x",
|
||||
"i2c2_sda_a", "i2c2_sck_a",
|
||||
};
|
||||
|
||||
static const char * const i2c3_groups[] = {
|
||||
"i2c3_sda_a6", "i2c3_sck_a7",
|
||||
"i2c3_sda_a12", "i2c3_sck_a13",
|
||||
"i2c3_sda_a19", "i2c3_sck_a20",
|
||||
};
|
||||
|
||||
static const char * const eth_groups[] = {
|
||||
"eth_rxd2_rgmii", "eth_rxd3_rgmii", "eth_rgmii_tx_clk",
|
||||
"eth_txd2_rgmii", "eth_txd3_rgmii",
|
||||
"eth_txd0_x", "eth_txd1_x", "eth_txen_x", "eth_rgmii_rx_clk_x",
|
||||
"eth_rxd0_x", "eth_rxd1_x", "eth_rx_dv_x", "eth_mdio_x",
|
||||
"eth_mdc_x",
|
||||
"eth_txd0_y", "eth_txd1_y", "eth_txen_y", "eth_rgmii_rx_clk_y",
|
||||
"eth_rxd0_y", "eth_rxd1_y", "eth_rx_dv_y", "eth_mdio_y",
|
||||
"eth_mdc_y",
|
||||
};
|
||||
|
||||
static const char * const pwm_a_groups[] = {
|
||||
"pwm_a_z", "pwm_a_x18", "pwm_a_x20", "pwm_a_a",
|
||||
};
|
||||
|
||||
static const char * const pwm_b_groups[] = {
|
||||
"pwm_b_z", "pwm_b_x", "pwm_b_a",
|
||||
};
|
||||
|
||||
static const char * const pwm_c_groups[] = {
|
||||
"pwm_c_x10", "pwm_c_x17", "pwm_c_a",
|
||||
};
|
||||
|
||||
static const char * const pwm_d_groups[] = {
|
||||
"pwm_d_x11", "pwm_d_x16",
|
||||
};
|
||||
|
||||
static const char * const pwm_vs_groups[] = {
|
||||
"pwm_vs",
|
||||
};
|
||||
|
||||
static const char * const spdif_out_groups[] = {
|
||||
"spdif_out_z", "spdif_out_a1", "spdif_out_a11",
|
||||
"spdif_out_a19", "spdif_out_a20",
|
||||
};
|
||||
|
||||
static const char * const spdif_in_groups[] = {
|
||||
"spdif_in_z", "spdif_in_a1", "spdif_in_a7",
|
||||
"spdif_in_a19", "spdif_in_a20",
|
||||
};
|
||||
|
||||
static const char * const jtag_ee_groups[] = {
|
||||
"jtag_tdo_x", "jtag_tdi_x", "jtag_clk_x",
|
||||
"jtag_tms_x",
|
||||
};
|
||||
|
||||
static const char * const pdm_groups[] = {
|
||||
"pdm_din0", "pdm_din1", "pdm_din2", "pdm_din3",
|
||||
"pdm_dclk_a14", "pdm_dclk_a19",
|
||||
};
|
||||
|
||||
static const char * const gpio_aobus_groups[] = {
|
||||
"GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3", "GPIOAO_4",
|
||||
"GPIOAO_5", "GPIOAO_6", "GPIOAO_7", "GPIOAO_8", "GPIOAO_9",
|
||||
"GPIOAO_10", "GPIOAO_11", "GPIOAO_12", "GPIOAO_13",
|
||||
"GPIO_TEST_N",
|
||||
};
|
||||
|
||||
static const char * const uart_ao_a_groups[] = {
|
||||
"uart_ao_tx_a", "uart_ao_rx_a", "uart_ao_cts_a", "uart_ao_rts_a",
|
||||
};
|
||||
|
||||
static const char * const uart_ao_b_groups[] = {
|
||||
"uart_ao_tx_b", "uart_ao_rx_b", "uart_ao_cts_b", "uart_ao_rts_b",
|
||||
};
|
||||
|
||||
static const char * const i2c_ao_groups[] = {
|
||||
"i2c_ao_sck_4", "i2c_ao_sda_5",
|
||||
"i2c_ao_sck_8", "i2c_ao_sda_9",
|
||||
"i2c_ao_sck_10", "i2c_ao_sda_11",
|
||||
};
|
||||
|
||||
static const char * const i2c_ao_slave_groups[] = {
|
||||
"i2c_ao_slave_sck", "i2c_ao_slave_sda",
|
||||
};
|
||||
|
||||
static const char * const remote_input_ao_groups[] = {
|
||||
"remote_input_ao",
|
||||
};
|
||||
|
||||
static const char * const remote_out_ao_groups[] = {
|
||||
"remote_out_ao",
|
||||
};
|
||||
|
||||
static const char * const pwm_ao_a_groups[] = {
|
||||
"pwm_ao_a",
|
||||
};
|
||||
|
||||
static const char * const pwm_ao_b_groups[] = {
|
||||
"pwm_ao_b_ao2", "pwm_ao_b_ao12",
|
||||
};
|
||||
|
||||
static const char * const pwm_ao_c_groups[] = {
|
||||
"pwm_ao_c_ao8", "pwm_ao_c_ao13",
|
||||
};
|
||||
|
||||
static const char * const pwm_ao_d_groups[] = {
|
||||
"pwm_ao_d",
|
||||
};
|
||||
|
||||
static const char * const jtag_ao_groups[] = {
|
||||
"jtag_ao_tdi", "jtag_ao_tdo", "jtag_ao_clk", "jtag_ao_tms",
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson_axg_periphs_functions[] = {
|
||||
FUNCTION(gpio_periphs),
|
||||
FUNCTION(emmc),
|
||||
FUNCTION(nor),
|
||||
FUNCTION(spi0),
|
||||
FUNCTION(spi1),
|
||||
FUNCTION(sdio),
|
||||
FUNCTION(nand),
|
||||
FUNCTION(uart_a),
|
||||
FUNCTION(uart_b),
|
||||
FUNCTION(uart_ao_b_gpioz),
|
||||
FUNCTION(i2c0),
|
||||
FUNCTION(i2c1),
|
||||
FUNCTION(i2c2),
|
||||
FUNCTION(i2c3),
|
||||
FUNCTION(eth),
|
||||
FUNCTION(pwm_a),
|
||||
FUNCTION(pwm_b),
|
||||
FUNCTION(pwm_c),
|
||||
FUNCTION(pwm_d),
|
||||
FUNCTION(pwm_vs),
|
||||
FUNCTION(spdif_out),
|
||||
FUNCTION(spdif_in),
|
||||
FUNCTION(jtag_ee),
|
||||
FUNCTION(pdm),
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson_axg_aobus_functions[] = {
|
||||
FUNCTION(gpio_aobus),
|
||||
FUNCTION(uart_ao_a),
|
||||
FUNCTION(uart_ao_b),
|
||||
FUNCTION(i2c_ao),
|
||||
FUNCTION(i2c_ao_slave),
|
||||
FUNCTION(remote_input_ao),
|
||||
FUNCTION(remote_out_ao),
|
||||
FUNCTION(pwm_ao_a),
|
||||
FUNCTION(pwm_ao_b),
|
||||
FUNCTION(pwm_ao_c),
|
||||
FUNCTION(pwm_ao_d),
|
||||
FUNCTION(jtag_ao),
|
||||
};
|
||||
|
||||
static struct meson_bank meson_axg_periphs_banks[] = {
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("Z", GPIOZ_0, GPIOZ_10, 14, 24, 3, 0, 3, 0, 9, 0, 10, 0, 11, 0),
|
||||
BANK("BOOT", BOOT_0, BOOT_14, 25, 39, 4, 0, 4, 0, 12, 0, 13, 0, 14, 0),
|
||||
BANK("A", GPIOA_0, GPIOA_20, 40, 60, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0),
|
||||
BANK("X", GPIOX_0, GPIOX_22, 61, 83, 2, 0, 2, 0, 6, 0, 7, 0, 8, 0),
|
||||
BANK("Y", GPIOY_0, GPIOY_15, 84, 99, 1, 0, 1, 0, 3, 0, 4, 0, 5, 0),
|
||||
};
|
||||
|
||||
static struct meson_bank meson_axg_aobus_banks[] = {
|
||||
/* name first last irq pullen pull dir out in */
|
||||
BANK("AO", GPIOAO_0, GPIOAO_9, 0, 13, 0, 16, 0, 0, 0, 0, 0, 16, 1, 0),
|
||||
};
|
||||
|
||||
static struct meson_pmx_bank meson_axg_periphs_pmx_banks[] = {
|
||||
/* name first lask reg offset */
|
||||
BANK_PMX("Z", GPIOZ_0, GPIOZ_10, 0x2, 0),
|
||||
BANK_PMX("BOOT", BOOT_0, BOOT_14, 0x0, 0),
|
||||
BANK_PMX("A", GPIOA_0, GPIOA_20, 0xb, 0),
|
||||
BANK_PMX("X", GPIOX_0, GPIOX_22, 0x4, 0),
|
||||
BANK_PMX("Y", GPIOY_0, GPIOY_15, 0x8, 0),
|
||||
};
|
||||
|
||||
static struct meson_axg_pmx_data meson_axg_periphs_pmx_banks_data = {
|
||||
.pmx_banks = meson_axg_periphs_pmx_banks,
|
||||
.num_pmx_banks = ARRAY_SIZE(meson_axg_periphs_pmx_banks),
|
||||
};
|
||||
|
||||
static struct meson_pmx_bank meson_axg_aobus_pmx_banks[] = {
|
||||
BANK_PMX("AO", GPIOAO_0, GPIOAO_13, 0x0, 0),
|
||||
};
|
||||
|
||||
static struct meson_axg_pmx_data meson_axg_aobus_pmx_banks_data = {
|
||||
.pmx_banks = meson_axg_aobus_pmx_banks,
|
||||
.num_pmx_banks = ARRAY_SIZE(meson_axg_aobus_pmx_banks),
|
||||
};
|
||||
|
||||
static struct meson_pinctrl_data meson_axg_periphs_pinctrl_data = {
|
||||
.name = "periphs-banks",
|
||||
.pins = meson_axg_periphs_pins,
|
||||
.groups = meson_axg_periphs_groups,
|
||||
.funcs = meson_axg_periphs_functions,
|
||||
.banks = meson_axg_periphs_banks,
|
||||
.num_pins = ARRAY_SIZE(meson_axg_periphs_pins),
|
||||
.num_groups = ARRAY_SIZE(meson_axg_periphs_groups),
|
||||
.num_funcs = ARRAY_SIZE(meson_axg_periphs_functions),
|
||||
.num_banks = ARRAY_SIZE(meson_axg_periphs_banks),
|
||||
.pmx_ops = &meson_axg_pmx_ops,
|
||||
.pmx_data = &meson_axg_periphs_pmx_banks_data,
|
||||
};
|
||||
|
||||
static struct meson_pinctrl_data meson_axg_aobus_pinctrl_data = {
|
||||
.name = "aobus-banks",
|
||||
.pins = meson_axg_aobus_pins,
|
||||
.groups = meson_axg_aobus_groups,
|
||||
.funcs = meson_axg_aobus_functions,
|
||||
.banks = meson_axg_aobus_banks,
|
||||
.num_pins = ARRAY_SIZE(meson_axg_aobus_pins),
|
||||
.num_groups = ARRAY_SIZE(meson_axg_aobus_groups),
|
||||
.num_funcs = ARRAY_SIZE(meson_axg_aobus_functions),
|
||||
.num_banks = ARRAY_SIZE(meson_axg_aobus_banks),
|
||||
.pmx_ops = &meson_axg_pmx_ops,
|
||||
.pmx_data = &meson_axg_aobus_pmx_banks_data,
|
||||
};
|
||||
|
||||
static const struct of_device_id meson_axg_pinctrl_dt_match[] = {
|
||||
{
|
||||
.compatible = "amlogic,meson-axg-periphs-pinctrl",
|
||||
.data = &meson_axg_periphs_pinctrl_data,
|
||||
},
|
||||
{
|
||||
.compatible = "amlogic,meson-axg-aobus-pinctrl",
|
||||
.data = &meson_axg_aobus_pinctrl_data,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_driver meson_axg_pinctrl_driver = {
|
||||
.probe = meson_pinctrl_probe,
|
||||
.driver = {
|
||||
.name = "meson-axg-pinctrl",
|
||||
.of_match_table = meson_axg_pinctrl_dt_match,
|
||||
},
|
||||
};
|
||||
|
||||
builtin_platform_driver(meson_axg_pinctrl_driver);
|
@ -108,6 +108,7 @@ struct meson_pinctrl_data {
|
||||
struct meson_bank *banks;
|
||||
unsigned int num_banks;
|
||||
const struct pinmux_ops *pmx_ops;
|
||||
void *pmx_data;
|
||||
};
|
||||
|
||||
struct meson_pinctrl {
|
||||
|
@ -1006,11 +1006,11 @@ static int armada_37xx_pinctrl_register(struct platform_device *pdev,
|
||||
static const struct of_device_id armada_37xx_pinctrl_of_match[] = {
|
||||
{
|
||||
.compatible = "marvell,armada3710-sb-pinctrl",
|
||||
.data = (void *)&armada_37xx_pin_sb,
|
||||
.data = &armada_37xx_pin_sb,
|
||||
},
|
||||
{
|
||||
.compatible = "marvell,armada3710-nb-pinctrl",
|
||||
.data = (void *)&armada_37xx_pin_nb,
|
||||
.data = &armada_37xx_pin_nb,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
|
@ -636,10 +636,9 @@ int mvebu_pinctrl_probe(struct platform_device *pdev)
|
||||
*/
|
||||
size = pctl->num_groups * sizeof(*pctl->groups) + noname * 8;
|
||||
p = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
|
||||
if (!p) {
|
||||
dev_err(&pdev->dev, "failed to alloc group data\n");
|
||||
if (!p)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pctl->groups = p;
|
||||
noname_buf = p + pctl->num_groups * sizeof(*pctl->groups);
|
||||
|
||||
|
@ -633,7 +633,7 @@ static void abx500_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
||||
for (i = 0; i < chip->ngpio; i++, gpio++) {
|
||||
/* On AB8500, there is no GPIO0, the first is the GPIO 1 */
|
||||
abx500_gpio_dbg_show_one(s, pctldev, chip, i + 1, gpio);
|
||||
seq_printf(s, "\n");
|
||||
seq_putc(s, '\n');
|
||||
}
|
||||
}
|
||||
|
||||
@ -1155,13 +1155,9 @@ static int abx500_gpio_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pct = devm_kzalloc(&pdev->dev, sizeof(struct abx500_pinctrl),
|
||||
GFP_KERNEL);
|
||||
if (pct == NULL) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed to allocate memory for pct\n");
|
||||
pct = devm_kzalloc(&pdev->dev, sizeof(*pct), GFP_KERNEL);
|
||||
if (!pct)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pct->dev = &pdev->dev;
|
||||
pct->parent = dev_get_drvdata(pdev->dev.parent);
|
||||
|
@ -827,13 +827,10 @@ static int adi_gpio_pint_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct resource *res;
|
||||
struct gpio_pint *pint;
|
||||
struct gpio_pint *pint = devm_kzalloc(dev, sizeof(*pint), GFP_KERNEL);
|
||||
|
||||
pint = devm_kzalloc(dev, sizeof(struct gpio_pint), GFP_KERNEL);
|
||||
if (!pint) {
|
||||
dev_err(dev, "Memory alloc failed\n");
|
||||
if (!pint)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
pint->base = devm_ioremap_resource(dev, res);
|
||||
@ -945,11 +942,9 @@ static int adi_gpio_probe(struct platform_device *pdev)
|
||||
if (!pdata)
|
||||
return -EINVAL;
|
||||
|
||||
port = devm_kzalloc(dev, sizeof(struct gpio_port), GFP_KERNEL);
|
||||
if (!port) {
|
||||
dev_err(dev, "Memory alloc failed\n");
|
||||
port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
|
||||
if (!port)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
port->base = devm_ioremap_resource(dev, res);
|
||||
|
@ -910,7 +910,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
|
||||
int i, ret;
|
||||
struct resource *res;
|
||||
struct atmel_pioctrl *atmel_pioctrl;
|
||||
struct atmel_pioctrl_data *atmel_pioctrl_data;
|
||||
const struct atmel_pioctrl_data *atmel_pioctrl_data;
|
||||
|
||||
atmel_pioctrl = devm_kzalloc(dev, sizeof(*atmel_pioctrl), GFP_KERNEL);
|
||||
if (!atmel_pioctrl)
|
||||
@ -924,7 +924,7 @@ static int atmel_pinctrl_probe(struct platform_device *pdev)
|
||||
dev_err(dev, "unknown compatible string\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
atmel_pioctrl_data = (struct atmel_pioctrl_data *)match->data;
|
||||
atmel_pioctrl_data = match->data;
|
||||
atmel_pioctrl->nbanks = atmel_pioctrl_data->nbanks;
|
||||
atmel_pioctrl->npins = atmel_pioctrl->nbanks * ATMEL_PIO_NPINS_PER_BANK;
|
||||
|
||||
|
@ -1050,10 +1050,8 @@ static int at91_pinctrl_mux_mask(struct at91_pinctrl *info,
|
||||
info->nmux = size / gpio_banks;
|
||||
|
||||
info->mux_mask = devm_kzalloc(info->dev, sizeof(u32) * size, GFP_KERNEL);
|
||||
if (!info->mux_mask) {
|
||||
dev_err(info->dev, "could not alloc mux_mask\n");
|
||||
if (!info->mux_mask)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32_array(np, "atmel,mux-mask",
|
||||
info->mux_mask, size);
|
||||
|
@ -413,9 +413,11 @@ static int axp20x_pctl_probe(struct platform_device *pdev)
|
||||
pctl->chip.set = axp20x_gpio_set;
|
||||
pctl->chip.direction_input = axp20x_gpio_input;
|
||||
pctl->chip.direction_output = axp20x_gpio_output;
|
||||
|
||||
pctl->desc = of_device_get_match_data(dev);
|
||||
|
||||
pctl->chip.ngpio = pctl->desc->npins;
|
||||
|
||||
pctl->desc = (struct axp20x_pctrl_desc *)of_device_get_match_data(dev);
|
||||
pctl->regmap = axp20x->regmap;
|
||||
pctl->dev = &pdev->dev;
|
||||
|
||||
|
@ -67,6 +67,9 @@ struct gemini_pmx {
|
||||
* elements in .pins so we can iterate over that array
|
||||
* @mask: bits to clear to enable this when doing pin muxing
|
||||
* @value: bits to set to enable this when doing pin muxing
|
||||
* @driving_mask: bitmask for the IO Pad driving register for this
|
||||
* group, if it supports altering the driving strength of
|
||||
* its lines.
|
||||
*/
|
||||
struct gemini_pin_group {
|
||||
const char *name;
|
||||
@ -74,12 +77,14 @@ struct gemini_pin_group {
|
||||
const unsigned int num_pins;
|
||||
u32 mask;
|
||||
u32 value;
|
||||
u32 driving_mask;
|
||||
};
|
||||
|
||||
/* Some straight-forward control registers */
|
||||
#define GLOBAL_WORD_ID 0x00
|
||||
#define GLOBAL_STATUS 0x04
|
||||
#define GLOBAL_STATUS_FLPIN BIT(20)
|
||||
#define GLOBAL_IODRIVE 0x10
|
||||
#define GLOBAL_GMAC_CTRL_SKEW 0x1c
|
||||
#define GLOBAL_GMAC0_DATA_SKEW 0x20
|
||||
#define GLOBAL_GMAC1_DATA_SKEW 0x24
|
||||
@ -738,6 +743,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
|
||||
/* Conflict with all flash usage */
|
||||
.value = IDE_PADS_ENABLE | NAND_PADS_DISABLE |
|
||||
PFLASH_PADS_DISABLE | SFLASH_PADS_DISABLE,
|
||||
.driving_mask = GENMASK(21, 20),
|
||||
},
|
||||
{
|
||||
.name = "satagrp",
|
||||
@ -753,6 +759,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
|
||||
.name = "gmii_gmac0_grp",
|
||||
.pins = gmii_gmac0_3512_pins,
|
||||
.num_pins = ARRAY_SIZE(gmii_gmac0_3512_pins),
|
||||
.driving_mask = GENMASK(17, 16),
|
||||
},
|
||||
{
|
||||
.name = "gmii_gmac1_grp",
|
||||
@ -760,6 +767,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
|
||||
.num_pins = ARRAY_SIZE(gmii_gmac1_3512_pins),
|
||||
/* Bring out RGMII on the GMAC1 pins */
|
||||
.value = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
|
||||
.driving_mask = GENMASK(19, 18),
|
||||
},
|
||||
{
|
||||
.name = "pcigrp",
|
||||
@ -767,6 +775,7 @@ static const struct gemini_pin_group gemini_3512_pin_groups[] = {
|
||||
.num_pins = ARRAY_SIZE(pci_3512_pins),
|
||||
/* Conflict only with GPIO2 */
|
||||
.value = PCI_PADS_ENABLE | PCI_CLK_PAD_ENABLE,
|
||||
.driving_mask = GENMASK(23, 22),
|
||||
},
|
||||
{
|
||||
.name = "lpcgrp",
|
||||
@ -1671,6 +1680,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
|
||||
/* Conflict with all flash usage */
|
||||
.value = IDE_PADS_ENABLE | NAND_PADS_DISABLE |
|
||||
PFLASH_PADS_DISABLE | SFLASH_PADS_DISABLE,
|
||||
.driving_mask = GENMASK(21, 20),
|
||||
},
|
||||
{
|
||||
.name = "satagrp",
|
||||
@ -1686,6 +1696,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
|
||||
.name = "gmii_gmac0_grp",
|
||||
.pins = gmii_gmac0_3516_pins,
|
||||
.num_pins = ARRAY_SIZE(gmii_gmac0_3516_pins),
|
||||
.driving_mask = GENMASK(17, 16),
|
||||
},
|
||||
{
|
||||
.name = "gmii_gmac1_grp",
|
||||
@ -1693,6 +1704,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
|
||||
.num_pins = ARRAY_SIZE(gmii_gmac1_3516_pins),
|
||||
/* Bring out RGMII on the GMAC1 pins */
|
||||
.value = GEMINI_GMAC_IOSEL_GMAC0_GMAC1_RGMII,
|
||||
.driving_mask = GENMASK(19, 18),
|
||||
},
|
||||
{
|
||||
.name = "pcigrp",
|
||||
@ -1700,6 +1712,7 @@ static const struct gemini_pin_group gemini_3516_pin_groups[] = {
|
||||
.num_pins = ARRAY_SIZE(pci_3516_pins),
|
||||
/* Conflict only with GPIO2 */
|
||||
.value = PCI_PADS_ENABLE | PCI_CLK_PAD_ENABLE,
|
||||
.driving_mask = GENMASK(23, 22),
|
||||
},
|
||||
{
|
||||
.name = "lpcgrp",
|
||||
@ -2015,7 +2028,8 @@ static const char * const sflashgrps[] = { "sflashgrp" };
|
||||
static const char * const gpio0grps[] = { "gpio0agrp", "gpio0bgrp", "gpio0cgrp",
|
||||
"gpio0dgrp", "gpio0egrp", "gpio0fgrp",
|
||||
"gpio0ggrp", "gpio0hgrp", "gpio0igrp",
|
||||
"gpio0jgrp", "gpio0kgrp" };
|
||||
"gpio0jgrp", "gpio0kgrp", "gpio0lgrp",
|
||||
"gpio0mgrp" };
|
||||
static const char * const gpio1grps[] = { "gpio1agrp", "gpio1bgrp", "gpio1cgrp",
|
||||
"gpio1dgrp" };
|
||||
static const char * const gpio2grps[] = { "gpio2agrp", "gpio2bgrp", "gpio2cgrp" };
|
||||
@ -2393,9 +2407,77 @@ static int gemini_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int gemini_pinconf_group_set(struct pinctrl_dev *pctldev,
|
||||
unsigned selector,
|
||||
unsigned long *configs,
|
||||
unsigned num_configs)
|
||||
{
|
||||
struct gemini_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
|
||||
const struct gemini_pin_group *grp = NULL;
|
||||
enum pin_config_param param;
|
||||
u32 arg;
|
||||
u32 val;
|
||||
int i;
|
||||
|
||||
if (pmx->is_3512)
|
||||
grp = &gemini_3512_pin_groups[selector];
|
||||
if (pmx->is_3516)
|
||||
grp = &gemini_3516_pin_groups[selector];
|
||||
|
||||
/* First figure out if this group supports configs */
|
||||
if (!grp->driving_mask) {
|
||||
dev_err(pmx->dev, "pin config group \"%s\" does "
|
||||
"not support drive strength setting\n",
|
||||
grp->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_configs; i++) {
|
||||
param = pinconf_to_config_param(configs[i]);
|
||||
arg = pinconf_to_config_argument(configs[i]);
|
||||
|
||||
switch (param) {
|
||||
case PIN_CONFIG_DRIVE_STRENGTH:
|
||||
switch (arg) {
|
||||
case 4:
|
||||
val = 0;
|
||||
break;
|
||||
case 8:
|
||||
val = 1;
|
||||
break;
|
||||
case 12:
|
||||
val = 2;
|
||||
break;
|
||||
case 16:
|
||||
val = 3;
|
||||
break;
|
||||
default:
|
||||
dev_err(pmx->dev,
|
||||
"invalid drive strength %d mA\n",
|
||||
arg);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
val <<= (ffs(grp->driving_mask) - 1);
|
||||
regmap_update_bits(pmx->map, GLOBAL_IODRIVE,
|
||||
grp->driving_mask,
|
||||
val);
|
||||
dev_info(pmx->dev,
|
||||
"set group %s to %d mA drive strength mask %08x val %08x\n",
|
||||
grp->name, arg, grp->driving_mask, val);
|
||||
break;
|
||||
default:
|
||||
dev_err(pmx->dev, "invalid config param %04x\n", param);
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pinconf_ops gemini_pinconf_ops = {
|
||||
.pin_config_get = gemini_pinconf_get,
|
||||
.pin_config_set = gemini_pinconf_set,
|
||||
.pin_config_group_set = gemini_pinconf_group_set,
|
||||
.is_generic = true,
|
||||
};
|
||||
|
||||
|
@ -736,10 +736,8 @@ static int ingenic_pinctrl_probe(struct platform_device *pdev)
|
||||
|
||||
base = devm_ioremap_resource(dev,
|
||||
platform_get_resource(pdev, IORESOURCE_MEM, 0));
|
||||
if (IS_ERR(base)) {
|
||||
dev_err(dev, "Failed to ioremap registers\n");
|
||||
if (IS_ERR(base))
|
||||
return PTR_ERR(base);
|
||||
}
|
||||
|
||||
jzpc->map = devm_regmap_init_mmio(dev, base,
|
||||
&ingenic_pinctrl_regmap_config);
|
||||
|
@ -455,31 +455,22 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
|
||||
defval_changed, gpio_set;
|
||||
|
||||
mutex_lock(&mcp->lock);
|
||||
if (mcp_read(mcp, MCP_INTF, &intf) < 0) {
|
||||
mutex_unlock(&mcp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (mcp_read(mcp, MCP_INTF, &intf))
|
||||
goto unlock;
|
||||
|
||||
if (mcp_read(mcp, MCP_INTCAP, &intcap) < 0) {
|
||||
mutex_unlock(&mcp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (mcp_read(mcp, MCP_INTCAP, &intcap))
|
||||
goto unlock;
|
||||
|
||||
if (mcp_read(mcp, MCP_INTCON, &intcon) < 0) {
|
||||
mutex_unlock(&mcp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (mcp_read(mcp, MCP_INTCON, &intcon))
|
||||
goto unlock;
|
||||
|
||||
if (mcp_read(mcp, MCP_DEFVAL, &defval) < 0) {
|
||||
mutex_unlock(&mcp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (mcp_read(mcp, MCP_DEFVAL, &defval))
|
||||
goto unlock;
|
||||
|
||||
/* This clears the interrupt(configurable on S18) */
|
||||
if (mcp_read(mcp, MCP_GPIO, &gpio) < 0) {
|
||||
mutex_unlock(&mcp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
if (mcp_read(mcp, MCP_GPIO, &gpio))
|
||||
goto unlock;
|
||||
|
||||
gpio_orig = mcp->cached_gpio;
|
||||
mcp->cached_gpio = gpio;
|
||||
mutex_unlock(&mcp->lock);
|
||||
@ -541,6 +532,10 @@ static irqreturn_t mcp23s08_irq(int irq, void *data)
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&mcp->lock);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void mcp23s08_irq_mask(struct irq_data *data)
|
||||
@ -753,13 +748,12 @@ static void mcp23s08_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
||||
if (!label)
|
||||
continue;
|
||||
|
||||
seq_printf(s, " gpio-%-3d P%c.%d (%-12s) %s %s %s",
|
||||
chip->base + t, bank, t, label,
|
||||
(iodir & mask) ? "in " : "out",
|
||||
(gpio & mask) ? "hi" : "lo",
|
||||
(gppu & mask) ? "up" : " ");
|
||||
seq_printf(s, " gpio-%-3d P%c.%d (%-12s) %s %s %s\n",
|
||||
chip->base + t, bank, t, label,
|
||||
(iodir & mask) ? "in " : "out",
|
||||
(gpio & mask) ? "hi" : "lo",
|
||||
(gppu & mask) ? "up" : " ");
|
||||
/* NOTE: ignoring the irq-related registers */
|
||||
seq_puts(s, "\n");
|
||||
}
|
||||
done:
|
||||
mutex_unlock(&mcp->lock);
|
||||
@ -896,16 +890,16 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
if (mcp->irq && mcp->irq_controller) {
|
||||
ret = mcp23s08_irq_setup(mcp);
|
||||
if (ret)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
|
||||
if (ret < 0)
|
||||
goto fail;
|
||||
|
||||
mcp->pinctrl_desc.name = "mcp23xxx-pinctrl";
|
||||
mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops;
|
||||
mcp->pinctrl_desc.confops = &mcp_pinconf_ops;
|
||||
|
511
drivers/pinctrl/pinctrl-ocelot.c
Normal file
511
drivers/pinctrl/pinctrl-ocelot.c
Normal file
@ -0,0 +1,511 @@
|
||||
// SPDX-License-Identifier: (GPL-2.0 OR MIT)
|
||||
/*
|
||||
* Microsemi SoCs pinctrl driver
|
||||
*
|
||||
* Author: <alexandre.belloni@free-electrons.com>
|
||||
* License: Dual MIT/GPL
|
||||
* Copyright (c) 2017 Microsemi Corporation
|
||||
*/
|
||||
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
#include <linux/pinctrl/pinmux.h>
|
||||
#include <linux/pinctrl/pinconf.h>
|
||||
#include <linux/pinctrl/pinconf-generic.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include "core.h"
|
||||
#include "pinconf.h"
|
||||
#include "pinmux.h"
|
||||
|
||||
#define OCELOT_GPIO_OUT_SET 0x0
|
||||
#define OCELOT_GPIO_OUT_CLR 0x4
|
||||
#define OCELOT_GPIO_OUT 0x8
|
||||
#define OCELOT_GPIO_IN 0xc
|
||||
#define OCELOT_GPIO_OE 0x10
|
||||
#define OCELOT_GPIO_INTR 0x14
|
||||
#define OCELOT_GPIO_INTR_ENA 0x18
|
||||
#define OCELOT_GPIO_INTR_IDENT 0x1c
|
||||
#define OCELOT_GPIO_ALT0 0x20
|
||||
#define OCELOT_GPIO_ALT1 0x24
|
||||
#define OCELOT_GPIO_SD_MAP 0x28
|
||||
|
||||
#define OCELOT_PINS 22
|
||||
#define OCELOT_FUNC_PER_PIN 4
|
||||
|
||||
enum {
|
||||
FUNC_NONE,
|
||||
FUNC_GPIO,
|
||||
FUNC_IRQ0_IN,
|
||||
FUNC_IRQ0_OUT,
|
||||
FUNC_IRQ1_IN,
|
||||
FUNC_IRQ1_OUT,
|
||||
FUNC_MIIM1,
|
||||
FUNC_PCI_WAKE,
|
||||
FUNC_PTP0,
|
||||
FUNC_PTP1,
|
||||
FUNC_PTP2,
|
||||
FUNC_PTP3,
|
||||
FUNC_PWM,
|
||||
FUNC_RECO_CLK0,
|
||||
FUNC_RECO_CLK1,
|
||||
FUNC_SFP0,
|
||||
FUNC_SFP1,
|
||||
FUNC_SFP2,
|
||||
FUNC_SFP3,
|
||||
FUNC_SFP4,
|
||||
FUNC_SFP5,
|
||||
FUNC_SG0,
|
||||
FUNC_SI,
|
||||
FUNC_TACHO,
|
||||
FUNC_TWI,
|
||||
FUNC_TWI_SCL_M,
|
||||
FUNC_UART,
|
||||
FUNC_UART2,
|
||||
FUNC_MAX
|
||||
};
|
||||
|
||||
static const char *const ocelot_function_names[] = {
|
||||
[FUNC_NONE] = "none",
|
||||
[FUNC_GPIO] = "gpio",
|
||||
[FUNC_IRQ0_IN] = "irq0_in",
|
||||
[FUNC_IRQ0_OUT] = "irq0_out",
|
||||
[FUNC_IRQ1_IN] = "irq1_in",
|
||||
[FUNC_IRQ1_OUT] = "irq1_out",
|
||||
[FUNC_MIIM1] = "miim1",
|
||||
[FUNC_PCI_WAKE] = "pci_wake",
|
||||
[FUNC_PTP0] = "ptp0",
|
||||
[FUNC_PTP1] = "ptp1",
|
||||
[FUNC_PTP2] = "ptp2",
|
||||
[FUNC_PTP3] = "ptp3",
|
||||
[FUNC_PWM] = "pwm",
|
||||
[FUNC_RECO_CLK0] = "reco_clk0",
|
||||
[FUNC_RECO_CLK1] = "reco_clk1",
|
||||
[FUNC_SFP0] = "sfp0",
|
||||
[FUNC_SFP1] = "sfp1",
|
||||
[FUNC_SFP2] = "sfp2",
|
||||
[FUNC_SFP3] = "sfp3",
|
||||
[FUNC_SFP4] = "sfp4",
|
||||
[FUNC_SFP5] = "sfp5",
|
||||
[FUNC_SG0] = "sg0",
|
||||
[FUNC_SI] = "si",
|
||||
[FUNC_TACHO] = "tacho",
|
||||
[FUNC_TWI] = "twi",
|
||||
[FUNC_TWI_SCL_M] = "twi_scl_m",
|
||||
[FUNC_UART] = "uart",
|
||||
[FUNC_UART2] = "uart2",
|
||||
};
|
||||
|
||||
struct ocelot_pmx_func {
|
||||
const char **groups;
|
||||
unsigned int ngroups;
|
||||
};
|
||||
|
||||
struct ocelot_pin_caps {
|
||||
unsigned int pin;
|
||||
unsigned char functions[OCELOT_FUNC_PER_PIN];
|
||||
};
|
||||
|
||||
struct ocelot_pinctrl {
|
||||
struct device *dev;
|
||||
struct pinctrl_dev *pctl;
|
||||
struct gpio_chip gpio_chip;
|
||||
struct regmap *map;
|
||||
struct ocelot_pmx_func func[FUNC_MAX];
|
||||
};
|
||||
|
||||
#define OCELOT_P(p, f0, f1, f2) \
|
||||
static struct ocelot_pin_caps ocelot_pin_##p = { \
|
||||
.pin = p, \
|
||||
.functions = { \
|
||||
FUNC_GPIO, FUNC_##f0, FUNC_##f1, FUNC_##f2, \
|
||||
}, \
|
||||
}
|
||||
|
||||
OCELOT_P(0, SG0, NONE, NONE);
|
||||
OCELOT_P(1, SG0, NONE, NONE);
|
||||
OCELOT_P(2, SG0, NONE, NONE);
|
||||
OCELOT_P(3, SG0, NONE, NONE);
|
||||
OCELOT_P(4, IRQ0_IN, IRQ0_OUT, TWI);
|
||||
OCELOT_P(5, IRQ1_IN, IRQ1_OUT, PCI_WAKE);
|
||||
OCELOT_P(6, UART, TWI_SCL_M, NONE);
|
||||
OCELOT_P(7, UART, TWI_SCL_M, NONE);
|
||||
OCELOT_P(8, SI, TWI_SCL_M, IRQ0_OUT);
|
||||
OCELOT_P(9, SI, TWI_SCL_M, IRQ1_OUT);
|
||||
OCELOT_P(10, PTP2, TWI_SCL_M, SFP0);
|
||||
OCELOT_P(11, PTP3, TWI_SCL_M, SFP1);
|
||||
OCELOT_P(12, UART2, TWI_SCL_M, SFP2);
|
||||
OCELOT_P(13, UART2, TWI_SCL_M, SFP3);
|
||||
OCELOT_P(14, MIIM1, TWI_SCL_M, SFP4);
|
||||
OCELOT_P(15, MIIM1, TWI_SCL_M, SFP5);
|
||||
OCELOT_P(16, TWI, NONE, SI);
|
||||
OCELOT_P(17, TWI, TWI_SCL_M, SI);
|
||||
OCELOT_P(18, PTP0, TWI_SCL_M, NONE);
|
||||
OCELOT_P(19, PTP1, TWI_SCL_M, NONE);
|
||||
OCELOT_P(20, RECO_CLK0, TACHO, NONE);
|
||||
OCELOT_P(21, RECO_CLK1, PWM, NONE);
|
||||
|
||||
#define OCELOT_PIN(n) { \
|
||||
.number = n, \
|
||||
.name = "GPIO_"#n, \
|
||||
.drv_data = &ocelot_pin_##n \
|
||||
}
|
||||
|
||||
static const struct pinctrl_pin_desc ocelot_pins[] = {
|
||||
OCELOT_PIN(0),
|
||||
OCELOT_PIN(1),
|
||||
OCELOT_PIN(2),
|
||||
OCELOT_PIN(3),
|
||||
OCELOT_PIN(4),
|
||||
OCELOT_PIN(5),
|
||||
OCELOT_PIN(6),
|
||||
OCELOT_PIN(7),
|
||||
OCELOT_PIN(8),
|
||||
OCELOT_PIN(9),
|
||||
OCELOT_PIN(10),
|
||||
OCELOT_PIN(11),
|
||||
OCELOT_PIN(12),
|
||||
OCELOT_PIN(13),
|
||||
OCELOT_PIN(14),
|
||||
OCELOT_PIN(15),
|
||||
OCELOT_PIN(16),
|
||||
OCELOT_PIN(17),
|
||||
OCELOT_PIN(18),
|
||||
OCELOT_PIN(19),
|
||||
OCELOT_PIN(20),
|
||||
OCELOT_PIN(21),
|
||||
};
|
||||
|
||||
static int ocelot_get_functions_count(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
return ARRAY_SIZE(ocelot_function_names);
|
||||
}
|
||||
|
||||
static const char *ocelot_get_function_name(struct pinctrl_dev *pctldev,
|
||||
unsigned int function)
|
||||
{
|
||||
return ocelot_function_names[function];
|
||||
}
|
||||
|
||||
static int ocelot_get_function_groups(struct pinctrl_dev *pctldev,
|
||||
unsigned int function,
|
||||
const char *const **groups,
|
||||
unsigned *const num_groups)
|
||||
{
|
||||
struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
*groups = info->func[function].groups;
|
||||
*num_groups = info->func[function].ngroups;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_pin_function_idx(unsigned int pin, unsigned int function)
|
||||
{
|
||||
struct ocelot_pin_caps *p = ocelot_pins[pin].drv_data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < OCELOT_FUNC_PER_PIN; i++) {
|
||||
if (function == p->functions[i])
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int ocelot_pinmux_set_mux(struct pinctrl_dev *pctldev,
|
||||
unsigned int selector, unsigned int group)
|
||||
{
|
||||
struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||
struct ocelot_pin_caps *pin = ocelot_pins[group].drv_data;
|
||||
int f;
|
||||
|
||||
f = ocelot_pin_function_idx(group, selector);
|
||||
if (f < 0)
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* f is encoded on two bits.
|
||||
* bit 0 of f goes in BIT(pin) of ALT0, bit 1 of f goes in BIT(pin) of
|
||||
* ALT1
|
||||
* This is racy because both registers can't be updated at the same time
|
||||
* but it doesn't matter much for now.
|
||||
*/
|
||||
regmap_update_bits(info->map, OCELOT_GPIO_ALT0, BIT(pin->pin),
|
||||
f << pin->pin);
|
||||
regmap_update_bits(info->map, OCELOT_GPIO_ALT1, BIT(pin->pin),
|
||||
f << (pin->pin - 1));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_gpio_set_direction(struct pinctrl_dev *pctldev,
|
||||
struct pinctrl_gpio_range *range,
|
||||
unsigned int pin, bool input)
|
||||
{
|
||||
struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
regmap_update_bits(info->map, OCELOT_GPIO_OE, BIT(pin),
|
||||
input ? BIT(pin) : 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_gpio_request_enable(struct pinctrl_dev *pctldev,
|
||||
struct pinctrl_gpio_range *range,
|
||||
unsigned int offset)
|
||||
{
|
||||
struct ocelot_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
|
||||
|
||||
regmap_update_bits(info->map, OCELOT_GPIO_ALT0, BIT(offset), 0);
|
||||
regmap_update_bits(info->map, OCELOT_GPIO_ALT1, BIT(offset), 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pinmux_ops ocelot_pmx_ops = {
|
||||
.get_functions_count = ocelot_get_functions_count,
|
||||
.get_function_name = ocelot_get_function_name,
|
||||
.get_function_groups = ocelot_get_function_groups,
|
||||
.set_mux = ocelot_pinmux_set_mux,
|
||||
.gpio_set_direction = ocelot_gpio_set_direction,
|
||||
.gpio_request_enable = ocelot_gpio_request_enable,
|
||||
};
|
||||
|
||||
static int ocelot_pctl_get_groups_count(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
return ARRAY_SIZE(ocelot_pins);
|
||||
}
|
||||
|
||||
static const char *ocelot_pctl_get_group_name(struct pinctrl_dev *pctldev,
|
||||
unsigned int group)
|
||||
{
|
||||
return ocelot_pins[group].name;
|
||||
}
|
||||
|
||||
static int ocelot_pctl_get_group_pins(struct pinctrl_dev *pctldev,
|
||||
unsigned int group,
|
||||
const unsigned int **pins,
|
||||
unsigned int *num_pins)
|
||||
{
|
||||
*pins = &ocelot_pins[group].number;
|
||||
*num_pins = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct pinctrl_ops ocelot_pctl_ops = {
|
||||
.get_groups_count = ocelot_pctl_get_groups_count,
|
||||
.get_group_name = ocelot_pctl_get_group_name,
|
||||
.get_group_pins = ocelot_pctl_get_group_pins,
|
||||
.dt_node_to_map = pinconf_generic_dt_node_to_map_pin,
|
||||
.dt_free_map = pinconf_generic_dt_free_map,
|
||||
};
|
||||
|
||||
static struct pinctrl_desc ocelot_desc = {
|
||||
.name = "ocelot-pinctrl",
|
||||
.pins = ocelot_pins,
|
||||
.npins = ARRAY_SIZE(ocelot_pins),
|
||||
.pctlops = &ocelot_pctl_ops,
|
||||
.pmxops = &ocelot_pmx_ops,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int ocelot_create_group_func_map(struct device *dev,
|
||||
struct ocelot_pinctrl *info)
|
||||
{
|
||||
u16 pins[ARRAY_SIZE(ocelot_pins)];
|
||||
int f, npins, i;
|
||||
|
||||
for (f = 0; f < FUNC_MAX; f++) {
|
||||
for (npins = 0, i = 0; i < ARRAY_SIZE(ocelot_pins); i++) {
|
||||
if (ocelot_pin_function_idx(i, f) >= 0)
|
||||
pins[npins++] = i;
|
||||
}
|
||||
|
||||
info->func[f].ngroups = npins;
|
||||
info->func[f].groups = devm_kzalloc(dev, npins *
|
||||
sizeof(char *),
|
||||
GFP_KERNEL);
|
||||
if (!info->func[f].groups)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < npins; i++)
|
||||
info->func[f].groups[i] = ocelot_pins[pins[i]].name;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_pinctrl_register(struct platform_device *pdev,
|
||||
struct ocelot_pinctrl *info)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = ocelot_create_group_func_map(&pdev->dev, info);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Unable to create group func map.\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
info->pctl = devm_pinctrl_register(&pdev->dev, &ocelot_desc, info);
|
||||
if (IS_ERR(info->pctl)) {
|
||||
dev_err(&pdev->dev, "Failed to register pinctrl\n");
|
||||
return PTR_ERR(info->pctl);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ocelot_gpio_get(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
struct ocelot_pinctrl *info = gpiochip_get_data(chip);
|
||||
unsigned int val;
|
||||
|
||||
regmap_read(info->map, OCELOT_GPIO_IN, &val);
|
||||
|
||||
return !!(val & BIT(offset));
|
||||
}
|
||||
|
||||
static void ocelot_gpio_set(struct gpio_chip *chip, unsigned int offset,
|
||||
int value)
|
||||
{
|
||||
struct ocelot_pinctrl *info = gpiochip_get_data(chip);
|
||||
|
||||
if (value)
|
||||
regmap_write(info->map, OCELOT_GPIO_OUT_SET, BIT(offset));
|
||||
else
|
||||
regmap_write(info->map, OCELOT_GPIO_OUT_CLR, BIT(offset));
|
||||
}
|
||||
|
||||
static int ocelot_gpio_get_direction(struct gpio_chip *chip,
|
||||
unsigned int offset)
|
||||
{
|
||||
struct ocelot_pinctrl *info = gpiochip_get_data(chip);
|
||||
unsigned int val;
|
||||
|
||||
regmap_read(info->map, OCELOT_GPIO_OE, &val);
|
||||
|
||||
return !(val & BIT(offset));
|
||||
}
|
||||
|
||||
static int ocelot_gpio_direction_input(struct gpio_chip *chip,
|
||||
unsigned int offset)
|
||||
{
|
||||
return pinctrl_gpio_direction_input(chip->base + offset);
|
||||
}
|
||||
|
||||
static int ocelot_gpio_direction_output(struct gpio_chip *chip,
|
||||
unsigned int offset, int value)
|
||||
{
|
||||
struct ocelot_pinctrl *info = gpiochip_get_data(chip);
|
||||
unsigned int pin = BIT(offset);
|
||||
|
||||
if (value)
|
||||
regmap_write(info->map, OCELOT_GPIO_OUT_SET, pin);
|
||||
else
|
||||
regmap_write(info->map, OCELOT_GPIO_OUT_CLR, pin);
|
||||
|
||||
return pinctrl_gpio_direction_output(chip->base + offset);
|
||||
}
|
||||
|
||||
static const struct gpio_chip ocelot_gpiolib_chip = {
|
||||
.request = gpiochip_generic_request,
|
||||
.free = gpiochip_generic_free,
|
||||
.set = ocelot_gpio_set,
|
||||
.get = ocelot_gpio_get,
|
||||
.get_direction = ocelot_gpio_get_direction,
|
||||
.direction_input = ocelot_gpio_direction_input,
|
||||
.direction_output = ocelot_gpio_direction_output,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int ocelot_gpiochip_register(struct platform_device *pdev,
|
||||
struct ocelot_pinctrl *info)
|
||||
{
|
||||
struct gpio_chip *gc;
|
||||
int ret;
|
||||
|
||||
info->gpio_chip = ocelot_gpiolib_chip;
|
||||
|
||||
gc = &info->gpio_chip;
|
||||
gc->ngpio = OCELOT_PINS;
|
||||
gc->parent = &pdev->dev;
|
||||
gc->base = 0;
|
||||
gc->of_node = info->dev->of_node;
|
||||
gc->label = "ocelot-gpio";
|
||||
|
||||
ret = devm_gpiochip_add_data(&pdev->dev, gc, info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* TODO: this can be used as an irqchip but no board is using that */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct regmap_config ocelot_pinctrl_regmap_config = {
|
||||
.reg_bits = 32,
|
||||
.val_bits = 32,
|
||||
.reg_stride = 4,
|
||||
.max_register = 0x64,
|
||||
};
|
||||
|
||||
static const struct of_device_id ocelot_pinctrl_of_match[] = {
|
||||
{ .compatible = "mscc,ocelot-pinctrl" },
|
||||
{},
|
||||
};
|
||||
|
||||
int ocelot_pinctrl_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct ocelot_pinctrl *info;
|
||||
void __iomem *base;
|
||||
int ret;
|
||||
|
||||
info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
base = devm_ioremap_resource(dev,
|
||||
platform_get_resource(pdev, IORESOURCE_MEM, 0));
|
||||
if (IS_ERR(base)) {
|
||||
dev_err(dev, "Failed to ioremap registers\n");
|
||||
return PTR_ERR(base);
|
||||
}
|
||||
|
||||
info->map = devm_regmap_init_mmio(dev, base,
|
||||
&ocelot_pinctrl_regmap_config);
|
||||
if (IS_ERR(info->map)) {
|
||||
dev_err(dev, "Failed to create regmap\n");
|
||||
return PTR_ERR(info->map);
|
||||
}
|
||||
dev_set_drvdata(dev, info->map);
|
||||
info->dev = dev;
|
||||
|
||||
ret = ocelot_pinctrl_register(pdev, info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = ocelot_gpiochip_register(pdev, info);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver ocelot_pinctrl_driver = {
|
||||
.driver = {
|
||||
.name = "pinctrl-ocelot",
|
||||
.of_match_table = of_match_ptr(ocelot_pinctrl_of_match),
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
.probe = ocelot_pinctrl_probe,
|
||||
};
|
||||
builtin_platform_driver(ocelot_pinctrl_driver);
|
@ -1012,10 +1012,8 @@ static int palmas_pinctrl_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
pci = devm_kzalloc(&pdev->dev, sizeof(*pci), GFP_KERNEL);
|
||||
if (!pci) {
|
||||
dev_err(&pdev->dev, "Malloc for pci failed\n");
|
||||
if (!pci)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pci->dev = &pdev->dev;
|
||||
pci->palmas = dev_get_drvdata(pdev->dev.parent);
|
||||
|
@ -136,7 +136,7 @@ struct rockchip_drv {
|
||||
* @iomux: array describing the 4 iomux sources of the bank
|
||||
* @drv: array describing the 4 drive strength sources of the bank
|
||||
* @pull_type: array describing the 4 pull type sources of the bank
|
||||
* @valid: are all necessary informations present
|
||||
* @valid: is all necessary information present
|
||||
* @of_node: dt node of this bank
|
||||
* @drvdata: common pinctrl basedata
|
||||
* @domain: irqdomain of the gpio bank
|
||||
@ -1988,7 +1988,7 @@ static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
info->functions[selector].name, info->groups[group].name);
|
||||
|
||||
/*
|
||||
* for each pin in the pin group selected, program the correspoding pin
|
||||
* for each pin in the pin group selected, program the corresponding
|
||||
* pin function number in the config register.
|
||||
*/
|
||||
for (cnt = 0; cnt < info->groups[group].npins; cnt++) {
|
||||
@ -2014,8 +2014,16 @@ static int rockchip_gpio_get_direction(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct rockchip_pin_bank *bank = gpiochip_get_data(chip);
|
||||
u32 data;
|
||||
int ret;
|
||||
|
||||
ret = clk_enable(bank->clk);
|
||||
if (ret < 0) {
|
||||
dev_err(bank->drvdata->dev,
|
||||
"failed to enable clock for bank %s\n", bank->name);
|
||||
return ret;
|
||||
}
|
||||
data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR);
|
||||
clk_disable(bank->clk);
|
||||
|
||||
return !(data & BIT(offset));
|
||||
}
|
||||
@ -2400,18 +2408,14 @@ static int rockchip_pinctrl_parse_dt(struct platform_device *pdev,
|
||||
info->functions = devm_kzalloc(dev, info->nfunctions *
|
||||
sizeof(struct rockchip_pmx_func),
|
||||
GFP_KERNEL);
|
||||
if (!info->functions) {
|
||||
dev_err(dev, "failed to allocate memory for function list\n");
|
||||
if (!info->functions)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
info->groups = devm_kzalloc(dev, info->ngroups *
|
||||
sizeof(struct rockchip_pin_group),
|
||||
GFP_KERNEL);
|
||||
if (!info->groups) {
|
||||
dev_err(dev, "failed allocate memory for ping group list\n");
|
||||
if (!info->groups)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
|
||||
@ -2447,10 +2451,9 @@ static int rockchip_pinctrl_register(struct platform_device *pdev,
|
||||
|
||||
pindesc = devm_kzalloc(&pdev->dev, sizeof(*pindesc) *
|
||||
info->ctrl->nr_pins, GFP_KERNEL);
|
||||
if (!pindesc) {
|
||||
dev_err(&pdev->dev, "mem alloc for pin descriptors failed\n");
|
||||
if (!pindesc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ctrldesc->pins = pindesc;
|
||||
ctrldesc->npins = info->ctrl->nr_pins;
|
||||
|
||||
@ -2532,7 +2535,7 @@ static int rockchip_gpio_get(struct gpio_chip *gc, unsigned offset)
|
||||
|
||||
/*
|
||||
* gpiolib gpio_direction_input callback function. The setting of the pin
|
||||
* mux function as 'gpio input' will be handled by the pinctrl susbsystem
|
||||
* mux function as 'gpio input' will be handled by the pinctrl subsystem
|
||||
* interface.
|
||||
*/
|
||||
static int rockchip_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
|
||||
@ -2542,7 +2545,7 @@ static int rockchip_gpio_direction_input(struct gpio_chip *gc, unsigned offset)
|
||||
|
||||
/*
|
||||
* gpiolib gpio_direction_output callback function. The setting of the pin
|
||||
* mux function as 'gpio output' will be handled by the pinctrl susbsystem
|
||||
* mux function as 'gpio output' will be handled by the pinctrl subsystem
|
||||
* interface.
|
||||
*/
|
||||
static int rockchip_gpio_direction_output(struct gpio_chip *gc,
|
||||
@ -3163,7 +3166,7 @@ static int rockchip_pinctrl_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
info = devm_kzalloc(dev, sizeof(struct rockchip_pinctrl), GFP_KERNEL);
|
||||
info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
|
||||
if (!info)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -1462,8 +1462,6 @@ static void pcs_irq_chain_handler(struct irq_desc *desc)
|
||||
pcs_irq_handle(pcs_soc);
|
||||
/* REVISIT: export and add handle_bad_irq(irq, desc)? */
|
||||
chained_irq_exit(chip, desc);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq,
|
||||
@ -1649,10 +1647,9 @@ static int pcs_probe(struct platform_device *pdev)
|
||||
return -EINVAL;
|
||||
|
||||
pcs = devm_kzalloc(&pdev->dev, sizeof(*pcs), GFP_KERNEL);
|
||||
if (!pcs) {
|
||||
dev_err(&pdev->dev, "could not allocate\n");
|
||||
if (!pcs)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pcs->dev = &pdev->dev;
|
||||
pcs->np = np;
|
||||
raw_spin_lock_init(&pcs->lock);
|
||||
@ -1777,8 +1774,7 @@ static int pcs_probe(struct platform_device *pdev)
|
||||
dev_warn(pcs->dev, "initialized with no interrupts\n");
|
||||
}
|
||||
|
||||
dev_info(pcs->dev, "%i pins at pa %p size %u\n",
|
||||
pcs->desc.npins, pcs->base, pcs->size);
|
||||
dev_info(pcs->dev, "%i pins, size %u\n", pcs->desc.npins, pcs->size);
|
||||
|
||||
return pinctrl_enable(pcs->pctl);
|
||||
|
||||
|
@ -1144,6 +1144,27 @@ static int sx150x_probe(struct i2c_client *client,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Pinctrl_desc */
|
||||
pctl->pinctrl_desc.name = "sx150x-pinctrl";
|
||||
pctl->pinctrl_desc.pctlops = &sx150x_pinctrl_ops;
|
||||
pctl->pinctrl_desc.confops = &sx150x_pinconf_ops;
|
||||
pctl->pinctrl_desc.pins = pctl->data->pins;
|
||||
pctl->pinctrl_desc.npins = pctl->data->npins;
|
||||
pctl->pinctrl_desc.owner = THIS_MODULE;
|
||||
|
||||
ret = devm_pinctrl_register_and_init(dev, &pctl->pinctrl_desc,
|
||||
pctl, &pctl->pctldev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register pinctrl device\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = pinctrl_enable(pctl->pctldev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to enable pinctrl device\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Register GPIO controller */
|
||||
pctl->gpio.label = devm_kstrdup(dev, client->name, GFP_KERNEL);
|
||||
pctl->gpio.base = -1;
|
||||
@ -1172,6 +1193,11 @@ static int sx150x_probe(struct i2c_client *client,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = gpiochip_add_pin_range(&pctl->gpio, dev_name(dev),
|
||||
0, 0, pctl->data->npins);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Add Interrupt support if an irq is specified */
|
||||
if (client->irq > 0) {
|
||||
pctl->irq_chip.name = devm_kstrdup(dev, client->name,
|
||||
@ -1217,20 +1243,6 @@ static int sx150x_probe(struct i2c_client *client,
|
||||
client->irq);
|
||||
}
|
||||
|
||||
/* Pinctrl_desc */
|
||||
pctl->pinctrl_desc.name = "sx150x-pinctrl";
|
||||
pctl->pinctrl_desc.pctlops = &sx150x_pinctrl_ops;
|
||||
pctl->pinctrl_desc.confops = &sx150x_pinconf_ops;
|
||||
pctl->pinctrl_desc.pins = pctl->data->pins;
|
||||
pctl->pinctrl_desc.npins = pctl->data->npins;
|
||||
pctl->pinctrl_desc.owner = THIS_MODULE;
|
||||
|
||||
pctl->pctldev = pinctrl_register(&pctl->pinctrl_desc, dev, pctl);
|
||||
if (IS_ERR(pctl->pctldev)) {
|
||||
dev_err(dev, "Failed to register pinctrl device\n");
|
||||
return PTR_ERR(pctl->pctldev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -357,10 +357,8 @@ static int add_map_configs(struct device *dev,
|
||||
|
||||
dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
|
||||
GFP_KERNEL);
|
||||
if (!dup_configs) {
|
||||
dev_err(dev, "kmemdup(configs) failed\n");
|
||||
if (!dup_configs)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* We support both pins and pin groups, but we need to figure out which
|
||||
@ -931,10 +929,9 @@ static int tz1090_pdc_pinctrl_probe(struct platform_device *pdev)
|
||||
struct resource *res;
|
||||
|
||||
pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
|
||||
if (!pmx) {
|
||||
dev_err(&pdev->dev, "Can't alloc tz1090_pdc_pmx\n");
|
||||
if (!pmx)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pmx->dev = &pdev->dev;
|
||||
spin_lock_init(&pmx->lock);
|
||||
|
||||
|
@ -1082,10 +1082,8 @@ static int add_map_configs(struct device *dev,
|
||||
|
||||
dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
|
||||
GFP_KERNEL);
|
||||
if (!dup_configs) {
|
||||
dev_err(dev, "kmemdup(configs) failed\n");
|
||||
if (!dup_configs)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
(*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
|
||||
(*map)[*num_maps].data.configs.group_or_pin = group;
|
||||
@ -1946,10 +1944,9 @@ static int tz1090_pinctrl_probe(struct platform_device *pdev)
|
||||
struct resource *res;
|
||||
|
||||
pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
|
||||
if (!pmx) {
|
||||
dev_err(&pdev->dev, "Can't alloc tz1090_pmx\n");
|
||||
if (!pmx)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pmx->dev = &pdev->dev;
|
||||
spin_lock_init(&pmx->lock);
|
||||
|
||||
|
@ -83,10 +83,8 @@ int pinctrl_utils_add_map_configs(struct pinctrl_dev *pctldev,
|
||||
|
||||
dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
|
||||
GFP_KERNEL);
|
||||
if (!dup_configs) {
|
||||
dev_err(pctldev->dev, "kmemdup(configs) failed\n");
|
||||
if (!dup_configs)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
(*map)[*num_maps].type = type;
|
||||
(*map)[*num_maps].data.configs.group_or_pin = group;
|
||||
|
@ -1730,18 +1730,16 @@ static int pinmux_xway_probe(struct platform_device *pdev)
|
||||
xway_info.pads = devm_kzalloc(&pdev->dev,
|
||||
sizeof(struct pinctrl_pin_desc) * xway_chip.ngpio,
|
||||
GFP_KERNEL);
|
||||
if (!xway_info.pads) {
|
||||
dev_err(&pdev->dev, "Failed to allocate pads\n");
|
||||
if (!xway_info.pads)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < xway_chip.ngpio; i++) {
|
||||
/* strlen("ioXY") + 1 = 5 */
|
||||
char *name = devm_kzalloc(&pdev->dev, 5, GFP_KERNEL);
|
||||
|
||||
if (!name) {
|
||||
dev_err(&pdev->dev, "Failed to allocate pad name\n");
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
snprintf(name, 5, "io%d", i);
|
||||
xway_info.pads[i].number = GPIO0 + i;
|
||||
xway_info.pads[i].name = name;
|
||||
|
@ -493,8 +493,6 @@ void pinmux_disable_setting(const struct pinctrl_setting *setting)
|
||||
continue;
|
||||
}
|
||||
if (desc->mux_setting == &(setting->data.mux)) {
|
||||
desc->mux_setting = NULL;
|
||||
/* And release the pin */
|
||||
pin_free(pctldev, pins[i], NULL);
|
||||
} else {
|
||||
const char *gname;
|
||||
@ -619,7 +617,7 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
|
||||
pctlops->get_group_name(pctldev,
|
||||
desc->mux_setting->group));
|
||||
else
|
||||
seq_printf(s, "\n");
|
||||
seq_putc(s, '\n');
|
||||
}
|
||||
|
||||
mutex_unlock(&pctldev->mutex);
|
||||
|
@ -436,3 +436,7 @@ int pxa2xx_pinctrl_exit(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pxa2xx_pinctrl_exit);
|
||||
|
||||
MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
|
||||
MODULE_DESCRIPTION("Marvell PXA2xx pinctrl driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -106,6 +106,14 @@ config PINCTRL_MSM8996
|
||||
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
|
||||
Qualcomm TLMM block found in the Qualcomm MSM8996 platform.
|
||||
|
||||
config PINCTRL_MSM8998
|
||||
tristate "Qualcomm MSM8998 pin controller driver"
|
||||
depends on GPIOLIB && OF
|
||||
select PINCTRL_MSM
|
||||
help
|
||||
This is the pinctrl, pinmux, pinconf and gpiolib driver for the
|
||||
Qualcomm TLMM block found in the Qualcomm MSM8998 platform.
|
||||
|
||||
config PINCTRL_QDF2XXX
|
||||
tristate "Qualcomm Technologies QDF2xxx pin controller driver"
|
||||
depends on GPIOLIB && ACPI
|
||||
|
@ -12,6 +12,7 @@ obj-$(CONFIG_PINCTRL_MSM8X74) += pinctrl-msm8x74.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8916) += pinctrl-msm8916.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8994) += pinctrl-msm8994.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8996) += pinctrl-msm8996.o
|
||||
obj-$(CONFIG_PINCTRL_MSM8998) += pinctrl-msm8998.o
|
||||
obj-$(CONFIG_PINCTRL_QDF2XXX) += pinctrl-qdf2xxx.o
|
||||
obj-$(CONFIG_PINCTRL_MDM9615) += pinctrl-mdm9615.o
|
||||
obj-$(CONFIG_PINCTRL_QCOM_SPMI_PMIC) += pinctrl-spmi-gpio.o
|
||||
|
@ -898,10 +898,9 @@ int msm_pinctrl_probe(struct platform_device *pdev,
|
||||
int ret;
|
||||
|
||||
pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
|
||||
if (!pctrl) {
|
||||
dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
|
||||
if (!pctrl)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pctrl->dev = &pdev->dev;
|
||||
pctrl->soc = soc_data;
|
||||
pctrl->chip = msm_gpio_template;
|
||||
|
1590
drivers/pinctrl/qcom/pinctrl-msm8998.c
Normal file
1590
drivers/pinctrl/qcom/pinctrl-msm8998.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,4 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
#
|
||||
# Samsung Pin control drivers
|
||||
#
|
||||
|
@ -1,22 +1,17 @@
|
||||
/*
|
||||
* Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2012 Linaro Ltd
|
||||
* http://www.linaro.org
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the Samsung Exynos specific information required by the
|
||||
* the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
|
||||
//
|
||||
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
// http://www.samsung.com
|
||||
// Copyright (c) 2012 Linaro Ltd
|
||||
// http://www.linaro.org
|
||||
//
|
||||
// Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
//
|
||||
// This file contains the Samsung Exynos specific information required by the
|
||||
// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
// external gpio and wakeup interrupt support.
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/of_address.h>
|
||||
|
@ -1,22 +1,17 @@
|
||||
/*
|
||||
* Exynos ARMv8 specific support for Samsung pinctrl/gpiolib driver
|
||||
* with eint support.
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2012 Linaro Ltd
|
||||
* http://www.linaro.org
|
||||
* Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the Samsung Exynos specific information required by the
|
||||
* the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Exynos ARMv8 specific support for Samsung pinctrl/gpiolib driver
|
||||
// with eint support.
|
||||
//
|
||||
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
// http://www.samsung.com
|
||||
// Copyright (c) 2012 Linaro Ltd
|
||||
// http://www.linaro.org
|
||||
// Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org>
|
||||
//
|
||||
// This file contains the Samsung Exynos specific information required by the
|
||||
// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
// external gpio and wakeup interrupt support.
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/soc/samsung/exynos-regs-pmu.h>
|
||||
|
@ -1,22 +1,17 @@
|
||||
/*
|
||||
* Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2012 Linaro Ltd
|
||||
* http://www.linaro.org
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the Samsung Exynos specific information required by the
|
||||
* the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
|
||||
//
|
||||
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
// http://www.samsung.com
|
||||
// Copyright (c) 2012 Linaro Ltd
|
||||
// http://www.linaro.org
|
||||
//
|
||||
// Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
//
|
||||
// This file contains the Samsung Exynos specific information required by the
|
||||
// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
// external gpio and wakeup interrupt support.
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Exynos specific definitions for Samsung pinctrl and gpiolib driver.
|
||||
*
|
||||
@ -10,11 +11,6 @@
|
||||
* pinctrl/gpiolib interface drivers.
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __PINCTRL_SAMSUNG_EXYNOS_H
|
||||
|
@ -1,16 +1,11 @@
|
||||
/*
|
||||
* pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// pin-controller/pin-mux/pin-config/gpio-driver for Samsung's EXYNOS5440 SoC.
|
||||
//
|
||||
// Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
//
|
||||
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
// http://www.samsung.com
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -1,17 +1,12 @@
|
||||
/*
|
||||
* S3C24XX specific support for Samsung pinctrl/gpiolib driver.
|
||||
*
|
||||
* Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the SamsungS3C24XX specific information required by the
|
||||
* Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// S3C24XX specific support for Samsung pinctrl/gpiolib driver.
|
||||
//
|
||||
// Copyright (c) 2013 Heiko Stuebner <heiko@sntech.de>
|
||||
//
|
||||
// This file contains the SamsungS3C24XX specific information required by the
|
||||
// Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
// external gpio and wakeup interrupt support.
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -1,19 +1,14 @@
|
||||
/*
|
||||
* S3C64xx specific support for pinctrl-samsung driver.
|
||||
*
|
||||
* Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
|
||||
*
|
||||
* Based on pinctrl-exynos.c, please see the file for original copyrights.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This file contains the Samsung S3C64xx specific information required by the
|
||||
* the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
* external gpio and wakeup interrupt support.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// S3C64xx specific support for pinctrl-samsung driver.
|
||||
//
|
||||
// Copyright (c) 2013 Tomasz Figa <tomasz.figa@gmail.com>
|
||||
//
|
||||
// Based on pinctrl-exynos.c, please see the file for original copyrights.
|
||||
//
|
||||
// This file contains the Samsung S3C64xx specific information required by the
|
||||
// the Samsung pinctrl/gpiolib driver. It also includes the implementation of
|
||||
// external gpio and wakeup interrupt support.
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -1,24 +1,19 @@
|
||||
/*
|
||||
* pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
|
||||
*
|
||||
* Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
* http://www.samsung.com
|
||||
* Copyright (c) 2012 Linaro Ltd
|
||||
* http://www.linaro.org
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This driver implements the Samsung pinctrl driver. It supports setting up of
|
||||
* pinmux and pinconf configurations. The gpiolib interface is also included.
|
||||
* External interrupt (gpio and wakeup) support are not included in this driver
|
||||
* but provides extensions to which platform specific implementation of the gpio
|
||||
* and wakeup interrupts can be hooked to.
|
||||
*/
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
//
|
||||
// pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
|
||||
//
|
||||
// Copyright (c) 2012 Samsung Electronics Co., Ltd.
|
||||
// http://www.samsung.com
|
||||
// Copyright (c) 2012 Linaro Ltd
|
||||
// http://www.linaro.org
|
||||
//
|
||||
// Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
//
|
||||
// This driver implements the Samsung pinctrl driver. It supports setting up of
|
||||
// pinmux and pinconf configurations. The gpiolib interface is also included.
|
||||
// External interrupt (gpio and wakeup) support are not included in this driver
|
||||
// but provides extensions to which platform specific implementation of the gpio
|
||||
// and wakeup interrupts can be hooked to.
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* pin-controller/pin-mux/pin-config/gpio-driver for Samsung's SoC's.
|
||||
*
|
||||
@ -7,11 +8,6 @@
|
||||
* http://www.linaro.org
|
||||
*
|
||||
* Author: Thomas Abraham <thomas.ab@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __PINCTRL_SAMSUNG_H
|
||||
|
@ -89,6 +89,11 @@ config PINCTRL_PFC_R8A7796
|
||||
depends on ARCH_R8A7796
|
||||
select PINCTRL_SH_PFC
|
||||
|
||||
config PINCTRL_PFC_R8A77970
|
||||
def_bool y
|
||||
depends on ARCH_R8A77970
|
||||
select PINCTRL_SH_PFC
|
||||
|
||||
config PINCTRL_PFC_R8A77995
|
||||
def_bool y
|
||||
depends on ARCH_R8A77995
|
||||
|
@ -16,6 +16,7 @@ obj-$(CONFIG_PINCTRL_PFC_R8A7794) += pfc-r8a7794.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7795) += pfc-r8a7795.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7795) += pfc-r8a7795-es1.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A7796) += pfc-r8a7796.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A77970) += pfc-r8a77970.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_R8A77995) += pfc-r8a77995.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_SH7203) += pfc-sh7203.o
|
||||
obj-$(CONFIG_PINCTRL_PFC_SH7264) += pfc-sh7264.o
|
||||
|
@ -557,6 +557,12 @@ static const struct of_device_id sh_pfc_of_table[] = {
|
||||
.data = &r8a7796_pinmux_info,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_PFC_R8A77970
|
||||
{
|
||||
.compatible = "renesas,pfc-r8a77970",
|
||||
.data = &r8a77970_pinmux_info,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_PINCTRL_PFC_R8A77995
|
||||
{
|
||||
.compatible = "renesas,pfc-r8a77995",
|
||||
|
@ -4145,6 +4145,32 @@ static const unsigned int ssi9_ctrl_b_mux[] = {
|
||||
SSI_SCK9_B_MARK, SSI_WS9_B_MARK,
|
||||
};
|
||||
|
||||
/* - TPU -------------------------------------------------------------------- */
|
||||
static const unsigned int tpu_to0_pins[] = {
|
||||
RCAR_GP_PIN(6, 14),
|
||||
};
|
||||
static const unsigned int tpu_to0_mux[] = {
|
||||
TPU_TO0_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to1_pins[] = {
|
||||
RCAR_GP_PIN(1, 17),
|
||||
};
|
||||
static const unsigned int tpu_to1_mux[] = {
|
||||
TPU_TO1_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to2_pins[] = {
|
||||
RCAR_GP_PIN(1, 18),
|
||||
};
|
||||
static const unsigned int tpu_to2_mux[] = {
|
||||
TPU_TO2_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to3_pins[] = {
|
||||
RCAR_GP_PIN(1, 24),
|
||||
};
|
||||
static const unsigned int tpu_to3_mux[] = {
|
||||
TPU_TO3_MARK,
|
||||
};
|
||||
|
||||
/* - USB0 ------------------------------------------------------------------- */
|
||||
static const unsigned int usb0_pins[] = {
|
||||
RCAR_GP_PIN(7, 23), /* PWEN */
|
||||
@ -4431,7 +4457,7 @@ static const unsigned int vin2_clk_mux[] = {
|
||||
};
|
||||
|
||||
static const struct {
|
||||
struct sh_pfc_pin_group common[342];
|
||||
struct sh_pfc_pin_group common[346];
|
||||
struct sh_pfc_pin_group r8a779x[9];
|
||||
} pinmux_groups = {
|
||||
.common = {
|
||||
@ -4743,6 +4769,10 @@ static const struct {
|
||||
SH_PFC_PIN_GROUP(ssi9_data_b),
|
||||
SH_PFC_PIN_GROUP(ssi9_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi9_ctrl_b),
|
||||
SH_PFC_PIN_GROUP(tpu_to0),
|
||||
SH_PFC_PIN_GROUP(tpu_to1),
|
||||
SH_PFC_PIN_GROUP(tpu_to2),
|
||||
SH_PFC_PIN_GROUP(tpu_to3),
|
||||
SH_PFC_PIN_GROUP(usb0),
|
||||
SH_PFC_PIN_GROUP(usb1),
|
||||
VIN_DATA_PIN_GROUP(vin0_data, 24),
|
||||
@ -4826,6 +4856,10 @@ static const char * const can0_groups[] = {
|
||||
"can0_data_d",
|
||||
"can0_data_e",
|
||||
"can0_data_f",
|
||||
/*
|
||||
* Retained for backwards compatibility, use can_clk_groups in new
|
||||
* designs.
|
||||
*/
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
@ -4837,6 +4871,21 @@ static const char * const can1_groups[] = {
|
||||
"can1_data_b",
|
||||
"can1_data_c",
|
||||
"can1_data_d",
|
||||
/*
|
||||
* Retained for backwards compatibility, use can_clk_groups in new
|
||||
* designs.
|
||||
*/
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
"can_clk_d",
|
||||
};
|
||||
|
||||
/*
|
||||
* can_clk_groups allows for independent configuration, use can_clk function
|
||||
* in new designs.
|
||||
*/
|
||||
static const char * const can_clk_groups[] = {
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
@ -5259,6 +5308,13 @@ static const char * const ssi_groups[] = {
|
||||
"ssi9_ctrl_b",
|
||||
};
|
||||
|
||||
static const char * const tpu_groups[] = {
|
||||
"tpu_to0",
|
||||
"tpu_to1",
|
||||
"tpu_to2",
|
||||
"tpu_to3",
|
||||
};
|
||||
|
||||
static const char * const usb0_groups[] = {
|
||||
"usb0",
|
||||
};
|
||||
@ -5308,7 +5364,7 @@ static const char * const vin2_groups[] = {
|
||||
};
|
||||
|
||||
static const struct {
|
||||
struct sh_pfc_function common[56];
|
||||
struct sh_pfc_function common[58];
|
||||
struct sh_pfc_function r8a779x[2];
|
||||
} pinmux_functions = {
|
||||
.common = {
|
||||
@ -5316,6 +5372,7 @@ static const struct {
|
||||
SH_PFC_FUNCTION(avb),
|
||||
SH_PFC_FUNCTION(can0),
|
||||
SH_PFC_FUNCTION(can1),
|
||||
SH_PFC_FUNCTION(can_clk),
|
||||
SH_PFC_FUNCTION(du),
|
||||
SH_PFC_FUNCTION(du0),
|
||||
SH_PFC_FUNCTION(du1),
|
||||
@ -5363,6 +5420,7 @@ static const struct {
|
||||
SH_PFC_FUNCTION(sdhi1),
|
||||
SH_PFC_FUNCTION(sdhi2),
|
||||
SH_PFC_FUNCTION(ssi),
|
||||
SH_PFC_FUNCTION(tpu),
|
||||
SH_PFC_FUNCTION(usb0),
|
||||
SH_PFC_FUNCTION(usb1),
|
||||
SH_PFC_FUNCTION(vin0),
|
||||
|
@ -1608,6 +1608,116 @@ static const unsigned int avb_gmii_mux[] = {
|
||||
AVB_TX_EN_MARK, AVB_TX_ER_MARK, AVB_TX_CLK_MARK,
|
||||
AVB_COL_MARK,
|
||||
};
|
||||
|
||||
/* - CAN -------------------------------------------------------------------- */
|
||||
static const unsigned int can0_data_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(6, 15), RCAR_GP_PIN(6, 14),
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_mux[] = {
|
||||
CAN0_TX_MARK, CAN0_RX_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_b_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(3, 16), RCAR_GP_PIN(3, 15),
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_b_mux[] = {
|
||||
CAN0_TX_B_MARK, CAN0_RX_B_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_c_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(2, 17), RCAR_GP_PIN(2, 16),
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_c_mux[] = {
|
||||
CAN0_TX_C_MARK, CAN0_RX_C_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_d_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(5, 12), RCAR_GP_PIN(5, 11),
|
||||
};
|
||||
|
||||
static const unsigned int can0_data_d_mux[] = {
|
||||
CAN0_TX_D_MARK, CAN0_RX_D_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(6, 25), RCAR_GP_PIN(6, 24),
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_mux[] = {
|
||||
CAN1_TX_MARK, CAN1_RX_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_b_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 1),
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_b_mux[] = {
|
||||
CAN1_TX_B_MARK, CAN1_RX_B_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_c_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(5, 6), RCAR_GP_PIN(5, 5),
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_c_mux[] = {
|
||||
CAN1_TX_C_MARK, CAN1_RX_C_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_d_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(3, 31), RCAR_GP_PIN(3, 30),
|
||||
};
|
||||
|
||||
static const unsigned int can1_data_d_mux[] = {
|
||||
CAN1_TX_D_MARK, CAN1_RX_D_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_pins[] = {
|
||||
/* CLK */
|
||||
RCAR_GP_PIN(3, 31),
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_mux[] = {
|
||||
CAN_CLK_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_b_pins[] = {
|
||||
/* CLK */
|
||||
RCAR_GP_PIN(1, 23),
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_b_mux[] = {
|
||||
CAN_CLK_B_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_c_pins[] = {
|
||||
/* CLK */
|
||||
RCAR_GP_PIN(1, 0),
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_c_mux[] = {
|
||||
CAN_CLK_C_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_d_pins[] = {
|
||||
/* CLK */
|
||||
RCAR_GP_PIN(5, 0),
|
||||
};
|
||||
|
||||
static const unsigned int can_clk_d_mux[] = {
|
||||
CAN_CLK_D_MARK,
|
||||
};
|
||||
|
||||
/* - DU --------------------------------------------------------------------- */
|
||||
static const unsigned int du0_rgb666_pins[] = {
|
||||
/* R[7:2], G[7:2], B[7:2] */
|
||||
@ -2118,6 +2228,35 @@ static const unsigned int i2c4_e_pins[] = {
|
||||
static const unsigned int i2c4_e_mux[] = {
|
||||
I2C4_SCL_E_MARK, I2C4_SDA_E_MARK,
|
||||
};
|
||||
/* - I2C5 ------------------------------------------------------------------- */
|
||||
static const unsigned int i2c5_pins[] = {
|
||||
/* SCL, SDA */
|
||||
RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 15),
|
||||
};
|
||||
static const unsigned int i2c5_mux[] = {
|
||||
I2C5_SCL_MARK, I2C5_SDA_MARK,
|
||||
};
|
||||
static const unsigned int i2c5_b_pins[] = {
|
||||
/* SCL, SDA */
|
||||
RCAR_GP_PIN(0, 14), RCAR_GP_PIN(0, 15),
|
||||
};
|
||||
static const unsigned int i2c5_b_mux[] = {
|
||||
I2C5_SCL_B_MARK, I2C5_SDA_B_MARK,
|
||||
};
|
||||
static const unsigned int i2c5_c_pins[] = {
|
||||
/* SCL, SDA */
|
||||
RCAR_GP_PIN(4, 31), RCAR_GP_PIN(4, 30),
|
||||
};
|
||||
static const unsigned int i2c5_c_mux[] = {
|
||||
I2C5_SCL_C_MARK, I2C5_SDA_C_MARK,
|
||||
};
|
||||
static const unsigned int i2c5_d_pins[] = {
|
||||
/* SCL, SDA */
|
||||
RCAR_GP_PIN(3, 13), RCAR_GP_PIN(3, 14),
|
||||
};
|
||||
static const unsigned int i2c5_d_mux[] = {
|
||||
I2C5_SCL_D_MARK, I2C5_SDA_D_MARK,
|
||||
};
|
||||
/* - INTC ------------------------------------------------------------------- */
|
||||
static const unsigned int intc_irq0_pins[] = {
|
||||
/* IRQ0 */
|
||||
@ -2436,6 +2575,109 @@ static const unsigned int msiof2_tx_b_pins[] = {
|
||||
static const unsigned int msiof2_tx_b_mux[] = {
|
||||
MSIOF2_TXD_B_MARK,
|
||||
};
|
||||
/* - PWM -------------------------------------------------------------------- */
|
||||
static const unsigned int pwm0_pins[] = {
|
||||
RCAR_GP_PIN(1, 14),
|
||||
};
|
||||
static const unsigned int pwm0_mux[] = {
|
||||
PWM0_MARK,
|
||||
};
|
||||
static const unsigned int pwm0_b_pins[] = {
|
||||
RCAR_GP_PIN(5, 3),
|
||||
};
|
||||
static const unsigned int pwm0_b_mux[] = {
|
||||
PWM0_B_MARK,
|
||||
};
|
||||
static const unsigned int pwm1_pins[] = {
|
||||
RCAR_GP_PIN(4, 5),
|
||||
};
|
||||
static const unsigned int pwm1_mux[] = {
|
||||
PWM1_MARK,
|
||||
};
|
||||
static const unsigned int pwm1_b_pins[] = {
|
||||
RCAR_GP_PIN(5, 10),
|
||||
};
|
||||
static const unsigned int pwm1_b_mux[] = {
|
||||
PWM1_B_MARK,
|
||||
};
|
||||
static const unsigned int pwm1_c_pins[] = {
|
||||
RCAR_GP_PIN(1, 18),
|
||||
};
|
||||
static const unsigned int pwm1_c_mux[] = {
|
||||
PWM1_C_MARK,
|
||||
};
|
||||
static const unsigned int pwm2_pins[] = {
|
||||
RCAR_GP_PIN(4, 10),
|
||||
};
|
||||
static const unsigned int pwm2_mux[] = {
|
||||
PWM2_MARK,
|
||||
};
|
||||
static const unsigned int pwm2_b_pins[] = {
|
||||
RCAR_GP_PIN(5, 17),
|
||||
};
|
||||
static const unsigned int pwm2_b_mux[] = {
|
||||
PWM2_B_MARK,
|
||||
};
|
||||
static const unsigned int pwm2_c_pins[] = {
|
||||
RCAR_GP_PIN(0, 13),
|
||||
};
|
||||
static const unsigned int pwm2_c_mux[] = {
|
||||
PWM2_C_MARK,
|
||||
};
|
||||
static const unsigned int pwm3_pins[] = {
|
||||
RCAR_GP_PIN(4, 13),
|
||||
};
|
||||
static const unsigned int pwm3_mux[] = {
|
||||
PWM3_MARK,
|
||||
};
|
||||
static const unsigned int pwm3_b_pins[] = {
|
||||
RCAR_GP_PIN(0, 16),
|
||||
};
|
||||
static const unsigned int pwm3_b_mux[] = {
|
||||
PWM3_B_MARK,
|
||||
};
|
||||
static const unsigned int pwm4_pins[] = {
|
||||
RCAR_GP_PIN(1, 3),
|
||||
};
|
||||
static const unsigned int pwm4_mux[] = {
|
||||
PWM4_MARK,
|
||||
};
|
||||
static const unsigned int pwm4_b_pins[] = {
|
||||
RCAR_GP_PIN(0, 21),
|
||||
};
|
||||
static const unsigned int pwm4_b_mux[] = {
|
||||
PWM4_B_MARK,
|
||||
};
|
||||
static const unsigned int pwm5_pins[] = {
|
||||
RCAR_GP_PIN(3, 30),
|
||||
};
|
||||
static const unsigned int pwm5_mux[] = {
|
||||
PWM5_MARK,
|
||||
};
|
||||
static const unsigned int pwm5_b_pins[] = {
|
||||
RCAR_GP_PIN(4, 0),
|
||||
};
|
||||
static const unsigned int pwm5_b_mux[] = {
|
||||
PWM5_B_MARK,
|
||||
};
|
||||
static const unsigned int pwm5_c_pins[] = {
|
||||
RCAR_GP_PIN(0, 10),
|
||||
};
|
||||
static const unsigned int pwm5_c_mux[] = {
|
||||
PWM5_C_MARK,
|
||||
};
|
||||
static const unsigned int pwm6_pins[] = {
|
||||
RCAR_GP_PIN(4, 8),
|
||||
};
|
||||
static const unsigned int pwm6_mux[] = {
|
||||
PWM6_MARK,
|
||||
};
|
||||
static const unsigned int pwm6_b_pins[] = {
|
||||
RCAR_GP_PIN(0, 7),
|
||||
};
|
||||
static const unsigned int pwm6_b_mux[] = {
|
||||
PWM6_B_MARK,
|
||||
};
|
||||
/* - QSPI ------------------------------------------------------------------- */
|
||||
static const unsigned int qspi_ctrl_pins[] = {
|
||||
/* SPCLK, SSL */
|
||||
@ -3280,6 +3522,79 @@ static const unsigned int ssi9_ctrl_b_pins[] = {
|
||||
static const unsigned int ssi9_ctrl_b_mux[] = {
|
||||
SSI_SCK9_B_MARK, SSI_WS9_B_MARK,
|
||||
};
|
||||
/* - TPU -------------------------------------------------------------------- */
|
||||
static const unsigned int tpu_to0_pins[] = {
|
||||
RCAR_GP_PIN(3, 31),
|
||||
};
|
||||
static const unsigned int tpu_to0_mux[] = {
|
||||
TPUTO0_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to0_b_pins[] = {
|
||||
RCAR_GP_PIN(3, 30),
|
||||
};
|
||||
static const unsigned int tpu_to0_b_mux[] = {
|
||||
TPUTO0_B_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to0_c_pins[] = {
|
||||
RCAR_GP_PIN(1, 18),
|
||||
};
|
||||
static const unsigned int tpu_to0_c_mux[] = {
|
||||
TPUTO0_C_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to1_pins[] = {
|
||||
RCAR_GP_PIN(4, 9),
|
||||
};
|
||||
static const unsigned int tpu_to1_mux[] = {
|
||||
TPUTO1_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to1_b_pins[] = {
|
||||
RCAR_GP_PIN(4, 0),
|
||||
};
|
||||
static const unsigned int tpu_to1_b_mux[] = {
|
||||
TPUTO1_B_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to1_c_pins[] = {
|
||||
RCAR_GP_PIN(4, 4),
|
||||
};
|
||||
static const unsigned int tpu_to1_c_mux[] = {
|
||||
TPUTO1_C_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to2_pins[] = {
|
||||
RCAR_GP_PIN(1, 3),
|
||||
};
|
||||
static const unsigned int tpu_to2_mux[] = {
|
||||
TPUTO2_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to2_b_pins[] = {
|
||||
RCAR_GP_PIN(1, 0),
|
||||
};
|
||||
static const unsigned int tpu_to2_b_mux[] = {
|
||||
TPUTO2_B_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to2_c_pins[] = {
|
||||
RCAR_GP_PIN(0, 22),
|
||||
};
|
||||
static const unsigned int tpu_to2_c_mux[] = {
|
||||
TPUTO2_C_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to3_pins[] = {
|
||||
RCAR_GP_PIN(1, 14),
|
||||
};
|
||||
static const unsigned int tpu_to3_mux[] = {
|
||||
TPUTO3_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to3_b_pins[] = {
|
||||
RCAR_GP_PIN(1, 13),
|
||||
};
|
||||
static const unsigned int tpu_to3_b_mux[] = {
|
||||
TPUTO3_B_MARK,
|
||||
};
|
||||
static const unsigned int tpu_to3_c_pins[] = {
|
||||
RCAR_GP_PIN(0, 21),
|
||||
};
|
||||
static const unsigned int tpu_to3_c_mux[] = {
|
||||
TPUTO3_C_MARK,
|
||||
};
|
||||
/* - USB0 ------------------------------------------------------------------- */
|
||||
static const unsigned int usb0_pins[] = {
|
||||
RCAR_GP_PIN(5, 24), /* PWEN */
|
||||
@ -3459,6 +3774,18 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(avb_mdio),
|
||||
SH_PFC_PIN_GROUP(avb_mii),
|
||||
SH_PFC_PIN_GROUP(avb_gmii),
|
||||
SH_PFC_PIN_GROUP(can0_data),
|
||||
SH_PFC_PIN_GROUP(can0_data_b),
|
||||
SH_PFC_PIN_GROUP(can0_data_c),
|
||||
SH_PFC_PIN_GROUP(can0_data_d),
|
||||
SH_PFC_PIN_GROUP(can1_data),
|
||||
SH_PFC_PIN_GROUP(can1_data_b),
|
||||
SH_PFC_PIN_GROUP(can1_data_c),
|
||||
SH_PFC_PIN_GROUP(can1_data_d),
|
||||
SH_PFC_PIN_GROUP(can_clk),
|
||||
SH_PFC_PIN_GROUP(can_clk_b),
|
||||
SH_PFC_PIN_GROUP(can_clk_c),
|
||||
SH_PFC_PIN_GROUP(can_clk_d),
|
||||
SH_PFC_PIN_GROUP(du0_rgb666),
|
||||
SH_PFC_PIN_GROUP(du0_rgb888),
|
||||
SH_PFC_PIN_GROUP(du0_clk0_out),
|
||||
@ -3523,6 +3850,10 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(i2c4_c),
|
||||
SH_PFC_PIN_GROUP(i2c4_d),
|
||||
SH_PFC_PIN_GROUP(i2c4_e),
|
||||
SH_PFC_PIN_GROUP(i2c5),
|
||||
SH_PFC_PIN_GROUP(i2c5_b),
|
||||
SH_PFC_PIN_GROUP(i2c5_c),
|
||||
SH_PFC_PIN_GROUP(i2c5_d),
|
||||
SH_PFC_PIN_GROUP(intc_irq0),
|
||||
SH_PFC_PIN_GROUP(intc_irq1),
|
||||
SH_PFC_PIN_GROUP(intc_irq2),
|
||||
@ -3567,6 +3898,23 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(msiof2_ss2_b),
|
||||
SH_PFC_PIN_GROUP(msiof2_rx_b),
|
||||
SH_PFC_PIN_GROUP(msiof2_tx_b),
|
||||
SH_PFC_PIN_GROUP(pwm0),
|
||||
SH_PFC_PIN_GROUP(pwm0_b),
|
||||
SH_PFC_PIN_GROUP(pwm1),
|
||||
SH_PFC_PIN_GROUP(pwm1_b),
|
||||
SH_PFC_PIN_GROUP(pwm1_c),
|
||||
SH_PFC_PIN_GROUP(pwm2),
|
||||
SH_PFC_PIN_GROUP(pwm2_b),
|
||||
SH_PFC_PIN_GROUP(pwm2_c),
|
||||
SH_PFC_PIN_GROUP(pwm3),
|
||||
SH_PFC_PIN_GROUP(pwm3_b),
|
||||
SH_PFC_PIN_GROUP(pwm4),
|
||||
SH_PFC_PIN_GROUP(pwm4_b),
|
||||
SH_PFC_PIN_GROUP(pwm5),
|
||||
SH_PFC_PIN_GROUP(pwm5_b),
|
||||
SH_PFC_PIN_GROUP(pwm5_c),
|
||||
SH_PFC_PIN_GROUP(pwm6),
|
||||
SH_PFC_PIN_GROUP(pwm6_b),
|
||||
SH_PFC_PIN_GROUP(qspi_ctrl),
|
||||
SH_PFC_PIN_GROUP(qspi_data2),
|
||||
SH_PFC_PIN_GROUP(qspi_data4),
|
||||
@ -3684,6 +4032,18 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(ssi9_ctrl),
|
||||
SH_PFC_PIN_GROUP(ssi9_data_b),
|
||||
SH_PFC_PIN_GROUP(ssi9_ctrl_b),
|
||||
SH_PFC_PIN_GROUP(tpu_to0),
|
||||
SH_PFC_PIN_GROUP(tpu_to0_b),
|
||||
SH_PFC_PIN_GROUP(tpu_to0_c),
|
||||
SH_PFC_PIN_GROUP(tpu_to1),
|
||||
SH_PFC_PIN_GROUP(tpu_to1_b),
|
||||
SH_PFC_PIN_GROUP(tpu_to1_c),
|
||||
SH_PFC_PIN_GROUP(tpu_to2),
|
||||
SH_PFC_PIN_GROUP(tpu_to2_b),
|
||||
SH_PFC_PIN_GROUP(tpu_to2_c),
|
||||
SH_PFC_PIN_GROUP(tpu_to3),
|
||||
SH_PFC_PIN_GROUP(tpu_to3_b),
|
||||
SH_PFC_PIN_GROUP(tpu_to3_c),
|
||||
SH_PFC_PIN_GROUP(usb0),
|
||||
SH_PFC_PIN_GROUP(usb1),
|
||||
VIN_DATA_PIN_GROUP(vin0_data, 24),
|
||||
@ -3731,6 +4091,47 @@ static const char * const avb_groups[] = {
|
||||
"avb_gmii",
|
||||
};
|
||||
|
||||
static const char * const can0_groups[] = {
|
||||
"can0_data",
|
||||
"can0_data_b",
|
||||
"can0_data_c",
|
||||
"can0_data_d",
|
||||
/*
|
||||
* Retained for backwards compatibility, use can_clk_groups in new
|
||||
* designs.
|
||||
*/
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
"can_clk_d",
|
||||
};
|
||||
|
||||
static const char * const can1_groups[] = {
|
||||
"can1_data",
|
||||
"can1_data_b",
|
||||
"can1_data_c",
|
||||
"can1_data_d",
|
||||
/*
|
||||
* Retained for backwards compatibility, use can_clk_groups in new
|
||||
* designs.
|
||||
*/
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
"can_clk_d",
|
||||
};
|
||||
|
||||
/*
|
||||
* can_clk_groups allows for independent configuration, use can_clk function
|
||||
* in new designs.
|
||||
*/
|
||||
static const char * const can_clk_groups[] = {
|
||||
"can_clk",
|
||||
"can_clk_b",
|
||||
"can_clk_c",
|
||||
"can_clk_d",
|
||||
};
|
||||
|
||||
static const char * const du0_groups[] = {
|
||||
"du0_rgb666",
|
||||
"du0_rgb888",
|
||||
@ -3828,6 +4229,13 @@ static const char * const i2c4_groups[] = {
|
||||
"i2c4_e",
|
||||
};
|
||||
|
||||
static const char * const i2c5_groups[] = {
|
||||
"i2c5",
|
||||
"i2c5_b",
|
||||
"i2c5_c",
|
||||
"i2c5_d",
|
||||
};
|
||||
|
||||
static const char * const intc_groups[] = {
|
||||
"intc_irq0",
|
||||
"intc_irq1",
|
||||
@ -3887,6 +4295,44 @@ static const char * const msiof2_groups[] = {
|
||||
"msiof2_tx_b",
|
||||
};
|
||||
|
||||
static const char * const pwm0_groups[] = {
|
||||
"pwm0",
|
||||
"pwm0_b",
|
||||
};
|
||||
|
||||
static const char * const pwm1_groups[] = {
|
||||
"pwm1",
|
||||
"pwm1_b",
|
||||
"pwm1_c",
|
||||
};
|
||||
|
||||
static const char * const pwm2_groups[] = {
|
||||
"pwm2",
|
||||
"pwm2_b",
|
||||
"pwm2_c",
|
||||
};
|
||||
|
||||
static const char * const pwm3_groups[] = {
|
||||
"pwm3",
|
||||
"pwm3_b",
|
||||
};
|
||||
|
||||
static const char * const pwm4_groups[] = {
|
||||
"pwm4",
|
||||
"pwm4_b",
|
||||
};
|
||||
|
||||
static const char * const pwm5_groups[] = {
|
||||
"pwm5",
|
||||
"pwm5_b",
|
||||
"pwm5_c",
|
||||
};
|
||||
|
||||
static const char * const pwm6_groups[] = {
|
||||
"pwm6",
|
||||
"pwm6_b",
|
||||
};
|
||||
|
||||
static const char * const qspi_groups[] = {
|
||||
"qspi_ctrl",
|
||||
"qspi_data2",
|
||||
@ -4067,6 +4513,21 @@ static const char * const ssi_groups[] = {
|
||||
"ssi9_ctrl_b",
|
||||
};
|
||||
|
||||
static const char * const tpu_groups[] = {
|
||||
"tpu_to0",
|
||||
"tpu_to0_b",
|
||||
"tpu_to0_c",
|
||||
"tpu_to1",
|
||||
"tpu_to1_b",
|
||||
"tpu_to1_c",
|
||||
"tpu_to2",
|
||||
"tpu_to2_b",
|
||||
"tpu_to2_c",
|
||||
"tpu_to3",
|
||||
"tpu_to3_b",
|
||||
"tpu_to3_c",
|
||||
};
|
||||
|
||||
static const char * const usb0_groups[] = {
|
||||
"usb0",
|
||||
};
|
||||
@ -4102,6 +4563,9 @@ static const char * const vin1_groups[] = {
|
||||
static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(audio_clk),
|
||||
SH_PFC_FUNCTION(avb),
|
||||
SH_PFC_FUNCTION(can0),
|
||||
SH_PFC_FUNCTION(can1),
|
||||
SH_PFC_FUNCTION(can_clk),
|
||||
SH_PFC_FUNCTION(du0),
|
||||
SH_PFC_FUNCTION(du1),
|
||||
SH_PFC_FUNCTION(eth),
|
||||
@ -4113,11 +4577,19 @@ static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(i2c2),
|
||||
SH_PFC_FUNCTION(i2c3),
|
||||
SH_PFC_FUNCTION(i2c4),
|
||||
SH_PFC_FUNCTION(i2c5),
|
||||
SH_PFC_FUNCTION(intc),
|
||||
SH_PFC_FUNCTION(mmc),
|
||||
SH_PFC_FUNCTION(msiof0),
|
||||
SH_PFC_FUNCTION(msiof1),
|
||||
SH_PFC_FUNCTION(msiof2),
|
||||
SH_PFC_FUNCTION(pwm0),
|
||||
SH_PFC_FUNCTION(pwm1),
|
||||
SH_PFC_FUNCTION(pwm2),
|
||||
SH_PFC_FUNCTION(pwm3),
|
||||
SH_PFC_FUNCTION(pwm4),
|
||||
SH_PFC_FUNCTION(pwm5),
|
||||
SH_PFC_FUNCTION(pwm6),
|
||||
SH_PFC_FUNCTION(qspi),
|
||||
SH_PFC_FUNCTION(scif0),
|
||||
SH_PFC_FUNCTION(scif1),
|
||||
@ -4139,6 +4611,7 @@ static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(sdhi1),
|
||||
SH_PFC_FUNCTION(sdhi2),
|
||||
SH_PFC_FUNCTION(ssi),
|
||||
SH_PFC_FUNCTION(tpu),
|
||||
SH_PFC_FUNCTION(usb0),
|
||||
SH_PFC_FUNCTION(usb1),
|
||||
SH_PFC_FUNCTION(vin0),
|
||||
|
@ -1397,7 +1397,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, AUDIO_CLKOUT_B, SEL_ADG_1),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, SSI_SCK2_B, SEL_SSI_1),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, TS_SDEN1_D, SEL_TSIF1_3),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, STP_ISEN_1_D, SEL_SSP1_1_2),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, STP_ISEN_1_D, SEL_SSP1_1_3),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, STP_OPWM_0_E, SEL_SSP1_0_4),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, RIF3_D0_B, SEL_DRIF3_1),
|
||||
PINMUX_IPSR_MSEL(IP16_27_24, TCLK2_B, SEL_TIMER_TMU_1),
|
||||
|
@ -20,7 +20,7 @@
|
||||
|
||||
#define CPU_ALL_PORT(fn, sfx) \
|
||||
PORT_GP_CFG_16(0, fn, sfx, CFG_FLAGS), \
|
||||
PORT_GP_CFG_28(1, fn, sfx, CFG_FLAGS), \
|
||||
PORT_GP_CFG_29(1, fn, sfx, CFG_FLAGS), \
|
||||
PORT_GP_CFG_15(2, fn, sfx, CFG_FLAGS), \
|
||||
PORT_GP_CFG_12(3, fn, sfx, CFG_FLAGS | SH_PFC_PIN_CFG_IO_VOLTAGE), \
|
||||
PORT_GP_CFG_1(3, 12, fn, sfx, CFG_FLAGS), \
|
||||
@ -55,6 +55,7 @@
|
||||
#define GPSR0_0 F_(D0, IP5_15_12)
|
||||
|
||||
/* GPSR1 */
|
||||
#define GPSR1_28 FM(CLKOUT)
|
||||
#define GPSR1_27 F_(EX_WAIT0_A, IP5_11_8)
|
||||
#define GPSR1_26 F_(WE1_N, IP5_7_4)
|
||||
#define GPSR1_25 F_(WE0_N, IP5_3_0)
|
||||
@ -157,11 +158,11 @@
|
||||
#define GPSR5_11 F_(RX2_A, IP13_7_4)
|
||||
#define GPSR5_10 F_(TX2_A, IP13_3_0)
|
||||
#define GPSR5_9 F_(SCK2, IP12_31_28)
|
||||
#define GPSR5_8 F_(RTS1_N_TANS, IP12_27_24)
|
||||
#define GPSR5_8 F_(RTS1_N, IP12_27_24)
|
||||
#define GPSR5_7 F_(CTS1_N, IP12_23_20)
|
||||
#define GPSR5_6 F_(TX1_A, IP12_19_16)
|
||||
#define GPSR5_5 F_(RX1_A, IP12_15_12)
|
||||
#define GPSR5_4 F_(RTS0_N_TANS, IP12_11_8)
|
||||
#define GPSR5_4 F_(RTS0_N, IP12_11_8)
|
||||
#define GPSR5_3 F_(CTS0_N, IP12_7_4)
|
||||
#define GPSR5_2 F_(TX0, IP12_3_0)
|
||||
#define GPSR5_1 F_(RX0, IP11_31_28)
|
||||
@ -214,16 +215,16 @@
|
||||
#define IP0_11_8 FM(AVB_PHY_INT) F_(0, 0) FM(MSIOF2_SYNC_C) FM(RX4_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_15_12 FM(AVB_LINK) F_(0, 0) FM(MSIOF2_SCK_C) FM(TX4_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_19_16 FM(AVB_AVTP_MATCH_A) F_(0, 0) FM(MSIOF2_RXD_C) FM(CTS4_N_A) F_(0, 0) FM(FSCLKST2_N_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_23_20 FM(AVB_AVTP_CAPTURE_A) F_(0, 0) FM(MSIOF2_TXD_C) FM(RTS4_N_TANS_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_23_20 FM(AVB_AVTP_CAPTURE_A) F_(0, 0) FM(MSIOF2_TXD_C) FM(RTS4_N_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_27_24 FM(IRQ0) FM(QPOLB) F_(0, 0) FM(DU_CDE) FM(VI4_DATA0_B) FM(CAN0_TX_B) FM(CANFD0_TX_B) FM(MSIOF3_SS2_E) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_31_28 FM(IRQ1) FM(QPOLA) F_(0, 0) FM(DU_DISP) FM(VI4_DATA1_B) FM(CAN0_RX_B) FM(CANFD0_RX_B) FM(MSIOF3_SS1_E) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_3_0 FM(IRQ2) FM(QCPV_QDE) F_(0, 0) FM(DU_EXODDF_DU_ODDF_DISP_CDE) FM(VI4_DATA2_B) F_(0, 0) F_(0, 0) FM(MSIOF3_SYNC_E) F_(0, 0) FM(PWM3_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_7_4 FM(IRQ3) FM(QSTVB_QVE) FM(A25) FM(DU_DOTCLKOUT1) FM(VI4_DATA3_B) F_(0, 0) F_(0, 0) FM(MSIOF3_SCK_E) F_(0, 0) FM(PWM4_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_11_8 FM(IRQ4) FM(QSTH_QHS) FM(A24) FM(DU_EXHSYNC_DU_HSYNC) FM(VI4_DATA4_B) F_(0, 0) F_(0, 0) FM(MSIOF3_RXD_E) F_(0, 0) FM(PWM5_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_15_12 FM(IRQ5) FM(QSTB_QHE) FM(A23) FM(DU_EXVSYNC_DU_VSYNC) FM(VI4_DATA5_B) FM(FSCLKST2_N_B) F_(0, 0) FM(MSIOF3_TXD_E) F_(0, 0) FM(PWM6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_19_16 FM(PWM0) FM(AVB_AVTP_PPS)FM(A22) F_(0, 0) FM(VI4_DATA6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IECLK_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_23_20 FM(PWM1_A) F_(0, 0) FM(A21) FM(HRX3_D) FM(VI4_DATA7_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IERX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_27_24 FM(PWM2_A) F_(0, 0) FM(A20) FM(HTX3_D) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IETX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_7_4 FM(IRQ3) FM(QSTVB_QVE) F_(0, 0) FM(DU_DOTCLKOUT1) FM(VI4_DATA3_B) F_(0, 0) F_(0, 0) FM(MSIOF3_SCK_E) F_(0, 0) FM(PWM4_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_11_8 FM(IRQ4) FM(QSTH_QHS) F_(0, 0) FM(DU_EXHSYNC_DU_HSYNC) FM(VI4_DATA4_B) F_(0, 0) F_(0, 0) FM(MSIOF3_RXD_E) F_(0, 0) FM(PWM5_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_15_12 FM(IRQ5) FM(QSTB_QHE) F_(0, 0) FM(DU_EXVSYNC_DU_VSYNC) FM(VI4_DATA5_B) FM(FSCLKST2_N_B) F_(0, 0) FM(MSIOF3_TXD_E) F_(0, 0) FM(PWM6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_19_16 FM(PWM0) FM(AVB_AVTP_PPS)F_(0, 0) F_(0, 0) FM(VI4_DATA6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IECLK_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_23_20 FM(PWM1_A) F_(0, 0) F_(0, 0) FM(HRX3_D) FM(VI4_DATA7_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IERX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_27_24 FM(PWM2_A) F_(0, 0) F_(0, 0) FM(HTX3_D) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IETX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_31_28 FM(A0) FM(LCDOUT16) FM(MSIOF3_SYNC_B) F_(0, 0) FM(VI4_DATA8) F_(0, 0) FM(DU_DB0) F_(0, 0) F_(0, 0) FM(PWM3_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP2_3_0 FM(A1) FM(LCDOUT17) FM(MSIOF3_TXD_B) F_(0, 0) FM(VI4_DATA9) F_(0, 0) FM(DU_DB1) F_(0, 0) F_(0, 0) FM(PWM4_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP2_7_4 FM(A2) FM(LCDOUT18) FM(MSIOF3_SCK_B) F_(0, 0) FM(VI4_DATA10) F_(0, 0) FM(DU_DB2) F_(0, 0) F_(0, 0) FM(PWM5_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -236,7 +237,7 @@
|
||||
#define IP2_27_24 FM(A7) FM(LCDOUT23) FM(MSIOF2_SS2_A) FM(TX4_B) FM(VI4_DATA15) FM(VI5_DATA15) FM(DU_DB7) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP2_31_28 FM(A8) FM(RX3_B) FM(MSIOF2_SYNC_A) FM(HRX4_B) F_(0, 0) F_(0, 0) F_(0, 0) FM(SDA6_A) FM(AVB_AVTP_MATCH_B) FM(PWM1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_3_0 FM(A9) F_(0, 0) FM(MSIOF2_SCK_A) FM(CTS4_N_B) F_(0, 0) FM(VI5_VSYNC_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_7_4 FM(A10) F_(0, 0) FM(MSIOF2_RXD_A) FM(RTS4_N_TANS_B) F_(0, 0) FM(VI5_HSYNC_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_7_4 FM(A10) F_(0, 0) FM(MSIOF2_RXD_A) FM(RTS4_N_B) F_(0, 0) FM(VI5_HSYNC_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_11_8 FM(A11) FM(TX3_B) FM(MSIOF2_TXD_A) FM(HTX4_B) FM(HSCK4) FM(VI5_FIELD) F_(0, 0) FM(SCL6_A) FM(AVB_AVTP_CAPTURE_B) FM(PWM2_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_15_12 FM(A12) FM(LCDOUT12) FM(MSIOF3_SCK_C) F_(0, 0) FM(HRX4_A) FM(VI5_DATA8) FM(DU_DG4) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_19_16 FM(A13) FM(LCDOUT13) FM(MSIOF3_SYNC_C) F_(0, 0) FM(HTX4_A) FM(VI5_DATA9) FM(DU_DG5) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -252,7 +253,7 @@
|
||||
#define IP4_27_24 FM(RD_N) F_(0, 0) FM(MSIOF3_SYNC_D) FM(RX3_A) FM(HRX3_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(CAN0_TX_A) FM(CANFD0_TX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP4_31_28 FM(RD_WR_N) F_(0, 0) FM(MSIOF3_RXD_D) FM(TX3_A) FM(HTX3_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(CAN0_RX_A) FM(CANFD0_RX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_3_0 FM(WE0_N) F_(0, 0) FM(MSIOF3_TXD_D) FM(CTS3_N) FM(HCTS3_N) F_(0, 0) F_(0, 0) FM(SCL6_B) FM(CAN_CLK) F_(0, 0) FM(IECLK_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_7_4 FM(WE1_N) F_(0, 0) FM(MSIOF3_SS1_D) FM(RTS3_N_TANS) FM(HRTS3_N) F_(0, 0) F_(0, 0) FM(SDA6_B) FM(CAN1_RX) FM(CANFD1_RX) FM(IERX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_7_4 FM(WE1_N) F_(0, 0) FM(MSIOF3_SS1_D) FM(RTS3_N) FM(HRTS3_N) F_(0, 0) F_(0, 0) FM(SDA6_B) FM(CAN1_RX) FM(CANFD1_RX) FM(IERX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_11_8 FM(EX_WAIT0_A) FM(QCLK) F_(0, 0) F_(0, 0) FM(VI4_CLK) F_(0, 0) FM(DU_DOTCLKOUT0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_15_12 FM(D0) FM(MSIOF2_SS1_B)FM(MSIOF3_SCK_A) F_(0, 0) FM(VI4_DATA16) FM(VI5_DATA0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_19_16 FM(D1) FM(MSIOF2_SS2_B)FM(MSIOF3_SYNC_A) F_(0, 0) FM(VI4_DATA17) FM(VI5_DATA1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -265,7 +266,7 @@
|
||||
#define IP6_15_12 FM(D8) FM(LCDOUT0) FM(MSIOF2_SCK_D) FM(SCK4_C) FM(VI4_DATA0_A) F_(0, 0) FM(DU_DR0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_19_16 FM(D9) FM(LCDOUT1) FM(MSIOF2_SYNC_D) F_(0, 0) FM(VI4_DATA1_A) F_(0, 0) FM(DU_DR1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_23_20 FM(D10) FM(LCDOUT2) FM(MSIOF2_RXD_D) FM(HRX3_B) FM(VI4_DATA2_A) FM(CTS4_N_C) FM(DU_DR2) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_27_24 FM(D11) FM(LCDOUT3) FM(MSIOF2_TXD_D) FM(HTX3_B) FM(VI4_DATA3_A) FM(RTS4_N_TANS_C)FM(DU_DR3) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_27_24 FM(D11) FM(LCDOUT3) FM(MSIOF2_TXD_D) FM(HTX3_B) FM(VI4_DATA3_A) FM(RTS4_N_C) FM(DU_DR3) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_31_28 FM(D12) FM(LCDOUT4) FM(MSIOF2_SS1_D) FM(RX4_C) FM(VI4_DATA4_A) F_(0, 0) FM(DU_DR4) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP7_3_0 FM(D13) FM(LCDOUT5) FM(MSIOF2_SS2_D) FM(TX4_C) FM(VI4_DATA5_A) F_(0, 0) FM(DU_DR5) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP7_7_4 FM(D14) FM(LCDOUT6) FM(MSIOF3_SS1_A) FM(HRX3_C) FM(VI4_DATA6_A) F_(0, 0) FM(DU_DR6) FM(SCL6_C) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -312,11 +313,11 @@
|
||||
#define IP11_31_28 FM(RX0) FM(HRX1_B) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SCK0_C) FM(STP_ISCLK_0_C) FM(RIF0_D0_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_3_0 FM(TX0) FM(HTX1_B) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SPSYNC0_C)FM(STP_ISSYNC_0_C) FM(RIF0_D1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_7_4 FM(CTS0_N) FM(HCTS1_N_B) FM(MSIOF1_SYNC_B) F_(0, 0) F_(0, 0) FM(TS_SPSYNC1_C)FM(STP_ISSYNC_1_C) FM(RIF1_SYNC_B) FM(AUDIO_CLKOUT_C) FM(ADICS_SAMP) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_11_8 FM(RTS0_N_TANS) FM(HRTS1_N_B) FM(MSIOF1_SS1_B) FM(AUDIO_CLKA_B) FM(SCL2_A) F_(0, 0) FM(STP_IVCXO27_1_C) FM(RIF0_SYNC_B) F_(0, 0) FM(ADICHS1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_11_8 FM(RTS0_N) FM(HRTS1_N_B) FM(MSIOF1_SS1_B) FM(AUDIO_CLKA_B) FM(SCL2_A) F_(0, 0) FM(STP_IVCXO27_1_C) FM(RIF0_SYNC_B) F_(0, 0) FM(ADICHS1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_15_12 FM(RX1_A) FM(HRX1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SDAT0_C) FM(STP_ISD_0_C) FM(RIF1_CLK_C) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_19_16 FM(TX1_A) FM(HTX1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SDEN0_C) FM(STP_ISEN_0_C) FM(RIF1_D0_C) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_23_20 FM(CTS1_N) FM(HCTS1_N_A) FM(MSIOF1_RXD_B) F_(0, 0) F_(0, 0) FM(TS_SDEN1_C) FM(STP_ISEN_1_C) FM(RIF1_D0_B) F_(0, 0) FM(ADIDATA) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_27_24 FM(RTS1_N_TANS) FM(HRTS1_N_A) FM(MSIOF1_TXD_B) F_(0, 0) F_(0, 0) FM(TS_SDAT1_C) FM(STP_ISD_1_C) FM(RIF1_D1_B) F_(0, 0) FM(ADICHS0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_27_24 FM(RTS1_N) FM(HRTS1_N_A) FM(MSIOF1_TXD_B) F_(0, 0) F_(0, 0) FM(TS_SDAT1_C) FM(STP_ISD_1_C) FM(RIF1_D1_B) F_(0, 0) FM(ADICHS0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_31_28 FM(SCK2) FM(SCIF_CLK_B) FM(MSIOF1_SCK_B) F_(0, 0) F_(0, 0) FM(TS_SCK1_C) FM(STP_ISCLK_1_C) FM(RIF1_CLK_B) F_(0, 0) FM(ADICLK) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP13_3_0 FM(TX2_A) F_(0, 0) F_(0, 0) FM(SD2_CD_B) FM(SCL1_A) F_(0, 0) FM(FMCLK_A) FM(RIF1_D1_C) F_(0, 0) FM(FSO_CFE_0_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP13_7_4 FM(RX2_A) F_(0, 0) F_(0, 0) FM(SD2_WP_B) FM(SDA1_A) F_(0, 0) FM(FMIN_A) FM(RIF1_SYNC_C) F_(0, 0) FM(FSO_CFE_1_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -368,7 +369,7 @@
|
||||
GPSR6_31 \
|
||||
GPSR6_30 \
|
||||
GPSR6_29 \
|
||||
GPSR6_28 \
|
||||
GPSR1_28 GPSR6_28 \
|
||||
GPSR1_27 GPSR6_27 \
|
||||
GPSR1_26 GPSR6_26 \
|
||||
GPSR1_25 GPSR5_25 GPSR6_25 \
|
||||
@ -548,7 +549,7 @@ MOD_SEL0_4_3 MOD_SEL1_4 \
|
||||
FM(AVB_TX_CTL) FM(AVB_TXC) FM(AVB_TD0) FM(AVB_TD1) FM(AVB_TD2) FM(AVB_TD3) \
|
||||
FM(AVB_RX_CTL) FM(AVB_RXC) FM(AVB_RD0) FM(AVB_RD1) FM(AVB_RD2) FM(AVB_RD3) \
|
||||
FM(AVB_TXCREFCLK) FM(AVB_MDIO) \
|
||||
FM(CLKOUT) FM(PRESETOUT) \
|
||||
FM(PRESETOUT) \
|
||||
FM(DU_DOTCLKIN0) FM(DU_DOTCLKIN1) FM(DU_DOTCLKIN2) FM(DU_DOTCLKIN3) \
|
||||
FM(TMS) FM(TDO) FM(ASEBRK) FM(MLB_REF) FM(TDI) FM(TCK) FM(TRST) FM(EXTALR)
|
||||
|
||||
@ -587,6 +588,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_SINGLE(AVS1),
|
||||
PINMUX_SINGLE(AVS2),
|
||||
PINMUX_SINGLE(CLKOUT),
|
||||
PINMUX_SINGLE(HDMI0_CEC),
|
||||
PINMUX_SINGLE(HDMI1_CEC),
|
||||
PINMUX_SINGLE(I2C_SEL_0_1),
|
||||
@ -622,7 +624,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, AVB_AVTP_CAPTURE_A, SEL_ETHERAVB_0),
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, MSIOF2_TXD_C, SEL_MSIOF2_2),
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, RTS4_N_TANS_A, SEL_SCIF4_0),
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, RTS4_N_A, SEL_SCIF4_0),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP0_27_24, IRQ0),
|
||||
PINMUX_IPSR_GPSR(IP0_27_24, QPOLB),
|
||||
@ -650,7 +652,6 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, IRQ3),
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, QSTVB_QVE),
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, A25),
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, DU_DOTCLKOUT1),
|
||||
PINMUX_IPSR_MSEL(IP1_7_4, VI4_DATA3_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_7_4, PWM4_B, SEL_PWM4_1),
|
||||
@ -658,7 +659,6 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, IRQ4),
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, QSTH_QHS),
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, A24),
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, DU_EXHSYNC_DU_HSYNC),
|
||||
PINMUX_IPSR_MSEL(IP1_11_8, VI4_DATA4_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_11_8, PWM5_B, SEL_PWM5_1),
|
||||
@ -666,7 +666,6 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, IRQ5),
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, QSTB_QHE),
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, A23),
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, DU_EXVSYNC_DU_VSYNC),
|
||||
PINMUX_IPSR_MSEL(IP1_15_12, VI4_DATA5_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_15_12, PWM6_B, SEL_PWM6_1),
|
||||
@ -675,18 +674,15 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_19_16, PWM0),
|
||||
PINMUX_IPSR_GPSR(IP1_19_16, AVB_AVTP_PPS),
|
||||
PINMUX_IPSR_GPSR(IP1_19_16, A22),
|
||||
PINMUX_IPSR_MSEL(IP1_19_16, VI4_DATA6_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_19_16, IECLK_B, SEL_IEBUS_1),
|
||||
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, PWM1_A, SEL_PWM1_0),
|
||||
PINMUX_IPSR_GPSR(IP1_23_20, A21),
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, HRX3_D, SEL_HSCIF3_3),
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, VI4_DATA7_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, IERX_B, SEL_IEBUS_1),
|
||||
|
||||
PINMUX_IPSR_MSEL(IP1_27_24, PWM2_A, SEL_PWM2_0),
|
||||
PINMUX_IPSR_GPSR(IP1_27_24, A20),
|
||||
PINMUX_IPSR_MSEL(IP1_27_24, HTX3_D, SEL_HSCIF3_3),
|
||||
PINMUX_IPSR_MSEL(IP1_27_24, IETX_B, SEL_IEBUS_1),
|
||||
|
||||
@ -766,7 +762,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP3_7_4, A10),
|
||||
PINMUX_IPSR_MSEL(IP3_7_4, MSIOF2_RXD_A, SEL_MSIOF2_0),
|
||||
PINMUX_IPSR_MSEL(IP3_7_4, RTS4_N_TANS_B, SEL_SCIF4_1),
|
||||
PINMUX_IPSR_MSEL(IP3_7_4, RTS4_N_B, SEL_SCIF4_1),
|
||||
PINMUX_IPSR_GPSR(IP3_7_4, VI5_HSYNC_N),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP3_11_8, A11),
|
||||
@ -869,7 +865,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, WE1_N),
|
||||
PINMUX_IPSR_MSEL(IP5_7_4, MSIOF3_SS1_D, SEL_MSIOF3_3),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, RTS3_N_TANS),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, RTS3_N),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, HRTS3_N),
|
||||
PINMUX_IPSR_MSEL(IP5_7_4, SDA6_B, SEL_I2C6_1),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, CAN1_RX),
|
||||
@ -950,7 +946,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, MSIOF2_TXD_D, SEL_MSIOF2_3),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, HTX3_B, SEL_HSCIF3_1),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, VI4_DATA3_A, SEL_VIN4_0),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, RTS4_N_TANS_C, SEL_SCIF4_2),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, RTS4_N_C, SEL_SCIF4_2),
|
||||
PINMUX_IPSR_GPSR(IP6_27_24, DU_DR3),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP6_31_28, D12),
|
||||
@ -1159,7 +1155,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_GPSR(IP12_7_4, AUDIO_CLKOUT_C),
|
||||
PINMUX_IPSR_GPSR(IP12_7_4, ADICS_SAMP),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP12_11_8, RTS0_N_TANS),
|
||||
PINMUX_IPSR_GPSR(IP12_11_8, RTS0_N),
|
||||
PINMUX_IPSR_MSEL(IP12_11_8, HRTS1_N_B, SEL_HSCIF1_1),
|
||||
PINMUX_IPSR_MSEL(IP12_11_8, MSIOF1_SS1_B, SEL_MSIOF1_1),
|
||||
PINMUX_IPSR_MSEL(IP12_11_8, AUDIO_CLKA_B, SEL_ADG_A_1),
|
||||
@ -1188,7 +1184,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_MSEL(IP12_23_20, RIF1_D0_B, SEL_DRIF1_1),
|
||||
PINMUX_IPSR_GPSR(IP12_23_20, ADIDATA),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP12_27_24, RTS1_N_TANS),
|
||||
PINMUX_IPSR_GPSR(IP12_27_24, RTS1_N),
|
||||
PINMUX_IPSR_MSEL(IP12_27_24, HRTS1_N_A, SEL_HSCIF1_0),
|
||||
PINMUX_IPSR_MSEL(IP12_27_24, MSIOF1_TXD_B, SEL_MSIOF1_1),
|
||||
PINMUX_IPSR_MSEL(IP12_27_24, TS_SDAT1_C, SEL_TSIF1_2),
|
||||
@ -1781,6 +1777,61 @@ static const unsigned int avb_avtp_capture_b_mux[] = {
|
||||
AVB_AVTP_CAPTURE_B_MARK,
|
||||
};
|
||||
|
||||
/* - CAN ------------------------------------------------------------------ */
|
||||
static const unsigned int can0_data_a_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 24),
|
||||
};
|
||||
static const unsigned int can0_data_a_mux[] = {
|
||||
CAN0_TX_A_MARK, CAN0_RX_A_MARK,
|
||||
};
|
||||
static const unsigned int can0_data_b_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1),
|
||||
};
|
||||
static const unsigned int can0_data_b_mux[] = {
|
||||
CAN0_TX_B_MARK, CAN0_RX_B_MARK,
|
||||
};
|
||||
static const unsigned int can1_data_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 26),
|
||||
};
|
||||
static const unsigned int can1_data_mux[] = {
|
||||
CAN1_TX_MARK, CAN1_RX_MARK,
|
||||
};
|
||||
|
||||
/* - CAN Clock -------------------------------------------------------------- */
|
||||
static const unsigned int can_clk_pins[] = {
|
||||
/* CLK */
|
||||
RCAR_GP_PIN(1, 25),
|
||||
};
|
||||
static const unsigned int can_clk_mux[] = {
|
||||
CAN_CLK_MARK,
|
||||
};
|
||||
|
||||
/* - CAN FD --------------------------------------------------------------- */
|
||||
static const unsigned int canfd0_data_a_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(1, 23), RCAR_GP_PIN(1, 24),
|
||||
};
|
||||
static const unsigned int canfd0_data_a_mux[] = {
|
||||
CANFD0_TX_A_MARK, CANFD0_RX_A_MARK,
|
||||
};
|
||||
static const unsigned int canfd0_data_b_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1),
|
||||
};
|
||||
static const unsigned int canfd0_data_b_mux[] = {
|
||||
CANFD0_TX_B_MARK, CANFD0_RX_B_MARK,
|
||||
};
|
||||
static const unsigned int canfd1_data_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 26),
|
||||
};
|
||||
static const unsigned int canfd1_data_mux[] = {
|
||||
CANFD1_TX_MARK, CANFD1_RX_MARK,
|
||||
};
|
||||
|
||||
/* - DRIF0 --------------------------------------------------------------- */
|
||||
static const unsigned int drif0_ctrl_a_pins[] = {
|
||||
/* CLK, SYNC */
|
||||
@ -3176,6 +3227,22 @@ static const unsigned int pwm6_b_mux[] = {
|
||||
PWM6_B_MARK,
|
||||
};
|
||||
|
||||
/* - SATA --------------------------------------------------------------------*/
|
||||
static const unsigned int sata0_devslp_a_pins[] = {
|
||||
/* DEVSLP */
|
||||
RCAR_GP_PIN(6, 16),
|
||||
};
|
||||
static const unsigned int sata0_devslp_a_mux[] = {
|
||||
SATA_DEVSLP_A_MARK,
|
||||
};
|
||||
static const unsigned int sata0_devslp_b_pins[] = {
|
||||
/* DEVSLP */
|
||||
RCAR_GP_PIN(4, 6),
|
||||
};
|
||||
static const unsigned int sata0_devslp_b_mux[] = {
|
||||
SATA_DEVSLP_B_MARK,
|
||||
};
|
||||
|
||||
/* - SCIF0 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif0_data_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3196,7 +3263,7 @@ static const unsigned int scif0_ctrl_pins[] = {
|
||||
RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 3),
|
||||
};
|
||||
static const unsigned int scif0_ctrl_mux[] = {
|
||||
RTS0_N_TANS_MARK, CTS0_N_MARK,
|
||||
RTS0_N_MARK, CTS0_N_MARK,
|
||||
};
|
||||
/* - SCIF1 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif1_data_a_pins[] = {
|
||||
@ -3218,7 +3285,7 @@ static const unsigned int scif1_ctrl_pins[] = {
|
||||
RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 7),
|
||||
};
|
||||
static const unsigned int scif1_ctrl_mux[] = {
|
||||
RTS1_N_TANS_MARK, CTS1_N_MARK,
|
||||
RTS1_N_MARK, CTS1_N_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int scif1_data_b_pins[] = {
|
||||
@ -3270,7 +3337,7 @@ static const unsigned int scif3_ctrl_pins[] = {
|
||||
RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
|
||||
};
|
||||
static const unsigned int scif3_ctrl_mux[] = {
|
||||
RTS3_N_TANS_MARK, CTS3_N_MARK,
|
||||
RTS3_N_MARK, CTS3_N_MARK,
|
||||
};
|
||||
static const unsigned int scif3_data_b_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3299,7 +3366,7 @@ static const unsigned int scif4_ctrl_a_pins[] = {
|
||||
RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
|
||||
};
|
||||
static const unsigned int scif4_ctrl_a_mux[] = {
|
||||
RTS4_N_TANS_A_MARK, CTS4_N_A_MARK,
|
||||
RTS4_N_A_MARK, CTS4_N_A_MARK,
|
||||
};
|
||||
static const unsigned int scif4_data_b_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3320,7 +3387,7 @@ static const unsigned int scif4_ctrl_b_pins[] = {
|
||||
RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 9),
|
||||
};
|
||||
static const unsigned int scif4_ctrl_b_mux[] = {
|
||||
RTS4_N_TANS_B_MARK, CTS4_N_B_MARK,
|
||||
RTS4_N_B_MARK, CTS4_N_B_MARK,
|
||||
};
|
||||
static const unsigned int scif4_data_c_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3341,7 +3408,7 @@ static const unsigned int scif4_ctrl_c_pins[] = {
|
||||
RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
|
||||
};
|
||||
static const unsigned int scif4_ctrl_c_mux[] = {
|
||||
RTS4_N_TANS_C_MARK, CTS4_N_C_MARK,
|
||||
RTS4_N_C_MARK, CTS4_N_C_MARK,
|
||||
};
|
||||
/* - SCIF5 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif5_data_a_pins[] = {
|
||||
@ -3843,6 +3910,13 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(avb_avtp_capture_a),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_match_b),
|
||||
SH_PFC_PIN_GROUP(avb_avtp_capture_b),
|
||||
SH_PFC_PIN_GROUP(can0_data_a),
|
||||
SH_PFC_PIN_GROUP(can0_data_b),
|
||||
SH_PFC_PIN_GROUP(can1_data),
|
||||
SH_PFC_PIN_GROUP(can_clk),
|
||||
SH_PFC_PIN_GROUP(canfd0_data_a),
|
||||
SH_PFC_PIN_GROUP(canfd0_data_b),
|
||||
SH_PFC_PIN_GROUP(canfd1_data),
|
||||
SH_PFC_PIN_GROUP(drif0_ctrl_a),
|
||||
SH_PFC_PIN_GROUP(drif0_data0_a),
|
||||
SH_PFC_PIN_GROUP(drif0_data1_a),
|
||||
@ -4034,6 +4108,8 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(pwm5_b),
|
||||
SH_PFC_PIN_GROUP(pwm6_a),
|
||||
SH_PFC_PIN_GROUP(pwm6_b),
|
||||
SH_PFC_PIN_GROUP(sata0_devslp_a),
|
||||
SH_PFC_PIN_GROUP(sata0_devslp_b),
|
||||
SH_PFC_PIN_GROUP(scif0_data),
|
||||
SH_PFC_PIN_GROUP(scif0_clk),
|
||||
SH_PFC_PIN_GROUP(scif0_ctrl),
|
||||
@ -4154,6 +4230,28 @@ static const char * const avb_groups[] = {
|
||||
"avb_avtp_capture_b",
|
||||
};
|
||||
|
||||
static const char * const can0_groups[] = {
|
||||
"can0_data_a",
|
||||
"can0_data_b",
|
||||
};
|
||||
|
||||
static const char * const can1_groups[] = {
|
||||
"can1_data",
|
||||
};
|
||||
|
||||
static const char * const can_clk_groups[] = {
|
||||
"can_clk",
|
||||
};
|
||||
|
||||
static const char * const canfd0_groups[] = {
|
||||
"canfd0_data_a",
|
||||
"canfd0_data_b",
|
||||
};
|
||||
|
||||
static const char * const canfd1_groups[] = {
|
||||
"canfd1_data",
|
||||
};
|
||||
|
||||
static const char * const drif0_groups[] = {
|
||||
"drif0_ctrl_a",
|
||||
"drif0_data0_a",
|
||||
@ -4420,6 +4518,11 @@ static const char * const pwm6_groups[] = {
|
||||
"pwm6_b",
|
||||
};
|
||||
|
||||
static const char * const sata0_groups[] = {
|
||||
"sata0_devslp_a",
|
||||
"sata0_devslp_b",
|
||||
};
|
||||
|
||||
static const char * const scif0_groups[] = {
|
||||
"scif0_data",
|
||||
"scif0_clk",
|
||||
@ -4559,6 +4662,11 @@ static const char * const usb30_groups[] = {
|
||||
static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(audio_clk),
|
||||
SH_PFC_FUNCTION(avb),
|
||||
SH_PFC_FUNCTION(can0),
|
||||
SH_PFC_FUNCTION(can1),
|
||||
SH_PFC_FUNCTION(can_clk),
|
||||
SH_PFC_FUNCTION(canfd0),
|
||||
SH_PFC_FUNCTION(canfd1),
|
||||
SH_PFC_FUNCTION(drif0),
|
||||
SH_PFC_FUNCTION(drif1),
|
||||
SH_PFC_FUNCTION(drif2),
|
||||
@ -4584,6 +4692,7 @@ static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(pwm4),
|
||||
SH_PFC_FUNCTION(pwm5),
|
||||
SH_PFC_FUNCTION(pwm6),
|
||||
SH_PFC_FUNCTION(sata0),
|
||||
SH_PFC_FUNCTION(scif0),
|
||||
SH_PFC_FUNCTION(scif1),
|
||||
SH_PFC_FUNCTION(scif2),
|
||||
@ -4644,7 +4753,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
|
||||
0, 0,
|
||||
0, 0,
|
||||
0, 0,
|
||||
0, 0,
|
||||
GP_1_28_FN, GPSR1_28,
|
||||
GP_1_27_FN, GPSR1_27,
|
||||
GP_1_26_FN, GPSR1_26,
|
||||
GP_1_25_FN, GPSR1_25,
|
||||
@ -5246,7 +5355,7 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
|
||||
{ RCAR_GP_PIN(1, 19), 0, 3 }, /* A19 */
|
||||
} },
|
||||
{ PINMUX_DRIVE_REG("DRVCTRL8", 0xe6060320) {
|
||||
{ PIN_NUMBER('F', 1), 28, 3 }, /* CLKOUT */
|
||||
{ RCAR_GP_PIN(1, 28), 28, 3 }, /* CLKOUT */
|
||||
{ RCAR_GP_PIN(1, 20), 24, 3 }, /* CS0 */
|
||||
{ RCAR_GP_PIN(1, 21), 20, 3 }, /* CS1_A26 */
|
||||
{ RCAR_GP_PIN(1, 22), 16, 3 }, /* BS */
|
||||
@ -5342,11 +5451,11 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
|
||||
{ RCAR_GP_PIN(5, 3), 0, 3 }, /* CTS0 */
|
||||
} },
|
||||
{ PINMUX_DRIVE_REG("DRVCTRL18", 0xe6060348) {
|
||||
{ RCAR_GP_PIN(5, 4), 28, 3 }, /* RTS0_TANS */
|
||||
{ RCAR_GP_PIN(5, 4), 28, 3 }, /* RTS0 */
|
||||
{ RCAR_GP_PIN(5, 5), 24, 3 }, /* RX1 */
|
||||
{ RCAR_GP_PIN(5, 6), 20, 3 }, /* TX1 */
|
||||
{ RCAR_GP_PIN(5, 7), 16, 3 }, /* CTS1 */
|
||||
{ RCAR_GP_PIN(5, 8), 12, 3 }, /* RTS1_TANS */
|
||||
{ RCAR_GP_PIN(5, 8), 12, 3 }, /* RTS1 */
|
||||
{ RCAR_GP_PIN(5, 9), 8, 3 }, /* SCK2 */
|
||||
{ RCAR_GP_PIN(5, 10), 4, 3 }, /* TX2 */
|
||||
{ RCAR_GP_PIN(5, 11), 0, 3 }, /* RX2 */
|
||||
@ -5507,7 +5616,7 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
|
||||
[31] = RCAR_GP_PIN(1, 19), /* A19 */
|
||||
} },
|
||||
{ PINMUX_BIAS_REG("PUEN2", 0xe6060408, "PUD2", 0xe6060448) {
|
||||
[ 0] = PIN_NUMBER('F', 1), /* CLKOUT */
|
||||
[ 0] = RCAR_GP_PIN(1, 28), /* CLKOUT */
|
||||
[ 1] = RCAR_GP_PIN(1, 20), /* CS0_N */
|
||||
[ 2] = RCAR_GP_PIN(1, 21), /* CS1_N */
|
||||
[ 3] = RCAR_GP_PIN(1, 22), /* BS_N */
|
||||
@ -5591,11 +5700,11 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
|
||||
[13] = RCAR_GP_PIN(5, 1), /* RX0 */
|
||||
[14] = RCAR_GP_PIN(5, 2), /* TX0 */
|
||||
[15] = RCAR_GP_PIN(5, 3), /* CTS0_N */
|
||||
[16] = RCAR_GP_PIN(5, 4), /* RTS0_N_TANS */
|
||||
[16] = RCAR_GP_PIN(5, 4), /* RTS0_N */
|
||||
[17] = RCAR_GP_PIN(5, 5), /* RX1_A */
|
||||
[18] = RCAR_GP_PIN(5, 6), /* TX1_A */
|
||||
[19] = RCAR_GP_PIN(5, 7), /* CTS1_N */
|
||||
[20] = RCAR_GP_PIN(5, 8), /* RTS1_N_TANS */
|
||||
[20] = RCAR_GP_PIN(5, 8), /* RTS1_N */
|
||||
[21] = RCAR_GP_PIN(5, 9), /* SCK2 */
|
||||
[22] = RCAR_GP_PIN(5, 10), /* TX2_A */
|
||||
[23] = RCAR_GP_PIN(5, 11), /* RX2_A */
|
||||
|
@ -163,11 +163,11 @@
|
||||
#define GPSR5_11 F_(RX2_A, IP13_7_4)
|
||||
#define GPSR5_10 F_(TX2_A, IP13_3_0)
|
||||
#define GPSR5_9 F_(SCK2, IP12_31_28)
|
||||
#define GPSR5_8 F_(RTS1_N_TANS, IP12_27_24)
|
||||
#define GPSR5_8 F_(RTS1_N, IP12_27_24)
|
||||
#define GPSR5_7 F_(CTS1_N, IP12_23_20)
|
||||
#define GPSR5_6 F_(TX1_A, IP12_19_16)
|
||||
#define GPSR5_5 F_(RX1_A, IP12_15_12)
|
||||
#define GPSR5_4 F_(RTS0_N_TANS, IP12_11_8)
|
||||
#define GPSR5_4 F_(RTS0_N, IP12_11_8)
|
||||
#define GPSR5_3 F_(CTS0_N, IP12_7_4)
|
||||
#define GPSR5_2 F_(TX0, IP12_3_0)
|
||||
#define GPSR5_1 F_(RX0, IP11_31_28)
|
||||
@ -220,16 +220,16 @@
|
||||
#define IP0_11_8 FM(AVB_PHY_INT) F_(0, 0) FM(MSIOF2_SYNC_C) FM(RX4_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_15_12 FM(AVB_LINK) F_(0, 0) FM(MSIOF2_SCK_C) FM(TX4_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_19_16 FM(AVB_AVTP_MATCH_A) F_(0, 0) FM(MSIOF2_RXD_C) FM(CTS4_N_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_23_20 FM(AVB_AVTP_CAPTURE_A) F_(0, 0) FM(MSIOF2_TXD_C) FM(RTS4_N_TANS_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_23_20 FM(AVB_AVTP_CAPTURE_A) F_(0, 0) FM(MSIOF2_TXD_C) FM(RTS4_N_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_27_24 FM(IRQ0) FM(QPOLB) F_(0, 0) FM(DU_CDE) FM(VI4_DATA0_B) FM(CAN0_TX_B) FM(CANFD0_TX_B) FM(MSIOF3_SS2_E) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP0_31_28 FM(IRQ1) FM(QPOLA) F_(0, 0) FM(DU_DISP) FM(VI4_DATA1_B) FM(CAN0_RX_B) FM(CANFD0_RX_B) FM(MSIOF3_SS1_E) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_3_0 FM(IRQ2) FM(QCPV_QDE) F_(0, 0) FM(DU_EXODDF_DU_ODDF_DISP_CDE) FM(VI4_DATA2_B) F_(0, 0) F_(0, 0) FM(MSIOF3_SYNC_E) F_(0, 0) FM(PWM3_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_7_4 FM(IRQ3) FM(QSTVB_QVE) FM(A25) FM(DU_DOTCLKOUT1) FM(VI4_DATA3_B) F_(0, 0) F_(0, 0) FM(MSIOF3_SCK_E) F_(0, 0) FM(PWM4_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_11_8 FM(IRQ4) FM(QSTH_QHS) FM(A24) FM(DU_EXHSYNC_DU_HSYNC) FM(VI4_DATA4_B) F_(0, 0) F_(0, 0) FM(MSIOF3_RXD_E) F_(0, 0) FM(PWM5_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_15_12 FM(IRQ5) FM(QSTB_QHE) FM(A23) FM(DU_EXVSYNC_DU_VSYNC) FM(VI4_DATA5_B) F_(0, 0) F_(0, 0) FM(MSIOF3_TXD_E) F_(0, 0) FM(PWM6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_19_16 FM(PWM0) FM(AVB_AVTP_PPS)FM(A22) F_(0, 0) FM(VI4_DATA6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IECLK_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_23_20 FM(PWM1_A) F_(0, 0) FM(A21) FM(HRX3_D) FM(VI4_DATA7_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IERX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_27_24 FM(PWM2_A) F_(0, 0) FM(A20) FM(HTX3_D) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IETX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_7_4 FM(IRQ3) FM(QSTVB_QVE) F_(0, 0) FM(DU_DOTCLKOUT1) FM(VI4_DATA3_B) F_(0, 0) F_(0, 0) FM(MSIOF3_SCK_E) F_(0, 0) FM(PWM4_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_11_8 FM(IRQ4) FM(QSTH_QHS) F_(0, 0) FM(DU_EXHSYNC_DU_HSYNC) FM(VI4_DATA4_B) F_(0, 0) F_(0, 0) FM(MSIOF3_RXD_E) F_(0, 0) FM(PWM5_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_15_12 FM(IRQ5) FM(QSTB_QHE) F_(0, 0) FM(DU_EXVSYNC_DU_VSYNC) FM(VI4_DATA5_B) F_(0, 0) F_(0, 0) FM(MSIOF3_TXD_E) F_(0, 0) FM(PWM6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_19_16 FM(PWM0) FM(AVB_AVTP_PPS)F_(0, 0) F_(0, 0) FM(VI4_DATA6_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IECLK_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_23_20 FM(PWM1_A) F_(0, 0) F_(0, 0) FM(HRX3_D) FM(VI4_DATA7_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IERX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_27_24 FM(PWM2_A) F_(0, 0) F_(0, 0) FM(HTX3_D) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) FM(IETX_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP1_31_28 FM(A0) FM(LCDOUT16) FM(MSIOF3_SYNC_B) F_(0, 0) FM(VI4_DATA8) F_(0, 0) FM(DU_DB0) F_(0, 0) F_(0, 0) FM(PWM3_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP2_3_0 FM(A1) FM(LCDOUT17) FM(MSIOF3_TXD_B) F_(0, 0) FM(VI4_DATA9) F_(0, 0) FM(DU_DB1) F_(0, 0) F_(0, 0) FM(PWM4_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP2_7_4 FM(A2) FM(LCDOUT18) FM(MSIOF3_SCK_B) F_(0, 0) FM(VI4_DATA10) F_(0, 0) FM(DU_DB2) F_(0, 0) F_(0, 0) FM(PWM5_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -240,7 +240,7 @@
|
||||
#define IP2_27_24 FM(A7) FM(LCDOUT23) FM(MSIOF2_SS2_A) FM(TX4_B) FM(VI4_DATA15) FM(VI5_DATA15) FM(DU_DB7) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP2_31_28 FM(A8) FM(RX3_B) FM(MSIOF2_SYNC_A) FM(HRX4_B) F_(0, 0) F_(0, 0) F_(0, 0) FM(SDA6_A) FM(AVB_AVTP_MATCH_B) FM(PWM1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_3_0 FM(A9) F_(0, 0) FM(MSIOF2_SCK_A) FM(CTS4_N_B) F_(0, 0) FM(VI5_VSYNC_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_7_4 FM(A10) F_(0, 0) FM(MSIOF2_RXD_A) FM(RTS4_N_TANS_B) F_(0, 0) FM(VI5_HSYNC_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_7_4 FM(A10) F_(0, 0) FM(MSIOF2_RXD_A) FM(RTS4_N_B) F_(0, 0) FM(VI5_HSYNC_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP3_11_8 FM(A11) FM(TX3_B) FM(MSIOF2_TXD_A) FM(HTX4_B) FM(HSCK4) FM(VI5_FIELD) F_(0, 0) FM(SCL6_A) FM(AVB_AVTP_CAPTURE_B) FM(PWM2_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
|
||||
/* IPSRx */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ /* 8 */ /* 9 */ /* A */ /* B */ /* C - F */
|
||||
@ -258,7 +258,7 @@
|
||||
#define IP4_27_24 FM(RD_N) F_(0, 0) FM(MSIOF3_SYNC_D) FM(RX3_A) FM(HRX3_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(CAN0_TX_A) FM(CANFD0_TX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP4_31_28 FM(RD_WR_N) F_(0, 0) FM(MSIOF3_RXD_D) FM(TX3_A) FM(HTX3_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(CAN0_RX_A) FM(CANFD0_RX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_3_0 FM(WE0_N) F_(0, 0) FM(MSIOF3_TXD_D) FM(CTS3_N) FM(HCTS3_N) F_(0, 0) F_(0, 0) FM(SCL6_B) FM(CAN_CLK) F_(0, 0) FM(IECLK_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_7_4 FM(WE1_N) F_(0, 0) FM(MSIOF3_SS1_D) FM(RTS3_N_TANS) FM(HRTS3_N) F_(0, 0) F_(0, 0) FM(SDA6_B) FM(CAN1_RX) FM(CANFD1_RX) FM(IERX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_7_4 FM(WE1_N) F_(0, 0) FM(MSIOF3_SS1_D) FM(RTS3_N) FM(HRTS3_N) F_(0, 0) F_(0, 0) FM(SDA6_B) FM(CAN1_RX) FM(CANFD1_RX) FM(IERX_A) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_11_8 FM(EX_WAIT0_A) FM(QCLK) F_(0, 0) F_(0, 0) FM(VI4_CLK) F_(0, 0) FM(DU_DOTCLKOUT0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_15_12 FM(D0) FM(MSIOF2_SS1_B)FM(MSIOF3_SCK_A) F_(0, 0) FM(VI4_DATA16) FM(VI5_DATA0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP5_19_16 FM(D1) FM(MSIOF2_SS2_B)FM(MSIOF3_SYNC_A) F_(0, 0) FM(VI4_DATA17) FM(VI5_DATA1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -271,7 +271,7 @@
|
||||
#define IP6_15_12 FM(D8) FM(LCDOUT0) FM(MSIOF2_SCK_D) FM(SCK4_C) FM(VI4_DATA0_A) F_(0, 0) FM(DU_DR0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_19_16 FM(D9) FM(LCDOUT1) FM(MSIOF2_SYNC_D) F_(0, 0) FM(VI4_DATA1_A) F_(0, 0) FM(DU_DR1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_23_20 FM(D10) FM(LCDOUT2) FM(MSIOF2_RXD_D) FM(HRX3_B) FM(VI4_DATA2_A) FM(CTS4_N_C) FM(DU_DR2) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_27_24 FM(D11) FM(LCDOUT3) FM(MSIOF2_TXD_D) FM(HTX3_B) FM(VI4_DATA3_A) FM(RTS4_N_TANS_C)FM(DU_DR3) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_27_24 FM(D11) FM(LCDOUT3) FM(MSIOF2_TXD_D) FM(HTX3_B) FM(VI4_DATA3_A) FM(RTS4_N_C) FM(DU_DR3) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP6_31_28 FM(D12) FM(LCDOUT4) FM(MSIOF2_SS1_D) FM(RX4_C) FM(VI4_DATA4_A) F_(0, 0) FM(DU_DR4) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
|
||||
/* IPSRx */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ /* 8 */ /* 9 */ /* A */ /* B */ /* C - F */
|
||||
@ -318,11 +318,11 @@
|
||||
#define IP11_31_28 FM(RX0) FM(HRX1_B) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SCK0_C) FM(STP_ISCLK_0_C) FM(RIF0_D0_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_3_0 FM(TX0) FM(HTX1_B) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SPSYNC0_C)FM(STP_ISSYNC_0_C) FM(RIF0_D1_B) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_7_4 FM(CTS0_N) FM(HCTS1_N_B) FM(MSIOF1_SYNC_B) F_(0, 0) F_(0, 0) FM(TS_SPSYNC1_C)FM(STP_ISSYNC_1_C) FM(RIF1_SYNC_B) FM(AUDIO_CLKOUT_C) FM(ADICS_SAMP) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_11_8 FM(RTS0_N_TANS) FM(HRTS1_N_B) FM(MSIOF1_SS1_B) FM(AUDIO_CLKA_B) FM(SCL2_A) F_(0, 0) FM(STP_IVCXO27_1_C) FM(RIF0_SYNC_B) F_(0, 0) FM(ADICHS1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_11_8 FM(RTS0_N) FM(HRTS1_N_B) FM(MSIOF1_SS1_B) FM(AUDIO_CLKA_B) FM(SCL2_A) F_(0, 0) FM(STP_IVCXO27_1_C) FM(RIF0_SYNC_B) F_(0, 0) FM(ADICHS1) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_15_12 FM(RX1_A) FM(HRX1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SDAT0_C) FM(STP_ISD_0_C) FM(RIF1_CLK_C) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_19_16 FM(TX1_A) FM(HTX1_A) F_(0, 0) F_(0, 0) F_(0, 0) FM(TS_SDEN0_C) FM(STP_ISEN_0_C) FM(RIF1_D0_C) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_23_20 FM(CTS1_N) FM(HCTS1_N_A) FM(MSIOF1_RXD_B) F_(0, 0) F_(0, 0) FM(TS_SDEN1_C) FM(STP_ISEN_1_C) FM(RIF1_D0_B) F_(0, 0) FM(ADIDATA) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_27_24 FM(RTS1_N_TANS) FM(HRTS1_N_A) FM(MSIOF1_TXD_B) F_(0, 0) F_(0, 0) FM(TS_SDAT1_C) FM(STP_ISD_1_C) FM(RIF1_D1_B) F_(0, 0) FM(ADICHS0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_27_24 FM(RTS1_N) FM(HRTS1_N_A) FM(MSIOF1_TXD_B) F_(0, 0) F_(0, 0) FM(TS_SDAT1_C) FM(STP_ISD_1_C) FM(RIF1_D1_B) F_(0, 0) FM(ADICHS0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP12_31_28 FM(SCK2) FM(SCIF_CLK_B) FM(MSIOF1_SCK_B) F_(0, 0) F_(0, 0) FM(TS_SCK1_C) FM(STP_ISCLK_1_C) FM(RIF1_CLK_B) F_(0, 0) FM(ADICLK) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP13_3_0 FM(TX2_A) F_(0, 0) F_(0, 0) FM(SD2_CD_B) FM(SCL1_A) F_(0, 0) FM(FMCLK_A) FM(RIF1_D1_C) F_(0, 0) FM(FSO_CFE_0_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
#define IP13_7_4 FM(RX2_A) F_(0, 0) F_(0, 0) FM(SD2_WP_B) FM(SDA1_A) F_(0, 0) FM(FMIN_A) FM(RIF1_SYNC_C) F_(0, 0) FM(FSO_CFE_1_N) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0) F_(0, 0)
|
||||
@ -626,7 +626,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, AVB_AVTP_CAPTURE_A, SEL_ETHERAVB_0),
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, MSIOF2_TXD_C, SEL_MSIOF2_2),
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, RTS4_N_TANS_A, SEL_SCIF4_0),
|
||||
PINMUX_IPSR_MSEL(IP0_23_20, RTS4_N_A, SEL_SCIF4_0),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP0_27_24, IRQ0),
|
||||
PINMUX_IPSR_GPSR(IP0_27_24, QPOLB),
|
||||
@ -654,7 +654,6 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, IRQ3),
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, QSTVB_QVE),
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, A25),
|
||||
PINMUX_IPSR_GPSR(IP1_7_4, DU_DOTCLKOUT1),
|
||||
PINMUX_IPSR_MSEL(IP1_7_4, VI4_DATA3_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_7_4, PWM4_B, SEL_PWM4_1),
|
||||
@ -662,7 +661,6 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, IRQ4),
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, QSTH_QHS),
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, A24),
|
||||
PINMUX_IPSR_GPSR(IP1_11_8, DU_EXHSYNC_DU_HSYNC),
|
||||
PINMUX_IPSR_MSEL(IP1_11_8, VI4_DATA4_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_11_8, PWM5_B, SEL_PWM5_1),
|
||||
@ -670,7 +668,6 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, IRQ5),
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, QSTB_QHE),
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, A23),
|
||||
PINMUX_IPSR_GPSR(IP1_15_12, DU_EXVSYNC_DU_VSYNC),
|
||||
PINMUX_IPSR_MSEL(IP1_15_12, VI4_DATA5_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_15_12, PWM6_B, SEL_PWM6_1),
|
||||
@ -678,18 +675,15 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP1_19_16, PWM0),
|
||||
PINMUX_IPSR_GPSR(IP1_19_16, AVB_AVTP_PPS),
|
||||
PINMUX_IPSR_GPSR(IP1_19_16, A22),
|
||||
PINMUX_IPSR_MSEL(IP1_19_16, VI4_DATA6_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_19_16, IECLK_B, SEL_IEBUS_1),
|
||||
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, PWM1_A, SEL_PWM1_0),
|
||||
PINMUX_IPSR_GPSR(IP1_23_20, A21),
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, HRX3_D, SEL_HSCIF3_3),
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, VI4_DATA7_B, SEL_VIN4_1),
|
||||
PINMUX_IPSR_MSEL(IP1_23_20, IERX_B, SEL_IEBUS_1),
|
||||
|
||||
PINMUX_IPSR_MSEL(IP1_27_24, PWM2_A, SEL_PWM2_0),
|
||||
PINMUX_IPSR_GPSR(IP1_27_24, A20),
|
||||
PINMUX_IPSR_MSEL(IP1_27_24, HTX3_D, SEL_HSCIF3_3),
|
||||
PINMUX_IPSR_MSEL(IP1_27_24, IETX_B, SEL_IEBUS_1),
|
||||
|
||||
@ -769,7 +763,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP3_7_4, A10),
|
||||
PINMUX_IPSR_MSEL(IP3_7_4, MSIOF2_RXD_A, SEL_MSIOF2_0),
|
||||
PINMUX_IPSR_MSEL(IP3_7_4, RTS4_N_TANS_B, SEL_SCIF4_1),
|
||||
PINMUX_IPSR_MSEL(IP3_7_4, RTS4_N_B, SEL_SCIF4_1),
|
||||
PINMUX_IPSR_GPSR(IP3_7_4, VI5_HSYNC_N),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP3_11_8, A11),
|
||||
@ -872,7 +866,7 @@ static const u16 pinmux_data[] = {
|
||||
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, WE1_N),
|
||||
PINMUX_IPSR_MSEL(IP5_7_4, MSIOF3_SS1_D, SEL_MSIOF3_3),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, RTS3_N_TANS),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, RTS3_N),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, HRTS3_N),
|
||||
PINMUX_IPSR_MSEL(IP5_7_4, SDA6_B, SEL_I2C6_1),
|
||||
PINMUX_IPSR_GPSR(IP5_7_4, CAN1_RX),
|
||||
@ -953,7 +947,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, MSIOF2_TXD_D, SEL_MSIOF2_3),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, HTX3_B, SEL_HSCIF3_1),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, VI4_DATA3_A, SEL_VIN4_0),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, RTS4_N_TANS_C, SEL_SCIF4_2),
|
||||
PINMUX_IPSR_MSEL(IP6_27_24, RTS4_N_C, SEL_SCIF4_2),
|
||||
PINMUX_IPSR_GPSR(IP6_27_24, DU_DR3),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP6_31_28, D12),
|
||||
@ -1161,7 +1155,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_GPSR(IP12_7_4, AUDIO_CLKOUT_C),
|
||||
PINMUX_IPSR_GPSR(IP12_7_4, ADICS_SAMP),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP12_11_8, RTS0_N_TANS),
|
||||
PINMUX_IPSR_GPSR(IP12_11_8, RTS0_N),
|
||||
PINMUX_IPSR_MSEL(IP12_11_8, HRTS1_N_B, SEL_HSCIF1_1),
|
||||
PINMUX_IPSR_MSEL(IP12_11_8, MSIOF1_SS1_B, SEL_MSIOF1_1),
|
||||
PINMUX_IPSR_MSEL(IP12_11_8, AUDIO_CLKA_B, SEL_ADG_A_1),
|
||||
@ -1190,7 +1184,7 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_IPSR_MSEL(IP12_23_20, RIF1_D0_B, SEL_DRIF1_1),
|
||||
PINMUX_IPSR_GPSR(IP12_23_20, ADIDATA),
|
||||
|
||||
PINMUX_IPSR_GPSR(IP12_27_24, RTS1_N_TANS),
|
||||
PINMUX_IPSR_GPSR(IP12_27_24, RTS1_N),
|
||||
PINMUX_IPSR_MSEL(IP12_27_24, HRTS1_N_A, SEL_HSCIF1_0),
|
||||
PINMUX_IPSR_MSEL(IP12_27_24, MSIOF1_TXD_B, SEL_MSIOF1_1),
|
||||
PINMUX_IPSR_MSEL(IP12_27_24, TS_SDAT1_C, SEL_TSIF1_2),
|
||||
@ -3255,7 +3249,7 @@ static const unsigned int scif0_ctrl_pins[] = {
|
||||
RCAR_GP_PIN(5, 4), RCAR_GP_PIN(5, 3),
|
||||
};
|
||||
static const unsigned int scif0_ctrl_mux[] = {
|
||||
RTS0_N_TANS_MARK, CTS0_N_MARK,
|
||||
RTS0_N_MARK, CTS0_N_MARK,
|
||||
};
|
||||
/* - SCIF1 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif1_data_a_pins[] = {
|
||||
@ -3277,7 +3271,7 @@ static const unsigned int scif1_ctrl_pins[] = {
|
||||
RCAR_GP_PIN(5, 8), RCAR_GP_PIN(5, 7),
|
||||
};
|
||||
static const unsigned int scif1_ctrl_mux[] = {
|
||||
RTS1_N_TANS_MARK, CTS1_N_MARK,
|
||||
RTS1_N_MARK, CTS1_N_MARK,
|
||||
};
|
||||
|
||||
static const unsigned int scif1_data_b_pins[] = {
|
||||
@ -3329,7 +3323,7 @@ static const unsigned int scif3_ctrl_pins[] = {
|
||||
RCAR_GP_PIN(1, 26), RCAR_GP_PIN(1, 25),
|
||||
};
|
||||
static const unsigned int scif3_ctrl_mux[] = {
|
||||
RTS3_N_TANS_MARK, CTS3_N_MARK,
|
||||
RTS3_N_MARK, CTS3_N_MARK,
|
||||
};
|
||||
static const unsigned int scif3_data_b_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3358,7 +3352,7 @@ static const unsigned int scif4_ctrl_a_pins[] = {
|
||||
RCAR_GP_PIN(2, 14), RCAR_GP_PIN(2, 13),
|
||||
};
|
||||
static const unsigned int scif4_ctrl_a_mux[] = {
|
||||
RTS4_N_TANS_A_MARK, CTS4_N_A_MARK,
|
||||
RTS4_N_A_MARK, CTS4_N_A_MARK,
|
||||
};
|
||||
static const unsigned int scif4_data_b_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3379,7 +3373,7 @@ static const unsigned int scif4_ctrl_b_pins[] = {
|
||||
RCAR_GP_PIN(1, 10), RCAR_GP_PIN(1, 9),
|
||||
};
|
||||
static const unsigned int scif4_ctrl_b_mux[] = {
|
||||
RTS4_N_TANS_B_MARK, CTS4_N_B_MARK,
|
||||
RTS4_N_B_MARK, CTS4_N_B_MARK,
|
||||
};
|
||||
static const unsigned int scif4_data_c_pins[] = {
|
||||
/* RX, TX */
|
||||
@ -3400,7 +3394,7 @@ static const unsigned int scif4_ctrl_c_pins[] = {
|
||||
RCAR_GP_PIN(0, 11), RCAR_GP_PIN(0, 10),
|
||||
};
|
||||
static const unsigned int scif4_ctrl_c_mux[] = {
|
||||
RTS4_N_TANS_C_MARK, CTS4_N_C_MARK,
|
||||
RTS4_N_C_MARK, CTS4_N_C_MARK,
|
||||
};
|
||||
/* - SCIF5 ------------------------------------------------------------------ */
|
||||
static const unsigned int scif5_data_a_pins[] = {
|
||||
@ -5406,11 +5400,11 @@ static const struct pinmux_drive_reg pinmux_drive_regs[] = {
|
||||
{ RCAR_GP_PIN(5, 3), 0, 3 }, /* CTS0 */
|
||||
} },
|
||||
{ PINMUX_DRIVE_REG("DRVCTRL18", 0xe6060348) {
|
||||
{ RCAR_GP_PIN(5, 4), 28, 3 }, /* RTS0_TANS */
|
||||
{ RCAR_GP_PIN(5, 4), 28, 3 }, /* RTS0 */
|
||||
{ RCAR_GP_PIN(5, 5), 24, 3 }, /* RX1 */
|
||||
{ RCAR_GP_PIN(5, 6), 20, 3 }, /* TX1 */
|
||||
{ RCAR_GP_PIN(5, 7), 16, 3 }, /* CTS1 */
|
||||
{ RCAR_GP_PIN(5, 8), 12, 3 }, /* RTS1_TANS */
|
||||
{ RCAR_GP_PIN(5, 8), 12, 3 }, /* RTS1 */
|
||||
{ RCAR_GP_PIN(5, 9), 8, 3 }, /* SCK2 */
|
||||
{ RCAR_GP_PIN(5, 10), 4, 3 }, /* TX2 */
|
||||
{ RCAR_GP_PIN(5, 11), 0, 3 }, /* RX2 */
|
||||
@ -5655,11 +5649,11 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
|
||||
[13] = RCAR_GP_PIN(5, 1), /* RX0 */
|
||||
[14] = RCAR_GP_PIN(5, 2), /* TX0 */
|
||||
[15] = RCAR_GP_PIN(5, 3), /* CTS0_N */
|
||||
[16] = RCAR_GP_PIN(5, 4), /* RTS0_N_TANS */
|
||||
[16] = RCAR_GP_PIN(5, 4), /* RTS0_N */
|
||||
[17] = RCAR_GP_PIN(5, 5), /* RX1_A */
|
||||
[18] = RCAR_GP_PIN(5, 6), /* TX1_A */
|
||||
[19] = RCAR_GP_PIN(5, 7), /* CTS1_N */
|
||||
[20] = RCAR_GP_PIN(5, 8), /* RTS1_N_TANS */
|
||||
[20] = RCAR_GP_PIN(5, 8), /* RTS1_N */
|
||||
[21] = RCAR_GP_PIN(5, 9), /* SCK2 */
|
||||
[22] = RCAR_GP_PIN(5, 10), /* TX2_A */
|
||||
[23] = RCAR_GP_PIN(5, 11), /* RX2_A */
|
||||
|
2329
drivers/pinctrl/sh-pfc/pfc-r8a77970.c
Normal file
2329
drivers/pinctrl/sh-pfc/pfc-r8a77970.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -518,6 +518,8 @@ static const u16 pinmux_data[] = {
|
||||
PINMUX_SINGLE(QSPI0_MISO_IO1),
|
||||
PINMUX_SINGLE(QSPI0_MOSI_IO0),
|
||||
PINMUX_SINGLE(QSPI0_SPCLK),
|
||||
PINMUX_SINGLE(SCL0),
|
||||
PINMUX_SINGLE(SDA0),
|
||||
|
||||
/* IPSR0 */
|
||||
PINMUX_IPSR_MSEL(IP0_3_0, IRQ0_A, SEL_IRQ_0_0),
|
||||
@ -1057,6 +1059,61 @@ static const unsigned int avb0_avtp_capture_b_mux[] = {
|
||||
AVB0_AVTP_CAPTURE_B_MARK,
|
||||
};
|
||||
|
||||
/* - CAN ------------------------------------------------------------------ */
|
||||
static const unsigned int can0_data_a_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 31),
|
||||
};
|
||||
static const unsigned int can0_data_a_mux[] = {
|
||||
CAN0_TX_A_MARK, CAN0_RX_A_MARK,
|
||||
};
|
||||
static const unsigned int can0_data_b_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(4, 22), RCAR_GP_PIN(4, 5),
|
||||
};
|
||||
static const unsigned int can0_data_b_mux[] = {
|
||||
CAN0_TX_B_MARK, CAN0_RX_B_MARK,
|
||||
};
|
||||
static const unsigned int can1_data_a_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 29),
|
||||
};
|
||||
static const unsigned int can1_data_a_mux[] = {
|
||||
CAN1_TX_A_MARK, CAN1_RX_A_MARK,
|
||||
};
|
||||
static const unsigned int can1_data_b_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(4, 7), RCAR_GP_PIN(4, 6),
|
||||
};
|
||||
static const unsigned int can1_data_b_mux[] = {
|
||||
CAN1_TX_B_MARK, CAN1_RX_B_MARK,
|
||||
};
|
||||
|
||||
/* - CAN Clock -------------------------------------------------------------- */
|
||||
static const unsigned int can_clk_pins[] = {
|
||||
/* CLK */
|
||||
RCAR_GP_PIN(5, 2),
|
||||
};
|
||||
static const unsigned int can_clk_mux[] = {
|
||||
CAN_CLK_MARK,
|
||||
};
|
||||
|
||||
/* - CAN FD ----------------------------------------------------------------- */
|
||||
static const unsigned int canfd0_data_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 31),
|
||||
};
|
||||
static const unsigned int canfd0_data_mux[] = {
|
||||
CANFD0_TX_MARK, CANFD0_RX_MARK,
|
||||
};
|
||||
static const unsigned int canfd1_data_pins[] = {
|
||||
/* TX, RX */
|
||||
RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 29),
|
||||
};
|
||||
static const unsigned int canfd1_data_mux[] = {
|
||||
CANFD1_TX_MARK, CANFD1_RX_MARK,
|
||||
};
|
||||
|
||||
/* - I2C -------------------------------------------------------------------- */
|
||||
static const unsigned int i2c0_pins[] = {
|
||||
/* SCL, SDA */
|
||||
@ -1504,6 +1561,13 @@ static const struct sh_pfc_pin_group pinmux_groups[] = {
|
||||
SH_PFC_PIN_GROUP(avb0_avtp_pps_b),
|
||||
SH_PFC_PIN_GROUP(avb0_avtp_match_b),
|
||||
SH_PFC_PIN_GROUP(avb0_avtp_capture_b),
|
||||
SH_PFC_PIN_GROUP(can0_data_a),
|
||||
SH_PFC_PIN_GROUP(can0_data_b),
|
||||
SH_PFC_PIN_GROUP(can1_data_a),
|
||||
SH_PFC_PIN_GROUP(can1_data_b),
|
||||
SH_PFC_PIN_GROUP(can_clk),
|
||||
SH_PFC_PIN_GROUP(canfd0_data),
|
||||
SH_PFC_PIN_GROUP(canfd1_data),
|
||||
SH_PFC_PIN_GROUP(i2c0),
|
||||
SH_PFC_PIN_GROUP(i2c1),
|
||||
SH_PFC_PIN_GROUP(i2c2_a),
|
||||
@ -1581,6 +1645,25 @@ static const char * const avb0_groups[] = {
|
||||
"avb0_avtp_capture_b",
|
||||
};
|
||||
|
||||
static const char * const can0_groups[] = {
|
||||
"can0_data_a",
|
||||
"can0_data_b",
|
||||
};
|
||||
static const char * const can1_groups[] = {
|
||||
"can1_data_a",
|
||||
"can1_data_b",
|
||||
};
|
||||
static const char * const can_clk_groups[] = {
|
||||
"can_clk",
|
||||
};
|
||||
|
||||
static const char * const canfd0_groups[] = {
|
||||
"canfd0_data",
|
||||
};
|
||||
static const char * const canfd1_groups[] = {
|
||||
"canfd1_data",
|
||||
};
|
||||
|
||||
static const char * const i2c0_groups[] = {
|
||||
"i2c0",
|
||||
};
|
||||
@ -1691,6 +1774,11 @@ static const char * const usb0_groups[] = {
|
||||
static const struct sh_pfc_function pinmux_functions[] = {
|
||||
SH_PFC_FUNCTION(audio_clk),
|
||||
SH_PFC_FUNCTION(avb0),
|
||||
SH_PFC_FUNCTION(can0),
|
||||
SH_PFC_FUNCTION(can1),
|
||||
SH_PFC_FUNCTION(can_clk),
|
||||
SH_PFC_FUNCTION(canfd0),
|
||||
SH_PFC_FUNCTION(canfd1),
|
||||
SH_PFC_FUNCTION(i2c0),
|
||||
SH_PFC_FUNCTION(i2c1),
|
||||
SH_PFC_FUNCTION(i2c2),
|
||||
|
@ -283,6 +283,7 @@ extern const struct sh_pfc_soc_info r8a7794_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7795_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7795es1_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a7796_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a77970_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info r8a77995_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info sh7203_pinmux_info;
|
||||
extern const struct sh_pfc_soc_info sh7264_pinmux_info;
|
||||
@ -389,10 +390,14 @@ extern const struct sh_pfc_soc_info shx3_pinmux_info;
|
||||
PORT_GP_CFG_1(bank, 3, fn, sfx, cfg)
|
||||
#define PORT_GP_4(bank, fn, sfx) PORT_GP_CFG_4(bank, fn, sfx, 0)
|
||||
|
||||
#define PORT_GP_CFG_8(bank, fn, sfx, cfg) \
|
||||
#define PORT_GP_CFG_6(bank, fn, sfx, cfg) \
|
||||
PORT_GP_CFG_4(bank, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 4, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 5, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 5, fn, sfx, cfg)
|
||||
#define PORT_GP_6(bank, fn, sfx) PORT_GP_CFG_6(bank, fn, sfx, 0)
|
||||
|
||||
#define PORT_GP_CFG_8(bank, fn, sfx, cfg) \
|
||||
PORT_GP_CFG_6(bank, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 6, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 7, fn, sfx, cfg)
|
||||
#define PORT_GP_8(bank, fn, sfx) PORT_GP_CFG_8(bank, fn, sfx, 0)
|
||||
@ -450,9 +455,13 @@ extern const struct sh_pfc_soc_info shx3_pinmux_info;
|
||||
PORT_GP_CFG_1(bank, 20, fn, sfx, cfg)
|
||||
#define PORT_GP_21(bank, fn, sfx) PORT_GP_CFG_21(bank, fn, sfx, 0)
|
||||
|
||||
#define PORT_GP_CFG_23(bank, fn, sfx, cfg) \
|
||||
#define PORT_GP_CFG_22(bank, fn, sfx, cfg) \
|
||||
PORT_GP_CFG_21(bank, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 21, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 21, fn, sfx, cfg)
|
||||
#define PORT_GP_22(bank, fn, sfx) PORT_GP_CFG_22(bank, fn, sfx, 0)
|
||||
|
||||
#define PORT_GP_CFG_23(bank, fn, sfx, cfg) \
|
||||
PORT_GP_CFG_22(bank, fn, sfx, cfg), \
|
||||
PORT_GP_CFG_1(bank, 22, fn, sfx, cfg)
|
||||
#define PORT_GP_23(bank, fn, sfx) PORT_GP_CFG_23(bank, fn, sfx, 0)
|
||||
|
||||
|
@ -519,10 +519,8 @@ static int plgpio_probe(struct platform_device *pdev)
|
||||
int ret, irq;
|
||||
|
||||
plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
|
||||
if (!plgpio) {
|
||||
dev_err(&pdev->dev, "memory allocation fail\n");
|
||||
if (!plgpio)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
plgpio->base = devm_ioremap_resource(&pdev->dev, res);
|
||||
@ -544,10 +542,8 @@ static int plgpio_probe(struct platform_device *pdev)
|
||||
sizeof(*plgpio->csave_regs) *
|
||||
DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG),
|
||||
GFP_KERNEL);
|
||||
if (!plgpio->csave_regs) {
|
||||
dev_err(&pdev->dev, "csave registers memory allocation fail\n");
|
||||
if (!plgpio->csave_regs)
|
||||
return -ENOMEM;
|
||||
}
|
||||
#endif
|
||||
|
||||
platform_set_drvdata(pdev, plgpio);
|
||||
|
@ -361,10 +361,8 @@ int spear_pinctrl_probe(struct platform_device *pdev,
|
||||
return -ENODEV;
|
||||
|
||||
pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
|
||||
if (!pmx) {
|
||||
dev_err(&pdev->dev, "Can't alloc spear_pmx\n");
|
||||
if (!pmx)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
pmx->vbase = devm_ioremap_resource(&pdev->dev, res);
|
||||
|
@ -818,7 +818,7 @@ static void sprd_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
|
||||
|
||||
grp = &info->groups[selector];
|
||||
|
||||
seq_printf(s, "\n");
|
||||
seq_putc(s, '\n');
|
||||
for (i = 0; i < grp->npins; i++, config++) {
|
||||
unsigned int pin_id = grp->pins[i];
|
||||
|
||||
|
@ -27,9 +27,21 @@ config PINCTRL_STM32F746
|
||||
default MACH_STM32F746
|
||||
select PINCTRL_STM32
|
||||
|
||||
config PINCTRL_STM32F769
|
||||
bool "STMicroelectronics STM32F769 pin control" if COMPILE_TEST && !MACH_STM32F769
|
||||
depends on OF
|
||||
default MACH_STM32F769
|
||||
select PINCTRL_STM32
|
||||
|
||||
config PINCTRL_STM32H743
|
||||
bool "STMicroelectronics STM32H743 pin control" if COMPILE_TEST && !MACH_STM32H743
|
||||
depends on OF
|
||||
default MACH_STM32H743
|
||||
select PINCTRL_STM32
|
||||
|
||||
config PINCTRL_STM32MP157
|
||||
bool "STMicroelectronics STM32MP157 pin control" if COMPILE_TEST && !MACH_STM32MP157
|
||||
depends on OF
|
||||
default MACH_STM32MP157
|
||||
select PINCTRL_STM32
|
||||
endif
|
||||
|
@ -6,4 +6,6 @@ obj-$(CONFIG_PINCTRL_STM32) += pinctrl-stm32.o
|
||||
obj-$(CONFIG_PINCTRL_STM32F429) += pinctrl-stm32f429.o
|
||||
obj-$(CONFIG_PINCTRL_STM32F469) += pinctrl-stm32f469.o
|
||||
obj-$(CONFIG_PINCTRL_STM32F746) += pinctrl-stm32f746.o
|
||||
obj-$(CONFIG_PINCTRL_STM32F769) += pinctrl-stm32f769.o
|
||||
obj-$(CONFIG_PINCTRL_STM32H743) += pinctrl-stm32h743.o
|
||||
obj-$(CONFIG_PINCTRL_STM32MP157) += pinctrl-stm32mp157.o
|
||||
|
@ -1,7 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) Maxime Coquelin 2015
|
||||
* Copyright (C) STMicroelectronics 2017
|
||||
* Author: Maxime Coquelin <mcoquelin.stm32@gmail.com>
|
||||
* License terms: GNU General Public License (GPL), version 2
|
||||
*
|
||||
* Heavily based on Mediatek's pinctrl driver
|
||||
*/
|
||||
|
@ -1,7 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) Maxime Coquelin 2015
|
||||
* Copyright (C) STMicroelectronics 2017
|
||||
* Author: Maxime Coquelin <mcoquelin.stm32@gmail.com>
|
||||
* License terms: GNU General Public License (GPL), version 2
|
||||
*/
|
||||
#ifndef __PINCTRL_STM32_H
|
||||
#define __PINCTRL_STM32_H
|
||||
|
@ -1,7 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) Maxime Coquelin 2015
|
||||
* Copyright (C) STMicroelectronics 2017
|
||||
* Author: Maxime Coquelin <mcoquelin.stm32@gmail.com>
|
||||
* License terms: GNU General Public License (GPL), version 2
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
|
@ -1,7 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) Alexandre Torgue 2016
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com>
|
||||
* License terms: GNU General Public License (GPL), version 2
|
||||
* Copyright (C) STMicroelectronics 2017
|
||||
* Author: Alexandre Torgue <alexandre.torgue@st.com> for STMicroelectronics.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
|
@ -1,7 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) Maxime Coquelin 2015
|
||||
* Copyright (C) STMicroelectronics 2017
|
||||
* Author: Maxime Coquelin <mcoquelin.stm32@gmail.com>
|
||||
* License terms: GNU General Public License (GPL), version 2
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.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