Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'pinctrl-for-v3.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl

Pull pin control updates from Linus Walleij:
"Main pin control pull request for the v3.13 cycle.

The changes hitting arch/blackfin are ACKed by the Blackfin
maintainer, and the device tree bindings are ACKed to the extent
possible by someone from the device tree maintainers group.

- Blackfin ADI pin control driver, we move yet another architecture
under this subsystem umbrella.

- Incremental updates to the Renesas Super-H PFC pin control driver.
New subdriver for the r8a7791 SoC.

- Non-linear GPIO ranges from the gpiolib side of things, this
enabled simplified device tree bindings by referring entire groups
of pins on some pin controller to act as back-end for a certain
GPIO-chip driver.

- Add the Abilis TB10x pin control driver used on the ARC
architecture. Also the corresponding GPIO driver is merged through
this tree, so the ARC has full support for pins and GPIOs after
this.

- Subdrivers for Freescale i.MX1, i.MX27 and i.MX50 pin controller
instances. The i.MX1 and i.MX27 is an entirely new family
(silicon) of controllers whereas i.MX50 is a variant of the
previous supported controller.

- Then the usual slew of fixes, cleanups and incremental updates"

The ARC DT changes are apparently still pending, that hopefully gets
sorted out in a timely manner.

* tag 'pinctrl-for-v3.13-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (48 commits)
pinctrl: imx50: add pinctrl support code for the IMX50 SoC
pinctrl: at91: copy define to driver
pinctrl: remove minor dead code
pinctrl: imx: fix using pin->input_val wrongly
pinctrl: imx1: fix return value check in imx1_pinctrl_core_probe()
gpio: tb10x: fix return value check in tb10x_gpio_probe()
gpio: tb10x: use module_platform_driver to simplify the code
pinctrl: imx27: imx27 pincontrol driver
pinctrl: imx1 core driver
pinctrl: sh-pfc: r8a7791 PFC support
sh-pfc: r8a7778: Add CAN pin groups
gpio: add TB10x GPIO driver
pinctrl: at91: correct a few typos
pinctrl: mvebu: remove redundant of_match_ptr
pinctrl: tb10x: use module_platform_driver to simplify the code
pinctrl: tb10x: fix the error handling in tb10x_pinctrl_probe()
pinctrl: add documentation for pinctrl_get_group_pins()
pinctrl: rockchip: emulate both edge triggered interrupts
pinctrl: rockchip: add rk3188 specifics
pinctrl: rockchip: remove redundant check
...

+11457 -300
+36
Documentation/devicetree/bindings/gpio/abilis,tb10x-gpio.txt
··· 1 + * Abilis TB10x GPIO controller 2 + 3 + Required Properties: 4 + - compatible: Should be "abilis,tb10x-gpio" 5 + - reg: Address and length of the register set for the device 6 + - gpio-controller: Marks the device node as a gpio controller. 7 + - #gpio-cells: Should be <2>. The first cell is the pin number and the 8 + second cell is used to specify optional parameters: 9 + - bit 0 specifies polarity (0 for normal, 1 for inverted). 10 + - abilis,ngpio: the number of GPIO pins this driver controls. 11 + 12 + Optional Properties: 13 + - interrupt-controller: Marks the device node as an interrupt controller. 14 + - #interrupt-cells: Should be <1>. Interrupts are triggered on both edges. 15 + - interrupts: Defines the interrupt line connecting this GPIO controller to 16 + its parent interrupt controller. 17 + - interrupt-parent: Defines the parent interrupt controller. 18 + 19 + GPIO ranges are specified as described in 20 + Documentation/devicetree/bindings/gpio/gpio.txt 21 + 22 + Example: 23 + 24 + gpioa: gpio@FF140000 { 25 + compatible = "abilis,tb10x-gpio"; 26 + interrupt-controller; 27 + #interrupt-cells = <1>; 28 + interrupt-parent = <&tb10x_ictl>; 29 + interrupts = <27 2>; 30 + reg = <0xFF140000 0x1000>; 31 + gpio-controller; 32 + #gpio-cells = <2>; 33 + abilis,ngpio = <3>; 34 + gpio-ranges = <&iomux 0 0 0>; 35 + gpio-ranges-group-names = "gpioa_pins"; 36 + };
+38 -2
Documentation/devicetree/bindings/gpio/gpio.txt
··· 87 87 contains information structures as follows: 88 88 89 89 gpio-range-list ::= <single-gpio-range> [gpio-range-list] 90 - single-gpio-range ::= 90 + single-gpio-range ::= <numeric-gpio-range> | <named-gpio-range> 91 + numeric-gpio-range ::= 91 92 <pinctrl-phandle> <gpio-base> <pinctrl-base> <count> 93 + named-gpio-range ::= <pinctrl-phandle> <gpio-base> '<0 0>' 92 94 gpio-phandle : phandle to pin controller node. 93 95 gpio-base : Base GPIO ID in the GPIO controller 94 96 pinctrl-base : Base pinctrl pin ID in the pin controller ··· 99 97 The "pin controller node" mentioned above must conform to the bindings 100 98 described in ../pinctrl/pinctrl-bindings.txt. 101 99 100 + In case named gpio ranges are used (ranges with both <pinctrl-base> and 101 + <count> set to 0), the property gpio-ranges-group-names contains one string 102 + for every single-gpio-range in gpio-ranges: 103 + gpiorange-names-list ::= <gpiorange-name> [gpiorange-names-list] 104 + gpiorange-name : Name of the pingroup associated to the GPIO range in 105 + the respective pin controller. 106 + 107 + Elements of gpiorange-names-list corresponding to numeric ranges contain 108 + the empty string. Elements of gpiorange-names-list corresponding to named 109 + ranges contain the name of a pin group defined in the respective pin 110 + controller. The number of pins/GPIOs in the range is the number of pins in 111 + that pin group. 112 + 102 113 Previous versions of this binding required all pin controller nodes that 103 114 were referenced by any gpio-ranges property to contain a property named 104 115 #gpio-range-cells with value <3>. This requirement is now deprecated. ··· 119 104 compatibility reasons, and would still be required even in new device 120 105 trees that need to be compatible with older software. 121 106 122 - Example: 107 + Example 1: 123 108 124 109 qe_pio_e: gpio-controller@1460 { 125 110 #gpio-cells = <2>; ··· 132 117 Here, a single GPIO controller has GPIOs 0..9 routed to pin controller 133 118 pinctrl1's pins 20..29, and GPIOs 10..19 routed to pin controller pinctrl2's 134 119 pins 50..59. 120 + 121 + Example 2: 122 + 123 + gpio_pio_i: gpio-controller@14B0 { 124 + #gpio-cells = <2>; 125 + compatible = "fsl,qe-pario-bank-e", "fsl,qe-pario-bank"; 126 + reg = <0x1480 0x18>; 127 + gpio-controller; 128 + gpio-ranges = <&pinctrl1 0 20 10>, 129 + <&pinctrl2 10 0 0>, 130 + <&pinctrl1 15 0 10>, 131 + <&pinctrl2 25 0 0>; 132 + gpio-ranges-group-names = "", 133 + "foo", 134 + "", 135 + "bar"; 136 + }; 137 + 138 + Here, three GPIO ranges are defined wrt. two pin controllers. pinctrl1 GPIO 139 + ranges are defined using pin numbers whereas the GPIO ranges wrt. pinctrl2 140 + are named "foo" and "bar".
+80
Documentation/devicetree/bindings/pinctrl/abilis,tb10x-iomux.txt
··· 1 + Abilis Systems TB10x pin controller 2 + =================================== 3 + 4 + Required properties 5 + ------------------- 6 + 7 + - compatible: should be "abilis,tb10x-iomux"; 8 + - reg: should contain the physical address and size of the pin controller's 9 + register range. 10 + 11 + 12 + Function definitions 13 + -------------------- 14 + 15 + Functions are defined (and referenced) by sub-nodes of the pin controller. 16 + Every sub-node defines exactly one function (implying a set of pins). 17 + Every function is associated to one named pin group inside the pin controller 18 + driver and these names are used to associate pin group predefinitions to pin 19 + controller sub-nodes. 20 + 21 + Required function definition subnode properties: 22 + - abilis,function: should be set to the name of the function's pin group. 23 + 24 + The following pin groups are available: 25 + - GPIO ports: gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, 26 + gpioh, gpioi, gpioj, gpiok, gpiol, gpiom, gpion 27 + - Serial TS input ports: mis0, mis1, mis2, mis3, mis4, mis5, mis6, mis7 28 + - Parallel TS input ports: mip1, mip3, mip5, mip7 29 + - Serial TS output ports: mos0, mos1, mos2, mos3 30 + - Parallel TS output port: mop 31 + - CI+ port: ciplus 32 + - CableCard (Mcard) port: mcard 33 + - Smart card ports: stc0, stc1 34 + - UART ports: uart0, uart1 35 + - SPI ports: spi1, spi3 36 + - JTAG: jtag 37 + 38 + All other ports of the chip are not multiplexed and thus not managed by this 39 + driver. 40 + 41 + 42 + GPIO ranges definition 43 + ---------------------- 44 + 45 + The named pin groups of GPIO ports can be used to define GPIO ranges as 46 + explained in Documentation/devicetree/bindings/gpio/gpio.txt. 47 + 48 + 49 + Example 50 + ------- 51 + 52 + iomux: iomux@FF10601c { 53 + compatible = "abilis,tb10x-iomux"; 54 + reg = <0xFF10601c 0x4>; 55 + pctl_gpio_a: pctl-gpio-a { 56 + abilis,function = "gpioa"; 57 + }; 58 + pctl_uart0: pctl-uart0 { 59 + abilis,function = "uart0"; 60 + }; 61 + }; 62 + uart@FF100000 { 63 + compatible = "snps,dw-apb-uart"; 64 + reg = <0xFF100000 0x100>; 65 + clock-frequency = <166666666>; 66 + interrupts = <25 1>; 67 + reg-shift = <2>; 68 + reg-io-width = <4>; 69 + pinctrl-names = "default"; 70 + pinctrl-0 = <&pctl_uart0>; 71 + }; 72 + gpioa: gpio@FF140000 { 73 + compatible = "abilis,tb10x-gpio"; 74 + reg = <0xFF140000 0x1000>; 75 + gpio-controller; 76 + #gpio-cells = <2>; 77 + ngpio = <3>; 78 + gpio-ranges = <&iomux 0 0>; 79 + gpio-ranges-group-names = "gpioa"; 80 + };
+1 -1
Documentation/devicetree/bindings/pinctrl/atmel,at91-pinctrl.txt
··· 18 18 such as pull-up, multi drive, etc. 19 19 20 20 Required properties for iomux controller: 21 - - compatible: "atmel,at91rm9200-pinctrl" 21 + - compatible: "atmel,at91rm9200-pinctrl" or "atmel,at91sam9x5-pinctrl" 22 22 - atmel,mux-mask: array of mask (periph per bank) to describe if a pin can be 23 23 configured in this periph mode. All the periph and bank need to be describe. 24 24
+18 -19
Documentation/devicetree/bindings/pinctrl/fsl,imx-pinctrl.txt
··· 22 22 Please refer to each fsl,<soc>-pinctrl.txt binding doc for supported SoCs. 23 23 24 24 Required properties for pin configuration node: 25 - - fsl,pins: two integers array, represents a group of pins mux and config 26 - setting. The format is fsl,pins = <PIN_FUNC_ID CONFIG>, PIN_FUNC_ID is a 27 - pin working on a specific function, which consists of a tuple of 28 - <mux_reg conf_reg input_reg mux_val input_val>. CONFIG is the pad setting 29 - value like pull-up on this pin. 25 + - fsl,pins: each entry consists of 6 integers and represents the mux and config 26 + setting for one pin. The first 5 integers <mux_reg conf_reg input_reg mux_val 27 + input_val> are specified using a PIN_FUNC_ID macro, which can be found in 28 + imx*-pinfunc.h under device tree source folder. The last integer CONFIG is 29 + the pad setting value like pull-up on this pin. And that's why fsl,pins entry 30 + looks like <PIN_FUNC_ID CONFIG> in the example below. 30 31 31 32 Bits used for CONFIG: 32 33 NO_PAD_CTL(1 << 31): indicate this pin does not need config. ··· 73 72 /* shared pinctrl settings */ 74 73 usdhc4 { 75 74 pinctrl_usdhc4_1: usdhc4grp-1 { 76 - fsl,pins = <1386 0x17059 /* MX6Q_PAD_SD4_CMD__USDHC4_CMD */ 77 - 1392 0x10059 /* MX6Q_PAD_SD4_CLK__USDHC4_CLK */ 78 - 1462 0x17059 /* MX6Q_PAD_SD4_DAT0__USDHC4_DAT0 */ 79 - 1470 0x17059 /* MX6Q_PAD_SD4_DAT1__USDHC4_DAT1 */ 80 - 1478 0x17059 /* MX6Q_PAD_SD4_DAT2__USDHC4_DAT2 */ 81 - 1486 0x17059 /* MX6Q_PAD_SD4_DAT3__USDHC4_DAT3 */ 82 - 1493 0x17059 /* MX6Q_PAD_SD4_DAT4__USDHC4_DAT4 */ 83 - 1501 0x17059 /* MX6Q_PAD_SD4_DAT5__USDHC4_DAT5 */ 84 - 1509 0x17059 /* MX6Q_PAD_SD4_DAT6__USDHC4_DAT6 */ 85 - 1517 0x17059>; /* MX6Q_PAD_SD4_DAT7__USDHC4_DAT7 */ 86 - }; 75 + fsl,pins = < 76 + MX6QDL_PAD_SD4_CMD__SD4_CMD 0x17059 77 + MX6QDL_PAD_SD4_CLK__SD4_CLK 0x10059 78 + MX6QDL_PAD_SD4_DAT0__SD4_DATA0 0x17059 79 + MX6QDL_PAD_SD4_DAT1__SD4_DATA1 0x17059 80 + MX6QDL_PAD_SD4_DAT2__SD4_DATA2 0x17059 81 + MX6QDL_PAD_SD4_DAT3__SD4_DATA3 0x17059 82 + MX6QDL_PAD_SD4_DAT4__SD4_DATA4 0x17059 83 + MX6QDL_PAD_SD4_DAT5__SD4_DATA5 0x17059 84 + MX6QDL_PAD_SD4_DAT6__SD4_DATA6 0x17059 85 + MX6QDL_PAD_SD4_DAT7__SD4_DATA7 0x17059 86 + >; 87 87 }; 88 88 .... 89 89 }; ··· 92 90 0x17059 means enable hysteresis, 47KOhm Pull Up, 50Mhz speed, 93 91 80Ohm driver strength and Fast Slew Rate. 94 92 User should refer to each SoC spec to set the correct value. 95 - 96 - TODO: when dtc macro support is available, we can change above raw data 97 - to dt macro which can get better readability in dts file.
+99
Documentation/devicetree/bindings/pinctrl/fsl,imx27-pinctrl.txt
··· 1 + * Freescale IMX27 IOMUX Controller 2 + 3 + Required properties: 4 + - compatible: "fsl,imx27-iomuxc" 5 + 6 + The iomuxc driver node should define subnodes containing of pinctrl configuration subnodes. 7 + 8 + Required properties for pin configuration node: 9 + - fsl,pins: three integers array, represents a group of pins mux and config 10 + setting. The format is fsl,pins = <PIN MUX_ID CONFIG>. 11 + 12 + PIN is an integer between 0 and 0xbf. imx27 has 6 ports with 32 configurable 13 + configurable pins each. PIN is PORT * 32 + PORT_PIN, PORT_PIN is the pin 14 + number on the specific port (between 0 and 31). 15 + 16 + MUX_ID is 17 + function + (direction << 2) + (gpio_oconf << 4) + (gpio_iconfa << 8) + (gpio_iconfb << 10) 18 + 19 + function value is used to select the pin function. 20 + Possible values: 21 + 0 - Primary function 22 + 1 - Alternate function 23 + 2 - GPIO 24 + Registers: GIUS (GPIO In Use), GPR (General Purpose Register) 25 + 26 + direction defines the data direction of the pin. 27 + Possible values: 28 + 0 - Input 29 + 1 - Output 30 + Register: DDIR 31 + 32 + gpio_oconf configures the gpio submodule output signal. This does not 33 + have any effect unless GPIO function is selected. A/B/C_IN are output 34 + signals of function blocks A,B and C. Specific function blocks are 35 + described in the reference manual. 36 + Possible values: 37 + 0 - A_IN 38 + 1 - B_IN 39 + 2 - C_IN 40 + 3 - Data Register 41 + Registers: OCR1, OCR2 42 + 43 + gpio_iconfa/b configures the gpio submodule input to functionblocks A and 44 + B. GPIO function should be selected if this is configured. 45 + Possible values: 46 + 0 - GPIO_IN 47 + 1 - Interrupt Status Register 48 + 2 - Pulldown 49 + 3 - Pullup 50 + Registers ICONFA1, ICONFA2, ICONFB1 and ICONFB2 51 + 52 + CONFIG can be 0 or 1, meaning Pullup disable/enable. 53 + 54 + 55 + 56 + Example: 57 + 58 + iomuxc: iomuxc@10015000 { 59 + compatible = "fsl,imx27-iomuxc"; 60 + reg = <0x10015000 0x600>; 61 + 62 + uart { 63 + pinctrl_uart1: uart-1 { 64 + fsl,pins = < 65 + 0x8c 0x004 0x0 /* UART1_TXD__UART1_TXD */ 66 + 0x8d 0x000 0x0 /* UART1_RXD__UART1_RXD */ 67 + 0x8e 0x004 0x0 /* UART1_CTS__UART1_CTS */ 68 + 0x8f 0x000 0x0 /* UART1_RTS__UART1_RTS */ 69 + >; 70 + }; 71 + 72 + ... 73 + }; 74 + }; 75 + 76 + 77 + For convenience there are macros defined in imx27-pinfunc.h which provide PIN 78 + and MUX_ID. They are structured as MX27_PAD_<Pad name>__<Signal name>. The names 79 + are defined in the i.MX27 reference manual. 80 + 81 + The above example using macros: 82 + 83 + iomuxc: iomuxc@10015000 { 84 + compatible = "fsl,imx27-iomuxc"; 85 + reg = <0x10015000 0x600>; 86 + 87 + uart { 88 + pinctrl_uart1: uart-1 { 89 + fsl,pins = < 90 + MX27_PAD_UART1_TXD__UART1_TXD 0x0 91 + MX27_PAD_UART1_RXD__UART1_RXD 0x0 92 + MX27_PAD_UART1_CTS__UART1_CTS 0x0 93 + MX27_PAD_UART1_RTS__UART1_RTS 0x0 94 + >; 95 + }; 96 + 97 + ... 98 + }; 99 + };
+1 -1
Documentation/devicetree/bindings/pinctrl/pinctrl-palmas.txt
··· 41 41 42 42 Required: pins 43 43 Options: function, bias-disable, bias-pull-up, bias-pull-down, 44 - bias-pin-default, drive-open-drain. 44 + drive-open-drain. 45 45 46 46 Note that many of these properties are only valid for certain specific pins. 47 47 See the Palmas device datasheet for complete details regarding which pins
+45 -1
Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt
··· 21 21 Required properties for iomux controller: 22 22 - compatible: one of "rockchip,rk2928-pinctrl", "rockchip,rk3066a-pinctrl" 23 23 "rockchip,rk3066b-pinctrl", "rockchip,rk3188-pinctrl" 24 + - reg: first element is the general register space of the iomux controller 25 + second element is the separate pull register space of the rk3188 24 26 25 27 Required properties for gpio sub nodes: 26 - - compatible: "rockchip,gpio-bank" 28 + - compatible: "rockchip,gpio-bank", "rockchip,rk3188-gpio-bank0" 27 29 - reg: register of the gpio bank (different than the iomux registerset) 30 + second element: separate pull register for rk3188 bank0 28 31 - interrupts: base interrupt of the gpio bank in the interrupt controller 29 32 - clocks: clock that drives this bank 30 33 - gpio-controller: identifies the node as a gpio controller and pin bank. ··· 98 95 pinctrl-names = "default"; 99 96 pinctrl-0 = <&uart2_xfer>; 100 97 }; 98 + 99 + Example for rk3188: 100 + 101 + pinctrl@20008000 { 102 + compatible = "rockchip,rk3188-pinctrl"; 103 + reg = <0x20008000 0xa0>, 104 + <0x20008164 0x1a0>; 105 + #address-cells = <1>; 106 + #size-cells = <1>; 107 + ranges; 108 + 109 + gpio0: gpio0@0x2000a000 { 110 + compatible = "rockchip,rk3188-gpio-bank0"; 111 + reg = <0x2000a000 0x100>, 112 + <0x20004064 0x8>; 113 + interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>; 114 + clocks = <&clk_gates8 9>; 115 + 116 + gpio-controller; 117 + #gpio-cells = <2>; 118 + 119 + interrupt-controller; 120 + #interrupt-cells = <2>; 121 + }; 122 + 123 + gpio1: gpio1@0x2003c000 { 124 + compatible = "rockchip,gpio-bank"; 125 + reg = <0x2003c000 0x100>; 126 + interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>; 127 + clocks = <&clk_gates8 10>; 128 + 129 + gpio-controller; 130 + #gpio-cells = <2>; 131 + 132 + interrupt-controller; 133 + #interrupt-cells = <2>; 134 + }; 135 + 136 + ... 137 + 138 + };
+6 -1
Documentation/pinctrl.txt
··· 358 358 .gc = &chip; 359 359 }; 360 360 361 - In this case the pin_base property will be ignored. 361 + In this case the pin_base property will be ignored. If the name of a pin 362 + group is known, the pins and npins elements of the above structure can be 363 + initialised using the function pinctrl_get_group_pins(), e.g. for pin 364 + group "foo": 365 + 366 + pinctrl_get_group_pins(pctl, "foo", &gpio_range.pins, &gpio_range.npins); 362 367 363 368 When GPIO-specific functions in the pin control subsystem are called, these 364 369 ranges will be used to look up the appropriate pin controller by inspecting
+12
arch/arm/boot/dts/atlas6.dtsi
··· 558 558 sirf,function = "usb1_utmi_drvbus"; 559 559 }; 560 560 }; 561 + usb1_dp_dn_pins_a: usb1_dp_dn@0 { 562 + usb1_dp_dn { 563 + sirf,pins = "usb1_dp_dngrp"; 564 + sirf,function = "usb1_dp_dn"; 565 + }; 566 + }; 567 + uart1_route_io_usb1_pins_a: uart1_route_io_usb1@0 { 568 + uart1_route_io_usb1 { 569 + sirf,pins = "uart1_route_io_usb1grp"; 570 + sirf,function = "uart1_route_io_usb1"; 571 + }; 572 + }; 561 573 warm_rst_pins_a: warm_rst@0 { 562 574 warm_rst { 563 575 sirf,pins = "warm_rstgrp";
+42
arch/arm/boot/dts/prima2.dtsi
··· 388 388 sirf,function = "uart0"; 389 389 }; 390 390 }; 391 + uart0_noflow_pins_a: uart0@1 { 392 + uart { 393 + sirf,pins = "uart0_nostreamctrlgrp"; 394 + sirf,function = "uart0_nostreamctrl"; 395 + }; 396 + }; 391 397 uart1_pins_a: uart1@0 { 392 398 uart { 393 399 sirf,pins = "uart1grp"; ··· 532 526 sirf,function = "usp0"; 533 527 }; 534 528 }; 529 + usp0_uart_nostreamctrl_pins_a: usp0@1 { 530 + usp0 { 531 + sirf,pins = 532 + "usp0_uart_nostreamctrl_grp"; 533 + sirf,function = 534 + "usp0_uart_nostreamctrl"; 535 + }; 536 + }; 535 537 usp1_pins_a: usp1@0 { 536 538 usp1 { 537 539 sirf,pins = "usp1grp"; 538 540 sirf,function = "usp1"; 539 541 }; 540 542 }; 543 + usp1_uart_nostreamctrl_pins_a: usp1@1 { 544 + usp1 { 545 + sirf,pins = 546 + "usp1_uart_nostreamctrl_grp"; 547 + sirf,function = 548 + "usp1_uart_nostreamctrl"; 549 + }; 550 + }; 541 551 usp2_pins_a: usp2@0 { 542 552 usp2 { 543 553 sirf,pins = "usp2grp"; 544 554 sirf,function = "usp2"; 555 + }; 556 + }; 557 + usp2_uart_nostreamctrl_pins_a: usp2@1 { 558 + usp2 { 559 + sirf,pins = 560 + "usp2_uart_nostreamctrl_grp"; 561 + sirf,function = 562 + "usp2_uart_nostreamctrl"; 545 563 }; 546 564 }; 547 565 usb0_utmi_drvbus_pins_a: usb0_utmi_drvbus@0 { ··· 578 548 usb1_utmi_drvbus { 579 549 sirf,pins = "usb1_utmi_drvbusgrp"; 580 550 sirf,function = "usb1_utmi_drvbus"; 551 + }; 552 + }; 553 + usb1_dp_dn_pins_a: usb1_dp_dn@0 { 554 + usb1_dp_dn { 555 + sirf,pins = "usb1_dp_dngrp"; 556 + sirf,function = "usb1_dp_dn"; 557 + }; 558 + }; 559 + uart1_route_io_usb1_pins_a: uart1_route_io_usb1@0 { 560 + uart1_route_io_usb1 { 561 + sirf,pins = "uart1_route_io_usb1grp"; 562 + sirf,function = "uart1_route_io_usb1"; 581 563 }; 582 564 }; 583 565 warm_rst_pins_a: warm_rst@0 {
+11
arch/blackfin/Kconfig
··· 52 52 config ZONE_DMA 53 53 def_bool y 54 54 55 + config GENERIC_GPIO 56 + def_bool y 57 + 55 58 config FORCE_MAX_ZONEORDER 56 59 int 57 60 default "14" ··· 319 316 bool 320 317 depends on (BF531 || BF532 || BF533 || BF534 || BF536 || BF537) 321 318 default y 319 + 320 + config GPIO_ADI 321 + def_bool y 322 + depends on (BF51x || BF52x || BF53x || BF538 || BF539 || BF561) 323 + 324 + config PINCTRL 325 + def_bool y 326 + depends on BF54x || BF60x 322 327 323 328 config MEM_MT48LC64M4A2FB_7E 324 329 bool
+20 -137
arch/blackfin/include/asm/gpio.h
··· 25 25 26 26 #ifndef __ASSEMBLY__ 27 27 28 + #ifndef CONFIG_PINCTRL 29 + 28 30 #include <linux/compiler.h> 29 - #include <linux/gpio.h> 31 + #include <asm/blackfin.h> 32 + #include <asm/portmux.h> 33 + #include <asm/irq_handler.h> 30 34 31 35 /*********************************************************** 32 36 * ··· 49 45 * MODIFICATION HISTORY : 50 46 **************************************************************/ 51 47 52 - #if !BFIN_GPIO_PINT 53 48 void set_gpio_dir(unsigned, unsigned short); 54 49 void set_gpio_inen(unsigned, unsigned short); 55 50 void set_gpio_polar(unsigned, unsigned short); ··· 118 115 unsigned short dummy16; 119 116 unsigned short inen; 120 117 }; 121 - #endif 122 118 123 119 #ifdef BFIN_SPECIAL_GPIO_BANKS 124 120 void bfin_special_gpio_free(unsigned gpio); ··· 129 127 #endif 130 128 131 129 #ifdef CONFIG_PM 132 - int bfin_pm_standby_ctrl(unsigned ctrl); 130 + void bfin_gpio_pm_hibernate_restore(void); 131 + void bfin_gpio_pm_hibernate_suspend(void); 132 + int bfin_gpio_pm_wakeup_ctrl(unsigned gpio, unsigned ctrl); 133 + int bfin_gpio_pm_standby_ctrl(unsigned ctrl); 133 134 134 135 static inline int bfin_pm_standby_setup(void) 135 136 { 136 - return bfin_pm_standby_ctrl(1); 137 + return bfin_gpio_pm_standby_ctrl(1); 137 138 } 138 139 139 140 static inline void bfin_pm_standby_restore(void) 140 141 { 141 - bfin_pm_standby_ctrl(0); 142 + bfin_gpio_pm_standby_ctrl(0); 142 143 } 143 144 144 - void bfin_gpio_pm_hibernate_restore(void); 145 - void bfin_gpio_pm_hibernate_suspend(void); 146 - void bfin_pint_suspend(void); 147 - void bfin_pint_resume(void); 148 - 149 - # if !BFIN_GPIO_PINT 150 - int gpio_pm_wakeup_ctrl(unsigned gpio, unsigned ctrl); 151 145 152 146 struct gpio_port_s { 153 147 unsigned short data; ··· 159 161 unsigned short reserved; 160 162 unsigned short mux; 161 163 }; 162 - # endif 163 164 #endif /*CONFIG_PM*/ 164 165 165 166 /*********************************************************** ··· 175 178 ************************************************************* 176 179 * MODIFICATION HISTORY : 177 180 **************************************************************/ 178 - 179 - int bfin_gpio_request(unsigned gpio, const char *label); 180 - void bfin_gpio_free(unsigned gpio); 181 181 int bfin_gpio_irq_request(unsigned gpio, const char *label); 182 182 void bfin_gpio_irq_free(unsigned gpio); 183 - int bfin_gpio_direction_input(unsigned gpio); 184 - int bfin_gpio_direction_output(unsigned gpio, int value); 185 - int bfin_gpio_get_value(unsigned gpio); 186 - void bfin_gpio_set_value(unsigned gpio, int value); 183 + void bfin_gpio_irq_prepare(unsigned gpio); 184 + 185 + static inline int irq_to_gpio(unsigned irq) 186 + { 187 + return irq - GPIO_IRQ_BASE; 188 + } 189 + #endif /* CONFIG_PINCTRL */ 187 190 188 191 #include <asm/irq.h> 189 192 #include <asm/errno.h> 190 193 191 - #ifdef CONFIG_GPIOLIB 192 194 #include <asm-generic/gpio.h> /* cansleep wrappers */ 193 195 194 196 static inline int gpio_get_value(unsigned int gpio) 195 197 { 196 - if (gpio < MAX_BLACKFIN_GPIOS) 197 - return bfin_gpio_get_value(gpio); 198 - else 199 - return __gpio_get_value(gpio); 198 + return __gpio_get_value(gpio); 200 199 } 201 200 202 201 static inline void gpio_set_value(unsigned int gpio, int value) 203 202 { 204 - if (gpio < MAX_BLACKFIN_GPIOS) 205 - bfin_gpio_set_value(gpio, value); 206 - else 207 - __gpio_set_value(gpio, value); 203 + __gpio_set_value(gpio, value); 208 204 } 209 205 210 206 static inline int gpio_cansleep(unsigned int gpio) ··· 209 219 { 210 220 return __gpio_to_irq(gpio); 211 221 } 212 - 213 - #else /* !CONFIG_GPIOLIB */ 214 - 215 - static inline int gpio_request(unsigned gpio, const char *label) 216 - { 217 - return bfin_gpio_request(gpio, label); 218 - } 219 - 220 - static inline void gpio_free(unsigned gpio) 221 - { 222 - return bfin_gpio_free(gpio); 223 - } 224 - 225 - static inline int gpio_direction_input(unsigned gpio) 226 - { 227 - return bfin_gpio_direction_input(gpio); 228 - } 229 - 230 - static inline int gpio_direction_output(unsigned gpio, int value) 231 - { 232 - return bfin_gpio_direction_output(gpio, value); 233 - } 234 - 235 - static inline int gpio_set_debounce(unsigned gpio, unsigned debounce) 236 - { 237 - return -EINVAL; 238 - } 239 - 240 - static inline int gpio_request_one(unsigned gpio, unsigned long flags, const char *label) 241 - { 242 - int err; 243 - 244 - err = bfin_gpio_request(gpio, label); 245 - if (err) 246 - return err; 247 - 248 - if (flags & GPIOF_DIR_IN) 249 - err = bfin_gpio_direction_input(gpio); 250 - else 251 - err = bfin_gpio_direction_output(gpio, 252 - (flags & GPIOF_INIT_HIGH) ? 1 : 0); 253 - 254 - if (err) 255 - bfin_gpio_free(gpio); 256 - 257 - return err; 258 - } 259 - 260 - static inline int gpio_request_array(const struct gpio *array, size_t num) 261 - { 262 - int i, err; 263 - 264 - for (i = 0; i < num; i++, array++) { 265 - err = gpio_request_one(array->gpio, array->flags, array->label); 266 - if (err) 267 - goto err_free; 268 - } 269 - return 0; 270 - 271 - err_free: 272 - while (i--) 273 - bfin_gpio_free((--array)->gpio); 274 - return err; 275 - } 276 - 277 - static inline void gpio_free_array(const struct gpio *array, size_t num) 278 - { 279 - while (num--) 280 - bfin_gpio_free((array++)->gpio); 281 - } 282 - 283 - static inline int __gpio_get_value(unsigned gpio) 284 - { 285 - return bfin_gpio_get_value(gpio); 286 - } 287 - 288 - static inline void __gpio_set_value(unsigned gpio, int value) 289 - { 290 - return bfin_gpio_set_value(gpio, value); 291 - } 292 - 293 - static inline int gpio_get_value(unsigned gpio) 294 - { 295 - return __gpio_get_value(gpio); 296 - } 297 - 298 - static inline void gpio_set_value(unsigned gpio, int value) 299 - { 300 - return __gpio_set_value(gpio, value); 301 - } 302 - 303 - static inline int gpio_to_irq(unsigned gpio) 304 - { 305 - if (likely(gpio < MAX_BLACKFIN_GPIOS)) 306 - return gpio + GPIO_IRQ_BASE; 307 - 308 - return -EINVAL; 309 - } 310 - 311 - #include <asm-generic/gpio.h> /* cansleep wrappers */ 312 - #endif /* !CONFIG_GPIOLIB */ 313 - 314 - static inline int irq_to_gpio(unsigned irq) 315 - { 316 - return (irq - GPIO_IRQ_BASE); 317 - } 318 - 319 222 #endif /* __ASSEMBLY__ */ 320 223 321 224 #endif /* __ARCH_BLACKFIN_GPIO_H__ */
+16 -1
arch/blackfin/include/asm/portmux.h
··· 17 17 #define P_MAYSHARE 0x2000 18 18 #define P_DONTCARE 0x1000 19 19 20 + #ifdef CONFIG_PINCTRL 21 + #include <asm/irq_handler.h> 20 22 23 + #define gpio_pint_regs bfin_pint_regs 24 + #define adi_internal_set_wake bfin_internal_set_wake 25 + 26 + #define peripheral_request(per, label) 0 27 + #define peripheral_free(per) 28 + #define peripheral_request_list(per, label) \ 29 + (pdev ? (IS_ERR(devm_pinctrl_get_select_default(&pdev->dev)) \ 30 + ? -EINVAL : 0) : 0) 31 + #define peripheral_free_list(per) 32 + #else 21 33 int peripheral_request(unsigned short per, const char *label); 22 34 void peripheral_free(unsigned short per); 23 35 int peripheral_request_list(const unsigned short per[], const char *label); 24 36 void peripheral_free_list(const unsigned short per[]); 37 + #endif 25 38 26 - #include <asm/gpio.h> 39 + #include <linux/err.h> 40 + #include <linux/pinctrl/pinctrl.h> 27 41 #include <mach/portmux.h> 42 + #include <linux/gpio.h> 28 43 29 44 #ifndef P_SPORT2_TFS 30 45 #define P_SPORT2_TFS P_UNDEF
+2 -1
arch/blackfin/kernel/Makefile
··· 7 7 obj-y := \ 8 8 entry.o process.o bfin_ksyms.o ptrace.o setup.o signal.o \ 9 9 sys_bfin.o traps.o irqchip.o dma-mapping.o flat.o \ 10 - fixed_code.o reboot.o bfin_gpio.o bfin_dma.o \ 10 + fixed_code.o reboot.o bfin_dma.o \ 11 11 exception.o dumpstack.o 12 12 13 13 ifeq ($(CONFIG_GENERIC_CLOCKEVENTS),y) ··· 16 16 obj-y += time.o 17 17 endif 18 18 19 + obj-$(CONFIG_GPIO_ADI) += bfin_gpio.o 19 20 obj-$(CONFIG_DYNAMIC_FTRACE) += ftrace.o 20 21 obj-$(CONFIG_FUNCTION_TRACER) += ftrace-entry.o 21 22 obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o
-2
arch/blackfin/mach-bf548/include/mach/portmux.h
··· 7 7 #ifndef _MACH_PORTMUX_H_ 8 8 #define _MACH_PORTMUX_H_ 9 9 10 - #define MAX_RESOURCES MAX_BLACKFIN_GPIOS 11 - 12 10 #define P_SPORT2_TFS (P_DEFINED | P_IDENT(GPIO_PA0) | P_FUNCT(0)) 13 11 #define P_SPORT2_DTSEC (P_DEFINED | P_IDENT(GPIO_PA1) | P_FUNCT(0)) 14 12 #define P_SPORT2_DTPRI (P_DEFINED | P_IDENT(GPIO_PA2) | P_FUNCT(0))
-2
arch/blackfin/mach-bf609/include/mach/portmux.h
··· 7 7 #ifndef _MACH_PORTMUX_H_ 8 8 #define _MACH_PORTMUX_H_ 9 9 10 - #define MAX_RESOURCES MAX_BLACKFIN_GPIOS 11 - 12 10 /* EMAC RMII Port Mux */ 13 11 #define P_MII0_MDC (P_DEFINED | P_IDENT(GPIO_PC6) | P_FUNCT(0)) 14 12 #define P_MII0_MDIO (P_DEFINED | P_IDENT(GPIO_PC7) | P_FUNCT(0))
+4
drivers/gpio/Kconfig
··· 360 360 Select this to support Aeroflex Gaisler GRGPIO cores from the GRLIB 361 361 VHDL IP core library. 362 362 363 + config GPIO_TB10X 364 + bool 365 + select OF_GPIO 366 + 363 367 comment "I2C GPIO expanders:" 364 368 365 369 config GPIO_ARIZONA
+1
drivers/gpio/Makefile
··· 71 71 obj-$(CONFIG_GPIO_STMPE) += gpio-stmpe.o 72 72 obj-$(CONFIG_GPIO_STP_XWAY) += gpio-stp-xway.o 73 73 obj-$(CONFIG_GPIO_SX150X) += gpio-sx150x.o 74 + obj-$(CONFIG_GPIO_TB10X) += gpio-tb10x.o 74 75 obj-$(CONFIG_GPIO_TC3589X) += gpio-tc3589x.o 75 76 obj-$(CONFIG_ARCH_TEGRA) += gpio-tegra.o 76 77 obj-$(CONFIG_GPIO_TIMBERDALE) += gpio-timberdale.o
+328
drivers/gpio/gpio-tb10x.c
··· 1 + /* Abilis Systems MODULE DESCRIPTION 2 + * 3 + * Copyright (C) Abilis Systems 2013 4 + * 5 + * Authors: Sascha Leuenberger <sascha.leuenberger@abilis.com> 6 + * Christian Ruppert <christian.ruppert@abilis.com> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 as 10 + * published by the Free Software Foundation. 11 + * 12 + * This program is distributed in the hope that it will be useful, 13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 + */ 21 + 22 + #include <linux/kernel.h> 23 + #include <linux/module.h> 24 + #include <linux/platform_device.h> 25 + #include <linux/gpio.h> 26 + #include <linux/slab.h> 27 + #include <linux/irq.h> 28 + #include <linux/irqdomain.h> 29 + #include <linux/interrupt.h> 30 + #include <linux/io.h> 31 + #include <linux/of.h> 32 + #include <linux/of_platform.h> 33 + #include <linux/of_gpio.h> 34 + #include <linux/spinlock.h> 35 + #include <linux/bitops.h> 36 + #include <linux/pinctrl/consumer.h> 37 + 38 + #define TB10X_GPIO_DIR_IN (0x00000000) 39 + #define TB10X_GPIO_DIR_OUT (0x00000001) 40 + #define OFFSET_TO_REG_DDR (0x00) 41 + #define OFFSET_TO_REG_DATA (0x04) 42 + #define OFFSET_TO_REG_INT_EN (0x08) 43 + #define OFFSET_TO_REG_CHANGE (0x0C) 44 + #define OFFSET_TO_REG_WRMASK (0x10) 45 + #define OFFSET_TO_REG_INT_TYPE (0x14) 46 + 47 + 48 + /** 49 + * @spinlock: used for atomic read/modify/write of registers 50 + * @base: register base address 51 + * @domain: IRQ domain of GPIO generated interrupts managed by this controller 52 + * @irq: Interrupt line of parent interrupt controller 53 + * @gc: gpio_chip structure associated to this GPIO controller 54 + */ 55 + struct tb10x_gpio { 56 + spinlock_t spinlock; 57 + void __iomem *base; 58 + struct irq_domain *domain; 59 + int irq; 60 + struct gpio_chip gc; 61 + }; 62 + 63 + static inline u32 tb10x_reg_read(struct tb10x_gpio *gpio, unsigned int offs) 64 + { 65 + return ioread32(gpio->base + offs); 66 + } 67 + 68 + static inline void tb10x_reg_write(struct tb10x_gpio *gpio, unsigned int offs, 69 + u32 val) 70 + { 71 + iowrite32(val, gpio->base + offs); 72 + } 73 + 74 + static inline void tb10x_set_bits(struct tb10x_gpio *gpio, unsigned int offs, 75 + u32 mask, u32 val) 76 + { 77 + u32 r; 78 + unsigned long flags; 79 + 80 + spin_lock_irqsave(&gpio->spinlock, flags); 81 + 82 + r = tb10x_reg_read(gpio, offs); 83 + r = (r & ~mask) | (val & mask); 84 + 85 + tb10x_reg_write(gpio, offs, r); 86 + 87 + spin_unlock_irqrestore(&gpio->spinlock, flags); 88 + } 89 + 90 + static inline struct tb10x_gpio *to_tb10x_gpio(struct gpio_chip *chip) 91 + { 92 + return container_of(chip, struct tb10x_gpio, gc); 93 + } 94 + 95 + static int tb10x_gpio_direction_in(struct gpio_chip *chip, unsigned offset) 96 + { 97 + struct tb10x_gpio *tb10x_gpio = to_tb10x_gpio(chip); 98 + int mask = BIT(offset); 99 + int val = TB10X_GPIO_DIR_IN << offset; 100 + 101 + tb10x_set_bits(tb10x_gpio, OFFSET_TO_REG_DDR, mask, val); 102 + 103 + return 0; 104 + } 105 + 106 + static int tb10x_gpio_get(struct gpio_chip *chip, unsigned offset) 107 + { 108 + struct tb10x_gpio *tb10x_gpio = to_tb10x_gpio(chip); 109 + int val; 110 + 111 + val = tb10x_reg_read(tb10x_gpio, OFFSET_TO_REG_DATA); 112 + 113 + if (val & BIT(offset)) 114 + return 1; 115 + else 116 + return 0; 117 + } 118 + 119 + static void tb10x_gpio_set(struct gpio_chip *chip, unsigned offset, int value) 120 + { 121 + struct tb10x_gpio *tb10x_gpio = to_tb10x_gpio(chip); 122 + int mask = BIT(offset); 123 + int val = value << offset; 124 + 125 + tb10x_set_bits(tb10x_gpio, OFFSET_TO_REG_DATA, mask, val); 126 + } 127 + 128 + static int tb10x_gpio_direction_out(struct gpio_chip *chip, 129 + unsigned offset, int value) 130 + { 131 + struct tb10x_gpio *tb10x_gpio = to_tb10x_gpio(chip); 132 + int mask = BIT(offset); 133 + int val = TB10X_GPIO_DIR_OUT << offset; 134 + 135 + tb10x_set_bits(tb10x_gpio, OFFSET_TO_REG_DDR, mask, val); 136 + 137 + return 0; 138 + } 139 + 140 + static int tb10x_gpio_request(struct gpio_chip *chip, unsigned offset) 141 + { 142 + return pinctrl_request_gpio(chip->base + offset); 143 + } 144 + 145 + static void tb10x_gpio_free(struct gpio_chip *chip, unsigned offset) 146 + { 147 + pinctrl_free_gpio(chip->base + offset); 148 + } 149 + 150 + static int tb10x_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 151 + { 152 + struct tb10x_gpio *tb10x_gpio = to_tb10x_gpio(chip); 153 + 154 + return irq_create_mapping(tb10x_gpio->domain, offset); 155 + } 156 + 157 + static int tb10x_gpio_irq_set_type(struct irq_data *data, unsigned int type) 158 + { 159 + if ((type & IRQF_TRIGGER_MASK) != IRQ_TYPE_EDGE_BOTH) { 160 + pr_err("Only (both) edge triggered interrupts supported.\n"); 161 + return -EINVAL; 162 + } 163 + 164 + irqd_set_trigger_type(data, type); 165 + 166 + return IRQ_SET_MASK_OK; 167 + } 168 + 169 + static irqreturn_t tb10x_gpio_irq_cascade(int irq, void *data) 170 + { 171 + struct tb10x_gpio *tb10x_gpio = data; 172 + u32 r = tb10x_reg_read(tb10x_gpio, OFFSET_TO_REG_CHANGE); 173 + u32 m = tb10x_reg_read(tb10x_gpio, OFFSET_TO_REG_INT_EN); 174 + const unsigned long bits = r & m; 175 + int i; 176 + 177 + for_each_set_bit(i, &bits, 32) 178 + generic_handle_irq(irq_find_mapping(tb10x_gpio->domain, i)); 179 + 180 + return IRQ_HANDLED; 181 + } 182 + 183 + static int tb10x_gpio_probe(struct platform_device *pdev) 184 + { 185 + struct tb10x_gpio *tb10x_gpio; 186 + struct resource *mem; 187 + struct device_node *dn = pdev->dev.of_node; 188 + int ret = -EBUSY; 189 + u32 ngpio; 190 + 191 + if (!dn) 192 + return -EINVAL; 193 + 194 + if (of_property_read_u32(dn, "abilis,ngpio", &ngpio)) 195 + return -EINVAL; 196 + 197 + mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 198 + if (!mem) { 199 + dev_err(&pdev->dev, "No memory resource defined.\n"); 200 + return -EINVAL; 201 + } 202 + 203 + tb10x_gpio = devm_kzalloc(&pdev->dev, sizeof(*tb10x_gpio), GFP_KERNEL); 204 + if (tb10x_gpio == NULL) 205 + return -ENOMEM; 206 + 207 + spin_lock_init(&tb10x_gpio->spinlock); 208 + 209 + tb10x_gpio->base = devm_ioremap_resource(&pdev->dev, mem); 210 + if (IS_ERR(tb10x_gpio->base)) 211 + return PTR_ERR(tb10x_gpio->base); 212 + 213 + tb10x_gpio->gc.label = of_node_full_name(dn); 214 + tb10x_gpio->gc.dev = &pdev->dev; 215 + tb10x_gpio->gc.owner = THIS_MODULE; 216 + tb10x_gpio->gc.direction_input = tb10x_gpio_direction_in; 217 + tb10x_gpio->gc.get = tb10x_gpio_get; 218 + tb10x_gpio->gc.direction_output = tb10x_gpio_direction_out; 219 + tb10x_gpio->gc.set = tb10x_gpio_set; 220 + tb10x_gpio->gc.request = tb10x_gpio_request; 221 + tb10x_gpio->gc.free = tb10x_gpio_free; 222 + tb10x_gpio->gc.base = -1; 223 + tb10x_gpio->gc.ngpio = ngpio; 224 + tb10x_gpio->gc.can_sleep = 0; 225 + 226 + 227 + ret = gpiochip_add(&tb10x_gpio->gc); 228 + if (ret < 0) { 229 + dev_err(&pdev->dev, "Could not add gpiochip.\n"); 230 + goto fail_gpiochip_registration; 231 + } 232 + 233 + platform_set_drvdata(pdev, tb10x_gpio); 234 + 235 + if (of_find_property(dn, "interrupt-controller", NULL)) { 236 + struct irq_chip_generic *gc; 237 + 238 + ret = platform_get_irq(pdev, 0); 239 + if (ret < 0) { 240 + dev_err(&pdev->dev, "No interrupt specified.\n"); 241 + goto fail_get_irq; 242 + } 243 + 244 + tb10x_gpio->gc.to_irq = tb10x_gpio_to_irq; 245 + tb10x_gpio->irq = ret; 246 + 247 + ret = devm_request_irq(&pdev->dev, ret, tb10x_gpio_irq_cascade, 248 + IRQF_TRIGGER_NONE | IRQF_SHARED, 249 + dev_name(&pdev->dev), tb10x_gpio); 250 + if (ret != 0) 251 + goto fail_request_irq; 252 + 253 + tb10x_gpio->domain = irq_domain_add_linear(dn, 254 + tb10x_gpio->gc.ngpio, 255 + &irq_generic_chip_ops, NULL); 256 + if (!tb10x_gpio->domain) { 257 + ret = -ENOMEM; 258 + goto fail_irq_domain; 259 + } 260 + 261 + ret = irq_alloc_domain_generic_chips(tb10x_gpio->domain, 262 + tb10x_gpio->gc.ngpio, 1, tb10x_gpio->gc.label, 263 + handle_edge_irq, IRQ_NOREQUEST, IRQ_NOPROBE, 264 + IRQ_GC_INIT_MASK_CACHE); 265 + if (ret) 266 + goto fail_irq_domain; 267 + 268 + gc = tb10x_gpio->domain->gc->gc[0]; 269 + gc->reg_base = tb10x_gpio->base; 270 + gc->chip_types[0].type = IRQ_TYPE_EDGE_BOTH; 271 + gc->chip_types[0].chip.irq_ack = irq_gc_ack_set_bit; 272 + gc->chip_types[0].chip.irq_mask = irq_gc_mask_clr_bit; 273 + gc->chip_types[0].chip.irq_unmask = irq_gc_mask_set_bit; 274 + gc->chip_types[0].chip.irq_set_type = tb10x_gpio_irq_set_type; 275 + gc->chip_types[0].regs.ack = OFFSET_TO_REG_CHANGE; 276 + gc->chip_types[0].regs.mask = OFFSET_TO_REG_INT_EN; 277 + } 278 + 279 + return 0; 280 + 281 + fail_irq_domain: 282 + fail_request_irq: 283 + fail_get_irq: 284 + gpiochip_remove(&tb10x_gpio->gc); 285 + fail_gpiochip_registration: 286 + fail_ioremap: 287 + return ret; 288 + } 289 + 290 + static int __exit tb10x_gpio_remove(struct platform_device *pdev) 291 + { 292 + struct tb10x_gpio *tb10x_gpio = platform_get_drvdata(pdev); 293 + int ret; 294 + 295 + if (tb10x_gpio->gc.to_irq) { 296 + irq_remove_generic_chip(tb10x_gpio->domain->gc->gc[0], 297 + BIT(tb10x_gpio->gc.ngpio) - 1, 0, 0); 298 + kfree(tb10x_gpio->domain->gc); 299 + irq_domain_remove(tb10x_gpio->domain); 300 + free_irq(tb10x_gpio->irq, tb10x_gpio); 301 + } 302 + ret = gpiochip_remove(&tb10x_gpio->gc); 303 + if (ret) 304 + return ret; 305 + 306 + return 0; 307 + } 308 + 309 + static const struct of_device_id tb10x_gpio_dt_ids[] = { 310 + { .compatible = "abilis,tb10x-gpio" }, 311 + { } 312 + }; 313 + MODULE_DEVICE_TABLE(of, tb10x_gpio_dt_ids); 314 + 315 + static struct platform_driver tb10x_gpio_driver = { 316 + .probe = tb10x_gpio_probe, 317 + .remove = tb10x_gpio_remove, 318 + .driver = { 319 + .name = "tb10x-gpio", 320 + .of_match_table = of_match_ptr(tb10x_gpio_dt_ids), 321 + .owner = THIS_MODULE, 322 + } 323 + }; 324 + 325 + module_platform_driver(tb10x_gpio_driver); 326 + MODULE_LICENSE("GPL"); 327 + MODULE_DESCRIPTION("tb10x gpio."); 328 + MODULE_VERSION("0.0.1");
+54 -7
drivers/gpio/gpiolib-of.c
··· 190 190 struct of_phandle_args pinspec; 191 191 struct pinctrl_dev *pctldev; 192 192 int index = 0, ret; 193 + const char *name; 194 + static const char group_names_propname[] = "gpio-ranges-group-names"; 195 + struct property *group_names; 193 196 194 197 if (!np) 195 198 return; 199 + 200 + group_names = of_find_property(np, group_names_propname, NULL); 196 201 197 202 for (;; index++) { 198 203 ret = of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, ··· 209 204 if (!pctldev) 210 205 break; 211 206 212 - ret = gpiochip_add_pin_range(chip, 213 - pinctrl_dev_get_devname(pctldev), 214 - pinspec.args[0], 215 - pinspec.args[1], 216 - pinspec.args[2]); 207 + if (pinspec.args[2]) { 208 + if (group_names) { 209 + ret = of_property_read_string_index(np, 210 + group_names_propname, 211 + index, &name); 212 + if (strlen(name)) { 213 + pr_err("%s: Group name of numeric GPIO ranges must be the empty string.\n", 214 + np->full_name); 215 + break; 216 + } 217 + } 218 + /* npins != 0: linear range */ 219 + ret = gpiochip_add_pin_range(chip, 220 + pinctrl_dev_get_devname(pctldev), 221 + pinspec.args[0], 222 + pinspec.args[1], 223 + pinspec.args[2]); 224 + if (ret) 225 + break; 226 + } else { 227 + /* npins == 0: special range */ 228 + if (pinspec.args[1]) { 229 + pr_err("%s: Illegal gpio-range format.\n", 230 + np->full_name); 231 + break; 232 + } 217 233 218 - if (ret) 219 - break; 234 + if (!group_names) { 235 + pr_err("%s: GPIO group range requested but no %s property.\n", 236 + np->full_name, group_names_propname); 237 + break; 238 + } 239 + 240 + ret = of_property_read_string_index(np, 241 + group_names_propname, 242 + index, &name); 243 + if (ret) 244 + break; 245 + 246 + if (!strlen(name)) { 247 + pr_err("%s: Group name of GPIO group range cannot be the empty string.\n", 248 + np->full_name); 249 + break; 250 + } 251 + 252 + ret = gpiochip_add_pingroup_range(chip, pctldev, 253 + pinspec.args[0], name); 254 + if (ret) 255 + break; 256 + } 220 257 } 221 258 } 222 259
+47
drivers/gpio/gpiolib.c
··· 1320 1320 #ifdef CONFIG_PINCTRL 1321 1321 1322 1322 /** 1323 + * gpiochip_add_pingroup_range() - add a range for GPIO <-> pin mapping 1324 + * @chip: the gpiochip to add the range for 1325 + * @pinctrl: the dev_name() of the pin controller to map to 1326 + * @gpio_offset: the start offset in the current gpio_chip number space 1327 + * @pin_group: name of the pin group inside the pin controller 1328 + */ 1329 + int gpiochip_add_pingroup_range(struct gpio_chip *chip, 1330 + struct pinctrl_dev *pctldev, 1331 + unsigned int gpio_offset, const char *pin_group) 1332 + { 1333 + struct gpio_pin_range *pin_range; 1334 + int ret; 1335 + 1336 + pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL); 1337 + if (!pin_range) { 1338 + pr_err("%s: GPIO chip: failed to allocate pin ranges\n", 1339 + chip->label); 1340 + return -ENOMEM; 1341 + } 1342 + 1343 + /* Use local offset as range ID */ 1344 + pin_range->range.id = gpio_offset; 1345 + pin_range->range.gc = chip; 1346 + pin_range->range.name = chip->label; 1347 + pin_range->range.base = chip->base + gpio_offset; 1348 + pin_range->pctldev = pctldev; 1349 + 1350 + ret = pinctrl_get_group_pins(pctldev, pin_group, 1351 + &pin_range->range.pins, 1352 + &pin_range->range.npins); 1353 + if (ret < 0) 1354 + return ret; 1355 + 1356 + pinctrl_add_gpio_range(pctldev, &pin_range->range); 1357 + 1358 + pr_debug("GPIO chip %s: created GPIO range %d->%d ==> %s PINGRP %s\n", 1359 + chip->label, gpio_offset, 1360 + gpio_offset + pin_range->range.npins - 1, 1361 + pinctrl_dev_get_devname(pctldev), pin_group); 1362 + 1363 + list_add_tail(&pin_range->node, &chip->pin_ranges); 1364 + 1365 + return 0; 1366 + } 1367 + EXPORT_SYMBOL_GPL(gpiochip_add_pingroup_range); 1368 + 1369 + /** 1323 1370 * gpiochip_add_pin_range() - add a range for GPIO <-> pin mapping 1324 1371 * @chip: the gpiochip to add the range for 1325 1372 * @pinctrl_name: the dev_name() of the pin controller to map to
+54
drivers/pinctrl/Kconfig
··· 49 49 bool "AB8505 pin controller driver" 50 50 depends on PINCTRL_ABX500 && ARCH_U8500 51 51 52 + config PINCTRL_ADI2 53 + bool "ADI pin controller driver" 54 + depends on BLACKFIN 55 + select PINMUX 56 + select IRQ_DOMAIN 57 + help 58 + This is the pin controller and gpio driver for ADI BF54x, BF60x and 59 + future processors. This option is selected automatically when specific 60 + machine and arch are selected to build. 61 + 62 + config PINCTRL_AS3722 63 + bool "Pinctrl and GPIO driver for ams AS3722 PMIC" 64 + depends on MFD_AS3722 && GPIOLIB 65 + select PINMUX 66 + select GENERIC_PINCONF 67 + help 68 + AS3722 device supports the configuration of GPIO pins for different 69 + functionality. This driver supports the pinmux, push-pull and 70 + open drain configuration for the GPIO pins of AS3722 devices. It also 71 + supports the GPIO functionality through gpiolib. 72 + 73 + config PINCTRL_BF54x 74 + def_bool y if BF54x 75 + select PINCTRL_ADI2 76 + 77 + config PINCTRL_BF60x 78 + def_bool y if BF60x 79 + select PINCTRL_ADI2 80 + 52 81 config PINCTRL_AT91 53 82 bool "AT91 pinctrl driver" 54 83 depends on OF ··· 109 80 select PINMUX 110 81 select PINCONF 111 82 83 + config PINCTRL_IMX1_CORE 84 + bool 85 + select PINMUX 86 + select PINCONF 87 + 88 + config PINCTRL_IMX27 89 + bool "IMX27 pinctrl driver" 90 + depends on OF 91 + depends on SOC_IMX27 92 + select PINCTRL_IMX1_CORE 93 + help 94 + Say Y here to enable the imx27 pinctrl driver 95 + 112 96 config PINCTRL_IMX35 113 97 bool "IMX35 pinctrl driver" 114 98 depends on OF ··· 129 87 select PINCTRL_IMX 130 88 help 131 89 Say Y here to enable the imx35 pinctrl driver 90 + 91 + config PINCTRL_IMX50 92 + bool "IMX50 pinctrl driver" 93 + depends on OF 94 + depends on SOC_IMX50 95 + select PINCTRL_IMX 96 + help 97 + Say Y here to enable the imx50 pinctrl driver 132 98 133 99 config PINCTRL_IMX51 134 100 bool "IMX51 pinctrl driver" ··· 341 291 bool 342 292 depends on SOC_TYPE_XWAY 343 293 depends on PINCTRL_LANTIQ 294 + 295 + config PINCTRL_TB10X 296 + bool 297 + depends on ARC_PLAT_TB10X 344 298 345 299 endmenu 346 300
+8
drivers/pinctrl/Makefile
··· 14 14 obj-$(CONFIG_PINCTRL_AB8540) += pinctrl-ab8540.o 15 15 obj-$(CONFIG_PINCTRL_AB9540) += pinctrl-ab9540.o 16 16 obj-$(CONFIG_PINCTRL_AB8505) += pinctrl-ab8505.o 17 + obj-$(CONFIG_PINCTRL_ADI2) += pinctrl-adi2.o 18 + obj-$(CONFIG_PINCTRL_AS3722) += pinctrl-as3722.o 19 + obj-$(CONFIG_PINCTRL_BF54x) += pinctrl-adi2-bf54x.o 20 + obj-$(CONFIG_PINCTRL_BF60x) += pinctrl-adi2-bf60x.o 17 21 obj-$(CONFIG_PINCTRL_AT91) += pinctrl-at91.o 18 22 obj-$(CONFIG_PINCTRL_BCM2835) += pinctrl-bcm2835.o 19 23 obj-$(CONFIG_PINCTRL_BAYTRAIL) += pinctrl-baytrail.o 20 24 obj-$(CONFIG_PINCTRL_IMX) += pinctrl-imx.o 25 + obj-$(CONFIG_PINCTRL_IMX1_CORE) += pinctrl-imx1-core.o 26 + obj-$(CONFIG_PINCTRL_IMX27) += pinctrl-imx27.o 21 27 obj-$(CONFIG_PINCTRL_IMX35) += pinctrl-imx35.o 28 + obj-$(CONFIG_PINCTRL_IMX50) += pinctrl-imx50.o 22 29 obj-$(CONFIG_PINCTRL_IMX51) += pinctrl-imx51.o 23 30 obj-$(CONFIG_PINCTRL_IMX53) += pinctrl-imx53.o 24 31 obj-$(CONFIG_PINCTRL_IMX6Q) += pinctrl-imx6q.o ··· 59 52 obj-$(CONFIG_PINCTRL_S3C64XX) += pinctrl-s3c64xx.o 60 53 obj-$(CONFIG_PINCTRL_XWAY) += pinctrl-xway.o 61 54 obj-$(CONFIG_PINCTRL_LANTIQ) += pinctrl-lantiq.o 55 + obj-$(CONFIG_PINCTRL_TB10X) += pinctrl-tb10x.o 62 56 obj-$(CONFIG_PINCTRL_ST) += pinctrl-st.o 63 57 obj-$(CONFIG_PINCTRL_VF610) += pinctrl-vf610.o 64 58
+14
drivers/pinctrl/core.c
··· 462 462 } 463 463 EXPORT_SYMBOL_GPL(pinctrl_find_and_add_gpio_range); 464 464 465 + int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group, 466 + const unsigned **pins, unsigned *num_pins) 467 + { 468 + const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; 469 + int gs; 470 + 471 + gs = pinctrl_get_group_selector(pctldev, pin_group); 472 + if (gs < 0) 473 + return gs; 474 + 475 + return pctlops->get_group_pins(pctldev, gs, pins, num_pins); 476 + } 477 + EXPORT_SYMBOL_GPL(pinctrl_get_group_pins); 478 + 465 479 /** 466 480 * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin 467 481 * @pctldev: the pin controller device to look in
+1 -1
drivers/pinctrl/mvebu/pinctrl-armada-370.c
··· 408 408 .driver = { 409 409 .name = "armada-370-pinctrl", 410 410 .owner = THIS_MODULE, 411 - .of_match_table = of_match_ptr(armada_370_pinctrl_of_match), 411 + .of_match_table = armada_370_pinctrl_of_match, 412 412 }, 413 413 .probe = armada_370_pinctrl_probe, 414 414 .remove = armada_370_pinctrl_remove,
+1 -1
drivers/pinctrl/mvebu/pinctrl-armada-xp.c
··· 455 455 .driver = { 456 456 .name = "armada-xp-pinctrl", 457 457 .owner = THIS_MODULE, 458 - .of_match_table = of_match_ptr(armada_xp_pinctrl_of_match), 458 + .of_match_table = armada_xp_pinctrl_of_match, 459 459 }, 460 460 .probe = armada_xp_pinctrl_probe, 461 461 .remove = armada_xp_pinctrl_remove,
+2 -2
drivers/pinctrl/mvebu/pinctrl-dove.c
··· 335 335 unsigned long gcfg2 = readl(DOVE_GLOBAL_CONFIG_2); 336 336 337 337 gcfg1 &= ~DOVE_TWSI_ENABLE_OPTION1; 338 - gcfg2 &= ~(DOVE_TWSI_ENABLE_OPTION2 | DOVE_TWSI_ENABLE_OPTION2); 338 + gcfg2 &= ~(DOVE_TWSI_ENABLE_OPTION2 | DOVE_TWSI_ENABLE_OPTION3); 339 339 340 340 switch (config) { 341 341 case 1: ··· 806 806 .driver = { 807 807 .name = "dove-pinctrl", 808 808 .owner = THIS_MODULE, 809 - .of_match_table = of_match_ptr(dove_pinctrl_of_match), 809 + .of_match_table = dove_pinctrl_of_match, 810 810 }, 811 811 .probe = dove_pinctrl_probe, 812 812 .remove = dove_pinctrl_remove,
+1 -1
drivers/pinctrl/mvebu/pinctrl-kirkwood.c
··· 471 471 .driver = { 472 472 .name = "kirkwood-pinctrl", 473 473 .owner = THIS_MODULE, 474 - .of_match_table = of_match_ptr(kirkwood_pinctrl_of_match), 474 + .of_match_table = kirkwood_pinctrl_of_match, 475 475 }, 476 476 .probe = kirkwood_pinctrl_probe, 477 477 .remove = kirkwood_pinctrl_remove,
+592
drivers/pinctrl/pinctrl-adi2-bf54x.c
··· 1 + /* 2 + * Pinctrl Driver for ADI GPIO2 controller 3 + * 4 + * Copyright 2007-2013 Analog Devices Inc. 5 + * 6 + * Licensed under the GPLv2 or later 7 + */ 8 + 9 + #include <asm/portmux.h> 10 + #include "pinctrl-adi2.h" 11 + 12 + static const struct pinctrl_pin_desc adi_pads[] = { 13 + PINCTRL_PIN(0, "PA0"), 14 + PINCTRL_PIN(1, "PA1"), 15 + PINCTRL_PIN(2, "PA2"), 16 + PINCTRL_PIN(3, "PG3"), 17 + PINCTRL_PIN(4, "PA4"), 18 + PINCTRL_PIN(5, "PA5"), 19 + PINCTRL_PIN(6, "PA6"), 20 + PINCTRL_PIN(7, "PA7"), 21 + PINCTRL_PIN(8, "PA8"), 22 + PINCTRL_PIN(9, "PA9"), 23 + PINCTRL_PIN(10, "PA10"), 24 + PINCTRL_PIN(11, "PA11"), 25 + PINCTRL_PIN(12, "PA12"), 26 + PINCTRL_PIN(13, "PA13"), 27 + PINCTRL_PIN(14, "PA14"), 28 + PINCTRL_PIN(15, "PA15"), 29 + PINCTRL_PIN(16, "PB0"), 30 + PINCTRL_PIN(17, "PB1"), 31 + PINCTRL_PIN(18, "PB2"), 32 + PINCTRL_PIN(19, "PB3"), 33 + PINCTRL_PIN(20, "PB4"), 34 + PINCTRL_PIN(21, "PB5"), 35 + PINCTRL_PIN(22, "PB6"), 36 + PINCTRL_PIN(23, "PB7"), 37 + PINCTRL_PIN(24, "PB8"), 38 + PINCTRL_PIN(25, "PB9"), 39 + PINCTRL_PIN(26, "PB10"), 40 + PINCTRL_PIN(27, "PB11"), 41 + PINCTRL_PIN(28, "PB12"), 42 + PINCTRL_PIN(29, "PB13"), 43 + PINCTRL_PIN(30, "PB14"), 44 + PINCTRL_PIN(32, "PC0"), 45 + PINCTRL_PIN(33, "PC1"), 46 + PINCTRL_PIN(34, "PC2"), 47 + PINCTRL_PIN(35, "PC3"), 48 + PINCTRL_PIN(36, "PC4"), 49 + PINCTRL_PIN(37, "PC5"), 50 + PINCTRL_PIN(38, "PC6"), 51 + PINCTRL_PIN(39, "PC7"), 52 + PINCTRL_PIN(40, "PC8"), 53 + PINCTRL_PIN(41, "PC9"), 54 + PINCTRL_PIN(42, "PC10"), 55 + PINCTRL_PIN(43, "PC11"), 56 + PINCTRL_PIN(44, "PC12"), 57 + PINCTRL_PIN(45, "PC13"), 58 + PINCTRL_PIN(48, "PD0"), 59 + PINCTRL_PIN(49, "PD1"), 60 + PINCTRL_PIN(50, "PD2"), 61 + PINCTRL_PIN(51, "PD3"), 62 + PINCTRL_PIN(52, "PD4"), 63 + PINCTRL_PIN(53, "PD5"), 64 + PINCTRL_PIN(54, "PD6"), 65 + PINCTRL_PIN(55, "PD7"), 66 + PINCTRL_PIN(56, "PD8"), 67 + PINCTRL_PIN(57, "PD9"), 68 + PINCTRL_PIN(58, "PD10"), 69 + PINCTRL_PIN(59, "PD11"), 70 + PINCTRL_PIN(60, "PD12"), 71 + PINCTRL_PIN(61, "PD13"), 72 + PINCTRL_PIN(62, "PD14"), 73 + PINCTRL_PIN(63, "PD15"), 74 + PINCTRL_PIN(64, "PE0"), 75 + PINCTRL_PIN(65, "PE1"), 76 + PINCTRL_PIN(66, "PE2"), 77 + PINCTRL_PIN(67, "PE3"), 78 + PINCTRL_PIN(68, "PE4"), 79 + PINCTRL_PIN(69, "PE5"), 80 + PINCTRL_PIN(70, "PE6"), 81 + PINCTRL_PIN(71, "PE7"), 82 + PINCTRL_PIN(72, "PE8"), 83 + PINCTRL_PIN(73, "PE9"), 84 + PINCTRL_PIN(74, "PE10"), 85 + PINCTRL_PIN(75, "PE11"), 86 + PINCTRL_PIN(76, "PE12"), 87 + PINCTRL_PIN(77, "PE13"), 88 + PINCTRL_PIN(78, "PE14"), 89 + PINCTRL_PIN(79, "PE15"), 90 + PINCTRL_PIN(80, "PF0"), 91 + PINCTRL_PIN(81, "PF1"), 92 + PINCTRL_PIN(82, "PF2"), 93 + PINCTRL_PIN(83, "PF3"), 94 + PINCTRL_PIN(84, "PF4"), 95 + PINCTRL_PIN(85, "PF5"), 96 + PINCTRL_PIN(86, "PF6"), 97 + PINCTRL_PIN(87, "PF7"), 98 + PINCTRL_PIN(88, "PF8"), 99 + PINCTRL_PIN(89, "PF9"), 100 + PINCTRL_PIN(90, "PF10"), 101 + PINCTRL_PIN(91, "PF11"), 102 + PINCTRL_PIN(92, "PF12"), 103 + PINCTRL_PIN(93, "PF13"), 104 + PINCTRL_PIN(94, "PF14"), 105 + PINCTRL_PIN(95, "PF15"), 106 + PINCTRL_PIN(96, "PG0"), 107 + PINCTRL_PIN(97, "PG1"), 108 + PINCTRL_PIN(98, "PG2"), 109 + PINCTRL_PIN(99, "PG3"), 110 + PINCTRL_PIN(100, "PG4"), 111 + PINCTRL_PIN(101, "PG5"), 112 + PINCTRL_PIN(102, "PG6"), 113 + PINCTRL_PIN(103, "PG7"), 114 + PINCTRL_PIN(104, "PG8"), 115 + PINCTRL_PIN(105, "PG9"), 116 + PINCTRL_PIN(106, "PG10"), 117 + PINCTRL_PIN(107, "PG11"), 118 + PINCTRL_PIN(108, "PG12"), 119 + PINCTRL_PIN(109, "PG13"), 120 + PINCTRL_PIN(110, "PG14"), 121 + PINCTRL_PIN(111, "PG15"), 122 + PINCTRL_PIN(112, "PH0"), 123 + PINCTRL_PIN(113, "PH1"), 124 + PINCTRL_PIN(114, "PH2"), 125 + PINCTRL_PIN(115, "PH3"), 126 + PINCTRL_PIN(116, "PH4"), 127 + PINCTRL_PIN(117, "PH5"), 128 + PINCTRL_PIN(118, "PH6"), 129 + PINCTRL_PIN(119, "PH7"), 130 + PINCTRL_PIN(120, "PH8"), 131 + PINCTRL_PIN(121, "PH9"), 132 + PINCTRL_PIN(122, "PH10"), 133 + PINCTRL_PIN(123, "PH11"), 134 + PINCTRL_PIN(124, "PH12"), 135 + PINCTRL_PIN(125, "PH13"), 136 + PINCTRL_PIN(128, "PI0"), 137 + PINCTRL_PIN(129, "PI1"), 138 + PINCTRL_PIN(130, "PI2"), 139 + PINCTRL_PIN(131, "PI3"), 140 + PINCTRL_PIN(132, "PI4"), 141 + PINCTRL_PIN(133, "PI5"), 142 + PINCTRL_PIN(134, "PI6"), 143 + PINCTRL_PIN(135, "PI7"), 144 + PINCTRL_PIN(136, "PI8"), 145 + PINCTRL_PIN(137, "PI9"), 146 + PINCTRL_PIN(138, "PI10"), 147 + PINCTRL_PIN(139, "PI11"), 148 + PINCTRL_PIN(140, "PI12"), 149 + PINCTRL_PIN(141, "PI13"), 150 + PINCTRL_PIN(142, "PI14"), 151 + PINCTRL_PIN(143, "PI15"), 152 + PINCTRL_PIN(144, "PJ0"), 153 + PINCTRL_PIN(145, "PJ1"), 154 + PINCTRL_PIN(146, "PJ2"), 155 + PINCTRL_PIN(147, "PJ3"), 156 + PINCTRL_PIN(148, "PJ4"), 157 + PINCTRL_PIN(149, "PJ5"), 158 + PINCTRL_PIN(150, "PJ6"), 159 + PINCTRL_PIN(151, "PJ7"), 160 + PINCTRL_PIN(152, "PJ8"), 161 + PINCTRL_PIN(153, "PJ9"), 162 + PINCTRL_PIN(154, "PJ10"), 163 + PINCTRL_PIN(155, "PJ11"), 164 + PINCTRL_PIN(156, "PJ12"), 165 + PINCTRL_PIN(157, "PJ13"), 166 + }; 167 + 168 + static const unsigned uart0_pins[] = { 169 + GPIO_PE7, GPIO_PE8, 170 + }; 171 + 172 + static const unsigned uart1_pins[] = { 173 + GPIO_PH0, GPIO_PH1, 174 + }; 175 + 176 + static const unsigned uart1_ctsrts_pins[] = { 177 + GPIO_PE9, GPIO_PE10, 178 + }; 179 + 180 + static const unsigned uart2_pins[] = { 181 + GPIO_PB4, GPIO_PB5, 182 + }; 183 + 184 + static const unsigned uart3_pins[] = { 185 + GPIO_PB6, GPIO_PB7, 186 + }; 187 + 188 + static const unsigned uart3_ctsrts_pins[] = { 189 + GPIO_PB2, GPIO_PB3, 190 + }; 191 + 192 + static const unsigned rsi0_pins[] = { 193 + GPIO_PC8, GPIO_PC9, GPIO_PC10, GPIO_PC11, GPIO_PC12, GPIO_PC13, 194 + }; 195 + 196 + static const unsigned spi0_pins[] = { 197 + GPIO_PE0, GPIO_PE1, GPIO_PE2, 198 + }; 199 + 200 + static const unsigned spi1_pins[] = { 201 + GPIO_PG8, GPIO_PG9, GPIO_PG10, 202 + }; 203 + 204 + static const unsigned twi0_pins[] = { 205 + GPIO_PE14, GPIO_PE15, 206 + }; 207 + 208 + static const unsigned twi1_pins[] = { 209 + GPIO_PB0, GPIO_PB1, 210 + }; 211 + 212 + static const unsigned rotary_pins[] = { 213 + GPIO_PH4, GPIO_PH3, GPIO_PH5, 214 + }; 215 + 216 + static const unsigned can0_pins[] = { 217 + GPIO_PG13, GPIO_PG12, 218 + }; 219 + 220 + static const unsigned can1_pins[] = { 221 + GPIO_PG14, GPIO_PG15, 222 + }; 223 + 224 + static const unsigned smc0_pins[] = { 225 + GPIO_PH8, GPIO_PH9, GPIO_PH10, GPIO_PH11, GPIO_PH12, GPIO_PH13, 226 + GPIO_PI0, GPIO_PI1, GPIO_PI2, GPIO_PI3, GPIO_PI4, GPIO_PI5, GPIO_PI6, 227 + GPIO_PI7, GPIO_PI8, GPIO_PI9, GPIO_PI10, GPIO_PI11, 228 + GPIO_PI12, GPIO_PI13, GPIO_PI14, GPIO_PI15, 229 + }; 230 + 231 + static const unsigned sport0_pins[] = { 232 + GPIO_PC0, GPIO_PC2, GPIO_PC3, GPIO_PC4, GPIO_PC6, GPIO_PC7, 233 + }; 234 + 235 + static const unsigned sport1_pins[] = { 236 + GPIO_PD0, GPIO_PD2, GPIO_PD3, GPIO_PD4, GPIO_PD6, GPIO_PD7, 237 + }; 238 + 239 + static const unsigned sport2_pins[] = { 240 + GPIO_PA0, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA6, GPIO_PA7, 241 + }; 242 + 243 + static const unsigned sport3_pins[] = { 244 + GPIO_PA8, GPIO_PA10, GPIO_PA11, GPIO_PA12, GPIO_PA14, GPIO_PA15, 245 + }; 246 + 247 + static const unsigned ppi0_8b_pins[] = { 248 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 249 + GPIO_PF7, GPIO_PF13, GPIO_PG0, GPIO_PG1, GPIO_PG2, 250 + }; 251 + 252 + static const unsigned ppi0_16b_pins[] = { 253 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 254 + GPIO_PF7, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, 255 + GPIO_PF13, GPIO_PF14, GPIO_PF15, 256 + GPIO_PG0, GPIO_PG1, GPIO_PG2, 257 + }; 258 + 259 + static const unsigned ppi0_24b_pins[] = { 260 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 261 + GPIO_PF7, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, 262 + GPIO_PF13, GPIO_PF14, GPIO_PF15, GPIO_PD0, GPIO_PD1, GPIO_PD2, 263 + GPIO_PD3, GPIO_PD4, GPIO_PD5, GPIO_PG3, GPIO_PG4, 264 + GPIO_PG0, GPIO_PG1, GPIO_PG2, 265 + }; 266 + 267 + static const unsigned ppi1_8b_pins[] = { 268 + GPIO_PD0, GPIO_PD1, GPIO_PD2, GPIO_PD3, GPIO_PD4, GPIO_PD5, GPIO_PD6, 269 + GPIO_PD7, GPIO_PE11, GPIO_PE12, GPIO_PE13, 270 + }; 271 + 272 + static const unsigned ppi1_16b_pins[] = { 273 + GPIO_PD0, GPIO_PD1, GPIO_PD2, GPIO_PD3, GPIO_PD4, GPIO_PD5, GPIO_PD6, 274 + GPIO_PD7, GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, GPIO_PD12, 275 + GPIO_PD13, GPIO_PD14, GPIO_PD15, 276 + GPIO_PE11, GPIO_PE12, GPIO_PE13, 277 + }; 278 + 279 + static const unsigned ppi2_8b_pins[] = { 280 + GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, GPIO_PD12, 281 + GPIO_PD13, GPIO_PD14, GPIO_PD15, 282 + GPIO_PA7, GPIO_PB0, GPIO_PB1, GPIO_PB2, GPIO_PB3, 283 + }; 284 + 285 + static const unsigned atapi_pins[] = { 286 + GPIO_PH2, GPIO_PJ3, GPIO_PJ4, GPIO_PJ5, GPIO_PJ6, 287 + GPIO_PJ7, GPIO_PJ8, GPIO_PJ9, GPIO_PJ10, 288 + }; 289 + 290 + static const unsigned atapi_alter_pins[] = { 291 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 292 + GPIO_PF7, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, 293 + GPIO_PF13, GPIO_PF14, GPIO_PF15, GPIO_PG2, GPIO_PG3, GPIO_PG4, 294 + }; 295 + 296 + static const unsigned nfc0_pins[] = { 297 + GPIO_PJ1, GPIO_PJ2, 298 + }; 299 + 300 + static const unsigned keys_4x4_pins[] = { 301 + GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, 302 + GPIO_PD12, GPIO_PD13, GPIO_PD14, GPIO_PD15, 303 + }; 304 + 305 + static const unsigned keys_8x8_pins[] = { 306 + GPIO_PD8, GPIO_PD9, GPIO_PD10, GPIO_PD11, 307 + GPIO_PD12, GPIO_PD13, GPIO_PD14, GPIO_PD15, 308 + GPIO_PE0, GPIO_PE1, GPIO_PE2, GPIO_PE3, 309 + GPIO_PE4, GPIO_PE5, GPIO_PE6, GPIO_PE7, 310 + }; 311 + 312 + static const struct adi_pin_group adi_pin_groups[] = { 313 + ADI_PIN_GROUP("uart0grp", uart0_pins), 314 + ADI_PIN_GROUP("uart1grp", uart1_pins), 315 + ADI_PIN_GROUP("uart1ctsrtsgrp", uart1_ctsrts_pins), 316 + ADI_PIN_GROUP("uart2grp", uart2_pins), 317 + ADI_PIN_GROUP("uart3grp", uart3_pins), 318 + ADI_PIN_GROUP("uart3ctsrtsgrp", uart3_ctsrts_pins), 319 + ADI_PIN_GROUP("rsi0grp", rsi0_pins), 320 + ADI_PIN_GROUP("spi0grp", spi0_pins), 321 + ADI_PIN_GROUP("spi1grp", spi1_pins), 322 + ADI_PIN_GROUP("twi0grp", twi0_pins), 323 + ADI_PIN_GROUP("twi1grp", twi1_pins), 324 + ADI_PIN_GROUP("rotarygrp", rotary_pins), 325 + ADI_PIN_GROUP("can0grp", can0_pins), 326 + ADI_PIN_GROUP("can1grp", can1_pins), 327 + ADI_PIN_GROUP("smc0grp", smc0_pins), 328 + ADI_PIN_GROUP("sport0grp", sport0_pins), 329 + ADI_PIN_GROUP("sport1grp", sport1_pins), 330 + ADI_PIN_GROUP("sport2grp", sport2_pins), 331 + ADI_PIN_GROUP("sport3grp", sport3_pins), 332 + ADI_PIN_GROUP("ppi0_8bgrp", ppi0_8b_pins), 333 + ADI_PIN_GROUP("ppi0_16bgrp", ppi0_16b_pins), 334 + ADI_PIN_GROUP("ppi0_24bgrp", ppi0_24b_pins), 335 + ADI_PIN_GROUP("ppi1_8bgrp", ppi1_8b_pins), 336 + ADI_PIN_GROUP("ppi1_16bgrp", ppi1_16b_pins), 337 + ADI_PIN_GROUP("ppi2_8bgrp", ppi2_8b_pins), 338 + ADI_PIN_GROUP("atapigrp", atapi_pins), 339 + ADI_PIN_GROUP("atapialtergrp", atapi_alter_pins), 340 + ADI_PIN_GROUP("nfc0grp", nfc0_pins), 341 + ADI_PIN_GROUP("keys_4x4grp", keys_4x4_pins), 342 + ADI_PIN_GROUP("keys_8x8grp", keys_8x8_pins), 343 + }; 344 + 345 + static const unsigned short uart0_mux[] = { 346 + P_UART0_TX, P_UART0_RX, 347 + 0 348 + }; 349 + 350 + static const unsigned short uart1_mux[] = { 351 + P_UART1_TX, P_UART1_RX, 352 + 0 353 + }; 354 + 355 + static const unsigned short uart1_ctsrts_mux[] = { 356 + P_UART1_RTS, P_UART1_CTS, 357 + 0 358 + }; 359 + 360 + static const unsigned short uart2_mux[] = { 361 + P_UART2_TX, P_UART2_RX, 362 + 0 363 + }; 364 + 365 + static const unsigned short uart3_mux[] = { 366 + P_UART3_TX, P_UART3_RX, 367 + 0 368 + }; 369 + 370 + static const unsigned short uart3_ctsrts_mux[] = { 371 + P_UART3_RTS, P_UART3_CTS, 372 + 0 373 + }; 374 + 375 + static const unsigned short rsi0_mux[] = { 376 + P_SD_D0, P_SD_D1, P_SD_D2, P_SD_D3, P_SD_CLK, P_SD_CMD, 377 + 0 378 + }; 379 + 380 + static const unsigned short spi0_mux[] = { 381 + P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0 382 + }; 383 + 384 + static const unsigned short spi1_mux[] = { 385 + P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0 386 + }; 387 + 388 + static const unsigned short twi0_mux[] = { 389 + P_TWI0_SCL, P_TWI0_SDA, 0 390 + }; 391 + 392 + static const unsigned short twi1_mux[] = { 393 + P_TWI1_SCL, P_TWI1_SDA, 0 394 + }; 395 + 396 + static const unsigned short rotary_mux[] = { 397 + P_CNT_CUD, P_CNT_CDG, P_CNT_CZM, 0 398 + }; 399 + 400 + static const unsigned short sport0_mux[] = { 401 + P_SPORT0_TFS, P_SPORT0_DTPRI, P_SPORT0_TSCLK, P_SPORT0_RFS, 402 + P_SPORT0_DRPRI, P_SPORT0_RSCLK, 0 403 + }; 404 + 405 + static const unsigned short sport1_mux[] = { 406 + P_SPORT1_TFS, P_SPORT1_DTPRI, P_SPORT1_TSCLK, P_SPORT1_RFS, 407 + P_SPORT1_DRPRI, P_SPORT1_RSCLK, 0 408 + }; 409 + 410 + static const unsigned short sport2_mux[] = { 411 + P_SPORT2_TFS, P_SPORT2_DTPRI, P_SPORT2_TSCLK, P_SPORT2_RFS, 412 + P_SPORT2_DRPRI, P_SPORT2_RSCLK, 0 413 + }; 414 + 415 + static const unsigned short sport3_mux[] = { 416 + P_SPORT3_TFS, P_SPORT3_DTPRI, P_SPORT3_TSCLK, P_SPORT3_RFS, 417 + P_SPORT3_DRPRI, P_SPORT3_RSCLK, 0 418 + }; 419 + 420 + static const unsigned short can0_mux[] = { 421 + P_CAN0_RX, P_CAN0_TX, 0 422 + }; 423 + 424 + static const unsigned short can1_mux[] = { 425 + P_CAN1_RX, P_CAN1_TX, 0 426 + }; 427 + 428 + static const unsigned short smc0_mux[] = { 429 + P_A4, P_A5, P_A6, P_A7, P_A8, P_A9, P_A10, P_A11, P_A12, 430 + P_A13, P_A14, P_A15, P_A16, P_A17, P_A18, P_A19, P_A20, P_A21, 431 + P_A22, P_A23, P_A24, P_A25, P_NOR_CLK, 0, 432 + }; 433 + 434 + static const unsigned short ppi0_8b_mux[] = { 435 + P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 436 + P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 437 + P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 438 + 0, 439 + }; 440 + 441 + static const unsigned short ppi0_16b_mux[] = { 442 + P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 443 + P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 444 + P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, 445 + P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, 446 + P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 447 + 0, 448 + }; 449 + 450 + static const unsigned short ppi0_24b_mux[] = { 451 + P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 452 + P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 453 + P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, 454 + P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, 455 + P_PPI0_D16, P_PPI0_D17, P_PPI0_D18, P_PPI0_D19, 456 + P_PPI0_D20, P_PPI0_D21, P_PPI0_D22, P_PPI0_D23, 457 + P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 458 + 0, 459 + }; 460 + 461 + static const unsigned short ppi1_8b_mux[] = { 462 + P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, 463 + P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, 464 + P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, 465 + 0, 466 + }; 467 + 468 + static const unsigned short ppi1_16b_mux[] = { 469 + P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, 470 + P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, 471 + P_PPI1_D8, P_PPI1_D9, P_PPI1_D10, P_PPI1_D11, 472 + P_PPI1_D12, P_PPI1_D13, P_PPI1_D14, P_PPI1_D15, 473 + P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, 474 + 0, 475 + }; 476 + 477 + static const unsigned short ppi2_8b_mux[] = { 478 + P_PPI2_D0, P_PPI2_D1, P_PPI2_D2, P_PPI2_D3, 479 + P_PPI2_D4, P_PPI2_D5, P_PPI2_D6, P_PPI2_D7, 480 + P_PPI2_CLK, P_PPI2_FS1, P_PPI2_FS2, 481 + 0, 482 + }; 483 + 484 + static const unsigned short atapi_mux[] = { 485 + P_ATAPI_RESET, P_ATAPI_DIOR, P_ATAPI_DIOW, P_ATAPI_CS0, P_ATAPI_CS1, 486 + P_ATAPI_DMACK, P_ATAPI_DMARQ, P_ATAPI_INTRQ, P_ATAPI_IORDY, 487 + }; 488 + 489 + static const unsigned short atapi_alter_mux[] = { 490 + P_ATAPI_D0A, P_ATAPI_D1A, P_ATAPI_D2A, P_ATAPI_D3A, P_ATAPI_D4A, 491 + P_ATAPI_D5A, P_ATAPI_D6A, P_ATAPI_D7A, P_ATAPI_D8A, P_ATAPI_D9A, 492 + P_ATAPI_D10A, P_ATAPI_D11A, P_ATAPI_D12A, P_ATAPI_D13A, P_ATAPI_D14A, 493 + P_ATAPI_D15A, P_ATAPI_A0A, P_ATAPI_A1A, P_ATAPI_A2A, 494 + 0 495 + }; 496 + 497 + static const unsigned short nfc0_mux[] = { 498 + P_NAND_CE, P_NAND_RB, 499 + 0 500 + }; 501 + 502 + static const unsigned short keys_4x4_mux[] = { 503 + P_KEY_ROW3, P_KEY_ROW2, P_KEY_ROW1, P_KEY_ROW0, 504 + P_KEY_COL3, P_KEY_COL2, P_KEY_COL1, P_KEY_COL0, 505 + 0 506 + }; 507 + 508 + static const unsigned short keys_8x8_mux[] = { 509 + P_KEY_ROW7, P_KEY_ROW6, P_KEY_ROW5, P_KEY_ROW4, 510 + P_KEY_ROW3, P_KEY_ROW2, P_KEY_ROW1, P_KEY_ROW0, 511 + P_KEY_COL7, P_KEY_COL6, P_KEY_COL5, P_KEY_COL4, 512 + P_KEY_COL3, P_KEY_COL2, P_KEY_COL1, P_KEY_COL0, 513 + 0 514 + }; 515 + 516 + static const char * const uart0grp[] = { "uart0grp" }; 517 + static const char * const uart1grp[] = { "uart1grp" }; 518 + static const char * const uart1ctsrtsgrp[] = { "uart1ctsrtsgrp" }; 519 + static const char * const uart2grp[] = { "uart2grp" }; 520 + static const char * const uart3grp[] = { "uart3grp" }; 521 + static const char * const uart3ctsrtsgrp[] = { "uart3ctsrtsgrp" }; 522 + static const char * const rsi0grp[] = { "rsi0grp" }; 523 + static const char * const spi0grp[] = { "spi0grp" }; 524 + static const char * const spi1grp[] = { "spi1grp" }; 525 + static const char * const twi0grp[] = { "twi0grp" }; 526 + static const char * const twi1grp[] = { "twi1grp" }; 527 + static const char * const rotarygrp[] = { "rotarygrp" }; 528 + static const char * const can0grp[] = { "can0grp" }; 529 + static const char * const can1grp[] = { "can1grp" }; 530 + static const char * const smc0grp[] = { "smc0grp" }; 531 + static const char * const sport0grp[] = { "sport0grp" }; 532 + static const char * const sport1grp[] = { "sport1grp" }; 533 + static const char * const sport2grp[] = { "sport2grp" }; 534 + static const char * const sport3grp[] = { "sport3grp" }; 535 + static const char * const ppi0_8bgrp[] = { "ppi0_8bgrp" }; 536 + static const char * const ppi0_16bgrp[] = { "ppi0_16bgrp" }; 537 + static const char * const ppi0_24bgrp[] = { "ppi0_24bgrp" }; 538 + static const char * const ppi1_8bgrp[] = { "ppi1_8bgrp" }; 539 + static const char * const ppi1_16bgrp[] = { "ppi1_16bgrp" }; 540 + static const char * const ppi2_8bgrp[] = { "ppi2_8bgrp" }; 541 + static const char * const atapigrp[] = { "atapigrp" }; 542 + static const char * const atapialtergrp[] = { "atapialtergrp" }; 543 + static const char * const nfc0grp[] = { "nfc0grp" }; 544 + static const char * const keys_4x4grp[] = { "keys_4x4grp" }; 545 + static const char * const keys_8x8grp[] = { "keys_8x8grp" }; 546 + 547 + static const struct adi_pmx_func adi_pmx_functions[] = { 548 + ADI_PMX_FUNCTION("uart0", uart0grp, uart0_mux), 549 + ADI_PMX_FUNCTION("uart1", uart1grp, uart1_mux), 550 + ADI_PMX_FUNCTION("uart1_ctsrts", uart1ctsrtsgrp, uart1_ctsrts_mux), 551 + ADI_PMX_FUNCTION("uart2", uart2grp, uart2_mux), 552 + ADI_PMX_FUNCTION("uart3", uart3grp, uart3_mux), 553 + ADI_PMX_FUNCTION("uart3_ctsrts", uart3ctsrtsgrp, uart3_ctsrts_mux), 554 + ADI_PMX_FUNCTION("rsi0", rsi0grp, rsi0_mux), 555 + ADI_PMX_FUNCTION("spi0", spi0grp, spi0_mux), 556 + ADI_PMX_FUNCTION("spi1", spi1grp, spi1_mux), 557 + ADI_PMX_FUNCTION("twi0", twi0grp, twi0_mux), 558 + ADI_PMX_FUNCTION("twi1", twi1grp, twi1_mux), 559 + ADI_PMX_FUNCTION("rotary", rotarygrp, rotary_mux), 560 + ADI_PMX_FUNCTION("can0", can0grp, can0_mux), 561 + ADI_PMX_FUNCTION("can1", can1grp, can1_mux), 562 + ADI_PMX_FUNCTION("smc0", smc0grp, smc0_mux), 563 + ADI_PMX_FUNCTION("sport0", sport0grp, sport0_mux), 564 + ADI_PMX_FUNCTION("sport1", sport1grp, sport1_mux), 565 + ADI_PMX_FUNCTION("sport2", sport2grp, sport2_mux), 566 + ADI_PMX_FUNCTION("sport3", sport3grp, sport3_mux), 567 + ADI_PMX_FUNCTION("ppi0_8b", ppi0_8bgrp, ppi0_8b_mux), 568 + ADI_PMX_FUNCTION("ppi0_16b", ppi0_16bgrp, ppi0_16b_mux), 569 + ADI_PMX_FUNCTION("ppi0_24b", ppi0_24bgrp, ppi0_24b_mux), 570 + ADI_PMX_FUNCTION("ppi1_8b", ppi1_8bgrp, ppi1_8b_mux), 571 + ADI_PMX_FUNCTION("ppi1_16b", ppi1_16bgrp, ppi1_16b_mux), 572 + ADI_PMX_FUNCTION("ppi2_8b", ppi2_8bgrp, ppi2_8b_mux), 573 + ADI_PMX_FUNCTION("atapi", atapigrp, atapi_mux), 574 + ADI_PMX_FUNCTION("atapi_alter", atapialtergrp, atapi_alter_mux), 575 + ADI_PMX_FUNCTION("nfc0", nfc0grp, nfc0_mux), 576 + ADI_PMX_FUNCTION("keys_4x4", keys_4x4grp, keys_4x4_mux), 577 + ADI_PMX_FUNCTION("keys_8x8", keys_8x8grp, keys_8x8_mux), 578 + }; 579 + 580 + static const struct adi_pinctrl_soc_data adi_bf54x_soc = { 581 + .functions = adi_pmx_functions, 582 + .nfunctions = ARRAY_SIZE(adi_pmx_functions), 583 + .groups = adi_pin_groups, 584 + .ngroups = ARRAY_SIZE(adi_pin_groups), 585 + .pins = adi_pads, 586 + .npins = ARRAY_SIZE(adi_pads), 587 + }; 588 + 589 + void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc) 590 + { 591 + *soc = &adi_bf54x_soc; 592 + }
+521
drivers/pinctrl/pinctrl-adi2-bf60x.c
··· 1 + /* 2 + * Pinctrl Driver for ADI GPIO2 controller 3 + * 4 + * Copyright 2007-2013 Analog Devices Inc. 5 + * 6 + * Licensed under the GPLv2 or later 7 + */ 8 + 9 + #include <asm/portmux.h> 10 + #include "pinctrl-adi2.h" 11 + 12 + static const struct pinctrl_pin_desc adi_pads[] = { 13 + PINCTRL_PIN(0, "PA0"), 14 + PINCTRL_PIN(1, "PA1"), 15 + PINCTRL_PIN(2, "PA2"), 16 + PINCTRL_PIN(3, "PG3"), 17 + PINCTRL_PIN(4, "PA4"), 18 + PINCTRL_PIN(5, "PA5"), 19 + PINCTRL_PIN(6, "PA6"), 20 + PINCTRL_PIN(7, "PA7"), 21 + PINCTRL_PIN(8, "PA8"), 22 + PINCTRL_PIN(9, "PA9"), 23 + PINCTRL_PIN(10, "PA10"), 24 + PINCTRL_PIN(11, "PA11"), 25 + PINCTRL_PIN(12, "PA12"), 26 + PINCTRL_PIN(13, "PA13"), 27 + PINCTRL_PIN(14, "PA14"), 28 + PINCTRL_PIN(15, "PA15"), 29 + PINCTRL_PIN(16, "PB0"), 30 + PINCTRL_PIN(17, "PB1"), 31 + PINCTRL_PIN(18, "PB2"), 32 + PINCTRL_PIN(19, "PB3"), 33 + PINCTRL_PIN(20, "PB4"), 34 + PINCTRL_PIN(21, "PB5"), 35 + PINCTRL_PIN(22, "PB6"), 36 + PINCTRL_PIN(23, "PB7"), 37 + PINCTRL_PIN(24, "PB8"), 38 + PINCTRL_PIN(25, "PB9"), 39 + PINCTRL_PIN(26, "PB10"), 40 + PINCTRL_PIN(27, "PB11"), 41 + PINCTRL_PIN(28, "PB12"), 42 + PINCTRL_PIN(29, "PB13"), 43 + PINCTRL_PIN(30, "PB14"), 44 + PINCTRL_PIN(31, "PB15"), 45 + PINCTRL_PIN(32, "PC0"), 46 + PINCTRL_PIN(33, "PC1"), 47 + PINCTRL_PIN(34, "PC2"), 48 + PINCTRL_PIN(35, "PC3"), 49 + PINCTRL_PIN(36, "PC4"), 50 + PINCTRL_PIN(37, "PC5"), 51 + PINCTRL_PIN(38, "PC6"), 52 + PINCTRL_PIN(39, "PC7"), 53 + PINCTRL_PIN(40, "PC8"), 54 + PINCTRL_PIN(41, "PC9"), 55 + PINCTRL_PIN(42, "PC10"), 56 + PINCTRL_PIN(43, "PC11"), 57 + PINCTRL_PIN(44, "PC12"), 58 + PINCTRL_PIN(45, "PC13"), 59 + PINCTRL_PIN(46, "PC14"), 60 + PINCTRL_PIN(47, "PC15"), 61 + PINCTRL_PIN(48, "PD0"), 62 + PINCTRL_PIN(49, "PD1"), 63 + PINCTRL_PIN(50, "PD2"), 64 + PINCTRL_PIN(51, "PD3"), 65 + PINCTRL_PIN(52, "PD4"), 66 + PINCTRL_PIN(53, "PD5"), 67 + PINCTRL_PIN(54, "PD6"), 68 + PINCTRL_PIN(55, "PD7"), 69 + PINCTRL_PIN(56, "PD8"), 70 + PINCTRL_PIN(57, "PD9"), 71 + PINCTRL_PIN(58, "PD10"), 72 + PINCTRL_PIN(59, "PD11"), 73 + PINCTRL_PIN(60, "PD12"), 74 + PINCTRL_PIN(61, "PD13"), 75 + PINCTRL_PIN(62, "PD14"), 76 + PINCTRL_PIN(63, "PD15"), 77 + PINCTRL_PIN(64, "PE0"), 78 + PINCTRL_PIN(65, "PE1"), 79 + PINCTRL_PIN(66, "PE2"), 80 + PINCTRL_PIN(67, "PE3"), 81 + PINCTRL_PIN(68, "PE4"), 82 + PINCTRL_PIN(69, "PE5"), 83 + PINCTRL_PIN(70, "PE6"), 84 + PINCTRL_PIN(71, "PE7"), 85 + PINCTRL_PIN(72, "PE8"), 86 + PINCTRL_PIN(73, "PE9"), 87 + PINCTRL_PIN(74, "PE10"), 88 + PINCTRL_PIN(75, "PE11"), 89 + PINCTRL_PIN(76, "PE12"), 90 + PINCTRL_PIN(77, "PE13"), 91 + PINCTRL_PIN(78, "PE14"), 92 + PINCTRL_PIN(79, "PE15"), 93 + PINCTRL_PIN(80, "PF0"), 94 + PINCTRL_PIN(81, "PF1"), 95 + PINCTRL_PIN(82, "PF2"), 96 + PINCTRL_PIN(83, "PF3"), 97 + PINCTRL_PIN(84, "PF4"), 98 + PINCTRL_PIN(85, "PF5"), 99 + PINCTRL_PIN(86, "PF6"), 100 + PINCTRL_PIN(87, "PF7"), 101 + PINCTRL_PIN(88, "PF8"), 102 + PINCTRL_PIN(89, "PF9"), 103 + PINCTRL_PIN(90, "PF10"), 104 + PINCTRL_PIN(91, "PF11"), 105 + PINCTRL_PIN(92, "PF12"), 106 + PINCTRL_PIN(93, "PF13"), 107 + PINCTRL_PIN(94, "PF14"), 108 + PINCTRL_PIN(95, "PF15"), 109 + PINCTRL_PIN(96, "PG0"), 110 + PINCTRL_PIN(97, "PG1"), 111 + PINCTRL_PIN(98, "PG2"), 112 + PINCTRL_PIN(99, "PG3"), 113 + PINCTRL_PIN(100, "PG4"), 114 + PINCTRL_PIN(101, "PG5"), 115 + PINCTRL_PIN(102, "PG6"), 116 + PINCTRL_PIN(103, "PG7"), 117 + PINCTRL_PIN(104, "PG8"), 118 + PINCTRL_PIN(105, "PG9"), 119 + PINCTRL_PIN(106, "PG10"), 120 + PINCTRL_PIN(107, "PG11"), 121 + PINCTRL_PIN(108, "PG12"), 122 + PINCTRL_PIN(109, "PG13"), 123 + PINCTRL_PIN(110, "PG14"), 124 + PINCTRL_PIN(111, "PG15"), 125 + }; 126 + 127 + static const unsigned uart0_pins[] = { 128 + GPIO_PD7, GPIO_PD8, 129 + }; 130 + 131 + static const unsigned uart0_ctsrts_pins[] = { 132 + GPIO_PD9, GPIO_PD10, 133 + }; 134 + 135 + static const unsigned uart1_pins[] = { 136 + GPIO_PG15, GPIO_PG14, 137 + }; 138 + 139 + static const unsigned uart1_ctsrts_pins[] = { 140 + GPIO_PG10, GPIO_PG13, 141 + }; 142 + 143 + static const unsigned rsi0_pins[] = { 144 + GPIO_PG3, GPIO_PG2, GPIO_PG0, GPIO_PE15, GPIO_PG5, GPIO_PG6, 145 + }; 146 + 147 + static const unsigned eth0_pins[] = { 148 + GPIO_PC6, GPIO_PC7, GPIO_PC2, GPIO_PC0, GPIO_PC3, GPIO_PC1, 149 + GPIO_PB13, GPIO_PD6, GPIO_PC5, GPIO_PC4, GPIO_PB14, GPIO_PB15, 150 + }; 151 + 152 + static const unsigned eth1_pins[] = { 153 + GPIO_PE10, GPIO_PE11, GPIO_PG3, GPIO_PG0, GPIO_PG2, GPIO_PE15, 154 + GPIO_PG5, GPIO_PE12, GPIO_PE13, GPIO_PE14, GPIO_PG6, GPIO_PC9, 155 + }; 156 + 157 + static const unsigned spi0_pins[] = { 158 + GPIO_PD4, GPIO_PD2, GPIO_PD3, 159 + }; 160 + 161 + static const unsigned spi1_pins[] = { 162 + GPIO_PD5, GPIO_PD14, GPIO_PD13, 163 + }; 164 + 165 + static const unsigned twi0_pins[] = { 166 + }; 167 + 168 + static const unsigned twi1_pins[] = { 169 + }; 170 + 171 + static const unsigned rotary_pins[] = { 172 + GPIO_PG7, GPIO_PG11, GPIO_PG12, 173 + }; 174 + 175 + static const unsigned can0_pins[] = { 176 + GPIO_PG1, GPIO_PG4, 177 + }; 178 + 179 + static const unsigned smc0_pins[] = { 180 + GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA5, GPIO_PA6, 181 + GPIO_PA7, GPIO_PA8, GPIO_PA9, GPIO_PB2, GPIO_PA10, GPIO_PA11, 182 + GPIO_PB3, GPIO_PA12, GPIO_PA13, GPIO_PA14, GPIO_PA15, GPIO_PB6, 183 + GPIO_PB7, GPIO_PB8, GPIO_PB10, GPIO_PB11, GPIO_PB0, 184 + }; 185 + 186 + static const unsigned sport0_pins[] = { 187 + GPIO_PB5, GPIO_PB4, GPIO_PB9, GPIO_PB8, GPIO_PB7, GPIO_PB11, 188 + }; 189 + 190 + static const unsigned sport1_pins[] = { 191 + GPIO_PE2, GPIO_PE5, GPIO_PD15, GPIO_PE4, GPIO_PE3, GPIO_PE1, 192 + }; 193 + 194 + static const unsigned sport2_pins[] = { 195 + GPIO_PG4, GPIO_PG1, GPIO_PG9, GPIO_PG10, GPIO_PG7, GPIO_PB12, 196 + }; 197 + 198 + static const unsigned ppi0_8b_pins[] = { 199 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 200 + GPIO_PF7, GPIO_PF13, GPIO_PF14, GPIO_PF15, 201 + GPIO_PE6, GPIO_PE7, GPIO_PE8, GPIO_PE9, 202 + }; 203 + 204 + static const unsigned ppi0_16b_pins[] = { 205 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 206 + GPIO_PF7, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, 207 + GPIO_PF13, GPIO_PF14, GPIO_PF15, 208 + GPIO_PE6, GPIO_PE7, GPIO_PE8, GPIO_PE9, 209 + }; 210 + 211 + static const unsigned ppi0_24b_pins[] = { 212 + GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, GPIO_PF4, GPIO_PF5, GPIO_PF6, 213 + GPIO_PF7, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, GPIO_PF12, 214 + GPIO_PF13, GPIO_PF14, GPIO_PF15, GPIO_PE0, GPIO_PE1, GPIO_PE2, 215 + GPIO_PE3, GPIO_PE4, GPIO_PE5, GPIO_PE6, GPIO_PE7, GPIO_PE8, 216 + GPIO_PE9, GPIO_PD12, GPIO_PD15, 217 + }; 218 + 219 + static const unsigned ppi1_8b_pins[] = { 220 + GPIO_PC0, GPIO_PC1, GPIO_PC2, GPIO_PC3, GPIO_PC4, GPIO_PC5, GPIO_PC6, 221 + GPIO_PC7, GPIO_PC8, GPIO_PB13, GPIO_PB14, GPIO_PB15, GPIO_PD6, 222 + }; 223 + 224 + static const unsigned ppi1_16b_pins[] = { 225 + GPIO_PC0, GPIO_PC1, GPIO_PC2, GPIO_PC3, GPIO_PC4, GPIO_PC5, GPIO_PC6, 226 + GPIO_PC7, GPIO_PC9, GPIO_PC10, GPIO_PC11, GPIO_PC12, 227 + GPIO_PC13, GPIO_PC14, GPIO_PC15, 228 + GPIO_PB13, GPIO_PB14, GPIO_PB15, GPIO_PD6, 229 + }; 230 + 231 + static const unsigned ppi2_8b_pins[] = { 232 + GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA5, GPIO_PA6, 233 + GPIO_PA7, GPIO_PB0, GPIO_PB1, GPIO_PB2, GPIO_PB3, 234 + }; 235 + 236 + static const unsigned ppi2_16b_pins[] = { 237 + GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, GPIO_PA4, GPIO_PA5, GPIO_PA6, 238 + GPIO_PA7, GPIO_PA8, GPIO_PA9, GPIO_PA10, GPIO_PA11, GPIO_PA12, 239 + GPIO_PA13, GPIO_PA14, GPIO_PA15, GPIO_PB0, GPIO_PB1, GPIO_PB2, 240 + }; 241 + 242 + static const unsigned lp0_pins[] = { 243 + GPIO_PB0, GPIO_PB1, GPIO_PA0, GPIO_PA1, GPIO_PA2, GPIO_PA3, 244 + GPIO_PA4, GPIO_PA5, GPIO_PA6, GPIO_PA7, 245 + }; 246 + 247 + static const unsigned lp1_pins[] = { 248 + GPIO_PB3, GPIO_PB2, GPIO_PA8, GPIO_PA9, GPIO_PA10, GPIO_PA11, 249 + GPIO_PA12, GPIO_PA13, GPIO_PA14, GPIO_PA15, 250 + }; 251 + 252 + static const unsigned lp2_pins[] = { 253 + GPIO_PE6, GPIO_PE7, GPIO_PF0, GPIO_PF1, GPIO_PF2, GPIO_PF3, 254 + GPIO_PF4, GPIO_PF5, GPIO_PF6, GPIO_PF7, 255 + }; 256 + 257 + static const unsigned lp3_pins[] = { 258 + GPIO_PE9, GPIO_PE8, GPIO_PF8, GPIO_PF9, GPIO_PF10, GPIO_PF11, 259 + GPIO_PF12, GPIO_PF13, GPIO_PF14, GPIO_PF15, 260 + }; 261 + 262 + static const struct adi_pin_group adi_pin_groups[] = { 263 + ADI_PIN_GROUP("uart0grp", uart0_pins), 264 + ADI_PIN_GROUP("uart0ctsrtsgrp", uart0_ctsrts_pins), 265 + ADI_PIN_GROUP("uart1grp", uart1_pins), 266 + ADI_PIN_GROUP("uart1ctsrtsgrp", uart1_ctsrts_pins), 267 + ADI_PIN_GROUP("rsi0grp", rsi0_pins), 268 + ADI_PIN_GROUP("eth0grp", eth0_pins), 269 + ADI_PIN_GROUP("eth1grp", eth1_pins), 270 + ADI_PIN_GROUP("spi0grp", spi0_pins), 271 + ADI_PIN_GROUP("spi1grp", spi1_pins), 272 + ADI_PIN_GROUP("twi0grp", twi0_pins), 273 + ADI_PIN_GROUP("twi1grp", twi1_pins), 274 + ADI_PIN_GROUP("rotarygrp", rotary_pins), 275 + ADI_PIN_GROUP("can0grp", can0_pins), 276 + ADI_PIN_GROUP("smc0grp", smc0_pins), 277 + ADI_PIN_GROUP("sport0grp", sport0_pins), 278 + ADI_PIN_GROUP("sport1grp", sport1_pins), 279 + ADI_PIN_GROUP("sport2grp", sport2_pins), 280 + ADI_PIN_GROUP("ppi0_8bgrp", ppi0_8b_pins), 281 + ADI_PIN_GROUP("ppi0_16bgrp", ppi0_16b_pins), 282 + ADI_PIN_GROUP("ppi0_24bgrp", ppi0_24b_pins), 283 + ADI_PIN_GROUP("ppi1_8bgrp", ppi1_8b_pins), 284 + ADI_PIN_GROUP("ppi1_16bgrp", ppi1_16b_pins), 285 + ADI_PIN_GROUP("ppi2_8bgrp", ppi2_8b_pins), 286 + ADI_PIN_GROUP("ppi2_16bgrp", ppi2_16b_pins), 287 + ADI_PIN_GROUP("lp0grp", lp0_pins), 288 + ADI_PIN_GROUP("lp1grp", lp1_pins), 289 + ADI_PIN_GROUP("lp2grp", lp2_pins), 290 + ADI_PIN_GROUP("lp3grp", lp3_pins), 291 + }; 292 + 293 + static const unsigned short uart0_mux[] = { 294 + P_UART0_TX, P_UART0_RX, 295 + 0 296 + }; 297 + 298 + static const unsigned short uart0_ctsrts_mux[] = { 299 + P_UART0_RTS, P_UART0_CTS, 300 + 0 301 + }; 302 + 303 + static const unsigned short uart1_mux[] = { 304 + P_UART1_TX, P_UART1_RX, 305 + 0 306 + }; 307 + 308 + static const unsigned short uart1_ctsrts_mux[] = { 309 + P_UART1_RTS, P_UART1_CTS, 310 + 0 311 + }; 312 + 313 + static const unsigned short rsi0_mux[] = { 314 + P_RSI_DATA0, P_RSI_DATA1, P_RSI_DATA2, P_RSI_DATA3, 315 + P_RSI_CMD, P_RSI_CLK, 0 316 + }; 317 + 318 + static const unsigned short eth0_mux[] = P_RMII0; 319 + static const unsigned short eth1_mux[] = P_RMII1; 320 + 321 + static const unsigned short spi0_mux[] = { 322 + P_SPI0_SCK, P_SPI0_MISO, P_SPI0_MOSI, 0 323 + }; 324 + 325 + static const unsigned short spi1_mux[] = { 326 + P_SPI1_SCK, P_SPI1_MISO, P_SPI1_MOSI, 0 327 + }; 328 + 329 + static const unsigned short twi0_mux[] = { 330 + P_TWI0_SCL, P_TWI0_SDA, 0 331 + }; 332 + 333 + static const unsigned short twi1_mux[] = { 334 + P_TWI1_SCL, P_TWI1_SDA, 0 335 + }; 336 + 337 + static const unsigned short rotary_mux[] = { 338 + P_CNT_CUD, P_CNT_CDG, P_CNT_CZM, 0 339 + }; 340 + 341 + static const unsigned short sport0_mux[] = { 342 + P_SPORT0_ACLK, P_SPORT0_AFS, P_SPORT0_AD0, P_SPORT0_BCLK, 343 + P_SPORT0_BFS, P_SPORT0_BD0, 0, 344 + }; 345 + 346 + static const unsigned short sport1_mux[] = { 347 + P_SPORT1_ACLK, P_SPORT1_AFS, P_SPORT1_AD0, P_SPORT1_BCLK, 348 + P_SPORT1_BFS, P_SPORT1_BD0, 0, 349 + }; 350 + 351 + static const unsigned short sport2_mux[] = { 352 + P_SPORT2_ACLK, P_SPORT2_AFS, P_SPORT2_AD0, P_SPORT2_BCLK, 353 + P_SPORT2_BFS, P_SPORT2_BD0, 0, 354 + }; 355 + 356 + static const unsigned short can0_mux[] = { 357 + P_CAN0_RX, P_CAN0_TX, 0 358 + }; 359 + 360 + static const unsigned short smc0_mux[] = { 361 + P_A3, P_A4, P_A5, P_A6, P_A7, P_A8, P_A9, P_A10, P_A11, P_A12, 362 + P_A13, P_A14, P_A15, P_A16, P_A17, P_A18, P_A19, P_A20, P_A21, 363 + P_A22, P_A23, P_A24, P_A25, P_NORCK, 0, 364 + }; 365 + 366 + static const unsigned short ppi0_8b_mux[] = { 367 + P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 368 + P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 369 + P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 370 + 0, 371 + }; 372 + 373 + static const unsigned short ppi0_16b_mux[] = { 374 + P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 375 + P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 376 + P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, 377 + P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, 378 + P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 379 + 0, 380 + }; 381 + 382 + static const unsigned short ppi0_24b_mux[] = { 383 + P_PPI0_D0, P_PPI0_D1, P_PPI0_D2, P_PPI0_D3, 384 + P_PPI0_D4, P_PPI0_D5, P_PPI0_D6, P_PPI0_D7, 385 + P_PPI0_D8, P_PPI0_D9, P_PPI0_D10, P_PPI0_D11, 386 + P_PPI0_D12, P_PPI0_D13, P_PPI0_D14, P_PPI0_D15, 387 + P_PPI0_D16, P_PPI0_D17, P_PPI0_D18, P_PPI0_D19, 388 + P_PPI0_D20, P_PPI0_D21, P_PPI0_D22, P_PPI0_D23, 389 + P_PPI0_CLK, P_PPI0_FS1, P_PPI0_FS2, 390 + 0, 391 + }; 392 + 393 + static const unsigned short ppi1_8b_mux[] = { 394 + P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, 395 + P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, 396 + P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, 397 + 0, 398 + }; 399 + 400 + static const unsigned short ppi1_16b_mux[] = { 401 + P_PPI1_D0, P_PPI1_D1, P_PPI1_D2, P_PPI1_D3, 402 + P_PPI1_D4, P_PPI1_D5, P_PPI1_D6, P_PPI1_D7, 403 + P_PPI1_D8, P_PPI1_D9, P_PPI1_D10, P_PPI1_D11, 404 + P_PPI1_D12, P_PPI1_D13, P_PPI1_D14, P_PPI1_D15, 405 + P_PPI1_CLK, P_PPI1_FS1, P_PPI1_FS2, 406 + 0, 407 + }; 408 + 409 + static const unsigned short ppi2_8b_mux[] = { 410 + P_PPI2_D0, P_PPI2_D1, P_PPI2_D2, P_PPI2_D3, 411 + P_PPI2_D4, P_PPI2_D5, P_PPI2_D6, P_PPI2_D7, 412 + P_PPI2_CLK, P_PPI2_FS1, P_PPI2_FS2, 413 + 0, 414 + }; 415 + 416 + static const unsigned short ppi2_16b_mux[] = { 417 + P_PPI2_D0, P_PPI2_D1, P_PPI2_D2, P_PPI2_D3, 418 + P_PPI2_D4, P_PPI2_D5, P_PPI2_D6, P_PPI2_D7, 419 + P_PPI2_D8, P_PPI2_D9, P_PPI2_D10, P_PPI2_D11, 420 + P_PPI2_D12, P_PPI2_D13, P_PPI2_D14, P_PPI2_D15, 421 + P_PPI2_CLK, P_PPI2_FS1, P_PPI2_FS2, 422 + 0, 423 + }; 424 + 425 + static const unsigned short lp0_mux[] = { 426 + P_LP0_CLK, P_LP0_ACK, P_LP0_D0, P_LP0_D1, P_LP0_D2, 427 + P_LP0_D3, P_LP0_D4, P_LP0_D5, P_LP0_D6, P_LP0_D7, 428 + 0 429 + }; 430 + 431 + static const unsigned short lp1_mux[] = { 432 + P_LP1_CLK, P_LP1_ACK, P_LP1_D0, P_LP1_D1, P_LP1_D2, 433 + P_LP1_D3, P_LP1_D4, P_LP1_D5, P_LP1_D6, P_LP1_D7, 434 + 0 435 + }; 436 + 437 + static const unsigned short lp2_mux[] = { 438 + P_LP2_CLK, P_LP2_ACK, P_LP2_D0, P_LP2_D1, P_LP2_D2, 439 + P_LP2_D3, P_LP2_D4, P_LP2_D5, P_LP2_D6, P_LP2_D7, 440 + 0 441 + }; 442 + 443 + static const unsigned short lp3_mux[] = { 444 + P_LP3_CLK, P_LP3_ACK, P_LP3_D0, P_LP3_D1, P_LP3_D2, 445 + P_LP3_D3, P_LP3_D4, P_LP3_D5, P_LP3_D6, P_LP3_D7, 446 + 0 447 + }; 448 + 449 + static const char * const uart0grp[] = { "uart0grp" }; 450 + static const char * const uart0ctsrtsgrp[] = { "uart0ctsrtsgrp" }; 451 + static const char * const uart1grp[] = { "uart1grp" }; 452 + static const char * const uart1ctsrtsgrp[] = { "uart1ctsrtsgrp" }; 453 + static const char * const rsi0grp[] = { "rsi0grp" }; 454 + static const char * const eth0grp[] = { "eth0grp" }; 455 + static const char * const eth1grp[] = { "eth1grp" }; 456 + static const char * const spi0grp[] = { "spi0grp" }; 457 + static const char * const spi1grp[] = { "spi1grp" }; 458 + static const char * const twi0grp[] = { "twi0grp" }; 459 + static const char * const twi1grp[] = { "twi1grp" }; 460 + static const char * const rotarygrp[] = { "rotarygrp" }; 461 + static const char * const can0grp[] = { "can0grp" }; 462 + static const char * const smc0grp[] = { "smc0grp" }; 463 + static const char * const sport0grp[] = { "sport0grp" }; 464 + static const char * const sport1grp[] = { "sport1grp" }; 465 + static const char * const sport2grp[] = { "sport2grp" }; 466 + static const char * const ppi0_8bgrp[] = { "ppi0_8bgrp" }; 467 + static const char * const ppi0_16bgrp[] = { "ppi0_16bgrp" }; 468 + static const char * const ppi0_24bgrp[] = { "ppi0_24bgrp" }; 469 + static const char * const ppi1_8bgrp[] = { "ppi1_8bgrp" }; 470 + static const char * const ppi1_16bgrp[] = { "ppi1_16bgrp" }; 471 + static const char * const ppi2_8bgrp[] = { "ppi2_8bgrp" }; 472 + static const char * const ppi2_16bgrp[] = { "ppi2_16bgrp" }; 473 + static const char * const lp0grp[] = { "lp0grp" }; 474 + static const char * const lp1grp[] = { "lp1grp" }; 475 + static const char * const lp2grp[] = { "lp2grp" }; 476 + static const char * const lp3grp[] = { "lp3grp" }; 477 + 478 + static const struct adi_pmx_func adi_pmx_functions[] = { 479 + ADI_PMX_FUNCTION("uart0", uart0grp, uart0_mux), 480 + ADI_PMX_FUNCTION("uart0_ctsrts", uart0ctsrtsgrp, uart0_ctsrts_mux), 481 + ADI_PMX_FUNCTION("uart1", uart1grp, uart1_mux), 482 + ADI_PMX_FUNCTION("uart1_ctsrts", uart1ctsrtsgrp, uart1_ctsrts_mux), 483 + ADI_PMX_FUNCTION("rsi0", rsi0grp, rsi0_mux), 484 + ADI_PMX_FUNCTION("eth0", eth0grp, eth0_mux), 485 + ADI_PMX_FUNCTION("eth1", eth1grp, eth1_mux), 486 + ADI_PMX_FUNCTION("spi0", spi0grp, spi0_mux), 487 + ADI_PMX_FUNCTION("spi1", spi1grp, spi1_mux), 488 + ADI_PMX_FUNCTION("twi0", twi0grp, twi0_mux), 489 + ADI_PMX_FUNCTION("twi1", twi1grp, twi1_mux), 490 + ADI_PMX_FUNCTION("rotary", rotarygrp, rotary_mux), 491 + ADI_PMX_FUNCTION("can0", can0grp, can0_mux), 492 + ADI_PMX_FUNCTION("smc0", smc0grp, smc0_mux), 493 + ADI_PMX_FUNCTION("sport0", sport0grp, sport0_mux), 494 + ADI_PMX_FUNCTION("sport1", sport1grp, sport1_mux), 495 + ADI_PMX_FUNCTION("sport2", sport2grp, sport2_mux), 496 + ADI_PMX_FUNCTION("ppi0_8b", ppi0_8bgrp, ppi0_8b_mux), 497 + ADI_PMX_FUNCTION("ppi0_16b", ppi0_16bgrp, ppi0_16b_mux), 498 + ADI_PMX_FUNCTION("ppi0_24b", ppi0_24bgrp, ppi0_24b_mux), 499 + ADI_PMX_FUNCTION("ppi1_8b", ppi1_8bgrp, ppi1_8b_mux), 500 + ADI_PMX_FUNCTION("ppi1_16b", ppi1_16bgrp, ppi1_16b_mux), 501 + ADI_PMX_FUNCTION("ppi2_8b", ppi2_8bgrp, ppi2_8b_mux), 502 + ADI_PMX_FUNCTION("ppi2_16b", ppi2_16bgrp, ppi2_16b_mux), 503 + ADI_PMX_FUNCTION("lp0", lp0grp, lp0_mux), 504 + ADI_PMX_FUNCTION("lp1", lp1grp, lp1_mux), 505 + ADI_PMX_FUNCTION("lp2", lp2grp, lp2_mux), 506 + ADI_PMX_FUNCTION("lp3", lp3grp, lp3_mux), 507 + }; 508 + 509 + static const struct adi_pinctrl_soc_data adi_bf60x_soc = { 510 + .functions = adi_pmx_functions, 511 + .nfunctions = ARRAY_SIZE(adi_pmx_functions), 512 + .groups = adi_pin_groups, 513 + .ngroups = ARRAY_SIZE(adi_pin_groups), 514 + .pins = adi_pads, 515 + .npins = ARRAY_SIZE(adi_pads), 516 + }; 517 + 518 + void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc) 519 + { 520 + *soc = &adi_bf60x_soc; 521 + }
+1164
drivers/pinctrl/pinctrl-adi2.c
··· 1 + /* 2 + * Pinctrl Driver for ADI GPIO2 controller 3 + * 4 + * Copyright 2007-2013 Analog Devices Inc. 5 + * 6 + * Licensed under the GPLv2 or later 7 + */ 8 + 9 + #include <linux/bitops.h> 10 + #include <linux/delay.h> 11 + #include <linux/module.h> 12 + #include <linux/err.h> 13 + #include <linux/debugfs.h> 14 + #include <linux/seq_file.h> 15 + #include <linux/irq.h> 16 + #include <linux/platform_data/pinctrl-adi2.h> 17 + #include <linux/irqdomain.h> 18 + #include <linux/irqchip/chained_irq.h> 19 + #include <linux/pinctrl/pinctrl.h> 20 + #include <linux/pinctrl/pinmux.h> 21 + #include <linux/pinctrl/consumer.h> 22 + #include <linux/pinctrl/machine.h> 23 + #include <linux/syscore_ops.h> 24 + #include <linux/gpio.h> 25 + #include <asm/portmux.h> 26 + #include "pinctrl-adi2.h" 27 + #include "core.h" 28 + 29 + /* 30 + According to the BF54x HRM, pint means "pin interrupt". 31 + http://www.analog.com/static/imported-files/processor_manuals/ADSP-BF54x_hwr_rev1.2.pdf 32 + 33 + ADSP-BF54x processor Blackfin processors have four SIC interrupt chan- 34 + nels dedicated to pin interrupt purposes. These channels are managed by 35 + four hardware blocks, called PINT0, PINT1, PINT2, and PINT3. Every PINTx 36 + block can sense to up to 32 pins. While PINT0 and PINT1 can sense the 37 + pins of port A and port B, PINT2 and PINT3 manage all the pins from port 38 + C to port J as shown in Figure 9-2. 39 + 40 + n BF54x HRM: 41 + The ten GPIO ports are subdivided into 8-bit half ports, resulting in lower and 42 + upper half 8-bit units. The PINTx_ASSIGN registers control the 8-bit multi- 43 + plexers shown in Figure 9-3. Lower half units of eight pins can be 44 + forwarded to either byte 0 or byte 2 of either associated PINTx block. 45 + Upper half units can be forwarded to either byte 1 or byte 3 of the pin 46 + interrupt blocks, without further restrictions. 47 + 48 + All MMR registers in the pin interrupt module are 32 bits wide. To simply the 49 + mapping logic, this driver only maps a 16-bit gpio port to the upper or lower 50 + 16 bits of a PINTx block. You can find the Figure 9-3 on page 583. 51 + 52 + Each IRQ domain is binding to a GPIO bank device. 2 GPIO bank devices can map 53 + to one PINT device. Two in "struct gpio_pint" are used to ease the PINT 54 + interrupt handler. 55 + 56 + The GPIO bank mapping to the lower 16 bits of the PINT device set its IRQ 57 + domain pointer in domain[0]. The IRQ domain pointer of the other bank is set 58 + to domain[1]. PINT interrupt handler adi_gpio_handle_pint_irq() finds out 59 + the current domain pointer according to whether the interrupt request mask 60 + is in lower 16 bits (domain[0]) or upper 16bits (domain[1]). 61 + 62 + A PINT device is not part of a GPIO port device in Blackfin. Multiple GPIO 63 + port devices can be mapped to the same PINT device. 64 + 65 + */ 66 + 67 + static LIST_HEAD(adi_pint_list); 68 + static LIST_HEAD(adi_gpio_port_list); 69 + 70 + #define DRIVER_NAME "pinctrl-adi2" 71 + 72 + #define PINT_HI_OFFSET 16 73 + 74 + /** 75 + * struct gpio_port_saved - GPIO port registers that should be saved between 76 + * power suspend and resume operations. 77 + * 78 + * @fer: PORTx_FER register 79 + * @data: PORTx_DATA register 80 + * @dir: PORTx_DIR register 81 + * @inen: PORTx_INEN register 82 + * @mux: PORTx_MUX register 83 + */ 84 + struct gpio_port_saved { 85 + u16 fer; 86 + u16 data; 87 + u16 dir; 88 + u16 inen; 89 + u32 mux; 90 + }; 91 + 92 + /** 93 + * struct gpio_pint - Pin interrupt controller device. Multiple ADI GPIO 94 + * banks can be mapped into one Pin interrupt controller. 95 + * 96 + * @node: All gpio_pint instances are added to a global list. 97 + * @base: PINT device register base address 98 + * @irq: IRQ of the PINT device, it is the parent IRQ of all 99 + * GPIO IRQs mapping to this device. 100 + * @domain: [0] irq domain of the gpio port, whose hardware interrupts are 101 + * mapping to the low 16-bit of the pint registers. 102 + * [1] irq domain of the gpio port, whose hardware interrupts are 103 + * mapping to the high 16-bit of the pint registers. 104 + * @regs: address pointer to the PINT device 105 + * @map_count: No more than 2 GPIO banks can be mapped to this PINT device. 106 + * @lock: This lock make sure the irq_chip operations to one PINT device 107 + * for different GPIO interrrupts are atomic. 108 + * @pint_map_port: Set up the mapping between one PINT device and 109 + * multiple GPIO banks. 110 + */ 111 + struct gpio_pint { 112 + struct list_head node; 113 + void __iomem *base; 114 + int irq; 115 + struct irq_domain *domain[2]; 116 + struct gpio_pint_regs *regs; 117 + struct adi_pm_pint_save saved_data; 118 + int map_count; 119 + spinlock_t lock; 120 + 121 + int (*pint_map_port)(struct gpio_pint *pint, bool assign, 122 + u8 map, struct irq_domain *domain); 123 + }; 124 + 125 + /** 126 + * ADI pin controller 127 + * 128 + * @dev: a pointer back to containing device 129 + * @pctl: the pinctrl device 130 + * @soc: SoC data for this specific chip 131 + */ 132 + struct adi_pinctrl { 133 + struct device *dev; 134 + struct pinctrl_dev *pctl; 135 + const struct adi_pinctrl_soc_data *soc; 136 + }; 137 + 138 + /** 139 + * struct gpio_port - GPIO bank device. Multiple ADI GPIO banks can be mapped 140 + * into one pin interrupt controller. 141 + * 142 + * @node: All gpio_port instances are added to a list. 143 + * @base: GPIO bank device register base address 144 + * @irq_base: base IRQ of the GPIO bank device 145 + * @width: PIN number of the GPIO bank device 146 + * @regs: address pointer to the GPIO bank device 147 + * @saved_data: registers that should be saved between PM operations. 148 + * @dev: device structure of this GPIO bank 149 + * @pint: GPIO PINT device that this GPIO bank mapped to 150 + * @pint_map: GIOP bank mapping code in PINT device 151 + * @pint_assign: The 32-bit PINT registers can be divided into 2 parts. A 152 + * GPIO bank can be mapped into either low 16 bits[0] or high 16 153 + * bits[1] of each PINT register. 154 + * @lock: This lock make sure the irq_chip operations to one PINT device 155 + * for different GPIO interrrupts are atomic. 156 + * @chip: abstract a GPIO controller 157 + * @domain: The irq domain owned by the GPIO port. 158 + * @rsvmap: Reservation map array for each pin in the GPIO bank 159 + */ 160 + struct gpio_port { 161 + struct list_head node; 162 + void __iomem *base; 163 + unsigned int irq_base; 164 + unsigned int width; 165 + struct gpio_port_t *regs; 166 + struct gpio_port_saved saved_data; 167 + struct device *dev; 168 + 169 + struct gpio_pint *pint; 170 + u8 pint_map; 171 + bool pint_assign; 172 + 173 + spinlock_t lock; 174 + struct gpio_chip chip; 175 + struct irq_domain *domain; 176 + }; 177 + 178 + static inline u8 pin_to_offset(struct pinctrl_gpio_range *range, unsigned pin) 179 + { 180 + return pin - range->pin_base; 181 + } 182 + 183 + static inline u32 hwirq_to_pintbit(struct gpio_port *port, int hwirq) 184 + { 185 + return port->pint_assign ? BIT(hwirq) << PINT_HI_OFFSET : BIT(hwirq); 186 + } 187 + 188 + static struct gpio_pint *find_gpio_pint(unsigned id) 189 + { 190 + struct gpio_pint *pint; 191 + int i = 0; 192 + 193 + list_for_each_entry(pint, &adi_pint_list, node) { 194 + if (id == i) 195 + return pint; 196 + i++; 197 + } 198 + 199 + return NULL; 200 + } 201 + 202 + static inline void port_setup(struct gpio_port *port, unsigned offset, 203 + bool use_for_gpio) 204 + { 205 + struct gpio_port_t *regs = port->regs; 206 + 207 + if (use_for_gpio) 208 + writew(readw(&regs->port_fer) & ~BIT(offset), 209 + &regs->port_fer); 210 + else 211 + writew(readw(&regs->port_fer) | BIT(offset), &regs->port_fer); 212 + } 213 + 214 + static inline void portmux_setup(struct gpio_port *port, unsigned offset, 215 + unsigned short function) 216 + { 217 + struct gpio_port_t *regs = port->regs; 218 + u32 pmux; 219 + 220 + pmux = readl(&regs->port_mux); 221 + 222 + /* The function field of each pin has 2 consecutive bits in 223 + * the mux register. 224 + */ 225 + pmux &= ~(0x3 << (2 * offset)); 226 + pmux |= (function & 0x3) << (2 * offset); 227 + 228 + writel(pmux, &regs->port_mux); 229 + } 230 + 231 + static inline u16 get_portmux(struct gpio_port *port, unsigned offset) 232 + { 233 + struct gpio_port_t *regs = port->regs; 234 + u32 pmux = readl(&regs->port_mux); 235 + 236 + /* The function field of each pin has 2 consecutive bits in 237 + * the mux register. 238 + */ 239 + return pmux >> (2 * offset) & 0x3; 240 + } 241 + 242 + static void adi_gpio_ack_irq(struct irq_data *d) 243 + { 244 + unsigned long flags; 245 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 246 + struct gpio_pint_regs *regs = port->pint->regs; 247 + unsigned pintbit = hwirq_to_pintbit(port, d->hwirq); 248 + 249 + spin_lock_irqsave(&port->lock, flags); 250 + spin_lock(&port->pint->lock); 251 + 252 + if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) { 253 + if (readl(&regs->invert_set) & pintbit) 254 + writel(pintbit, &regs->invert_clear); 255 + else 256 + writel(pintbit, &regs->invert_set); 257 + } 258 + 259 + writel(pintbit, &regs->request); 260 + 261 + spin_unlock(&port->pint->lock); 262 + spin_unlock_irqrestore(&port->lock, flags); 263 + } 264 + 265 + static void adi_gpio_mask_ack_irq(struct irq_data *d) 266 + { 267 + unsigned long flags; 268 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 269 + struct gpio_pint_regs *regs = port->pint->regs; 270 + unsigned pintbit = hwirq_to_pintbit(port, d->hwirq); 271 + 272 + spin_lock_irqsave(&port->lock, flags); 273 + spin_lock(&port->pint->lock); 274 + 275 + if (irqd_get_trigger_type(d) == IRQ_TYPE_EDGE_BOTH) { 276 + if (readl(&regs->invert_set) & pintbit) 277 + writel(pintbit, &regs->invert_clear); 278 + else 279 + writel(pintbit, &regs->invert_set); 280 + } 281 + 282 + writel(pintbit, &regs->request); 283 + writel(pintbit, &regs->mask_clear); 284 + 285 + spin_unlock(&port->pint->lock); 286 + spin_unlock_irqrestore(&port->lock, flags); 287 + } 288 + 289 + static void adi_gpio_mask_irq(struct irq_data *d) 290 + { 291 + unsigned long flags; 292 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 293 + struct gpio_pint_regs *regs = port->pint->regs; 294 + 295 + spin_lock_irqsave(&port->lock, flags); 296 + spin_lock(&port->pint->lock); 297 + 298 + writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_clear); 299 + 300 + spin_unlock(&port->pint->lock); 301 + spin_unlock_irqrestore(&port->lock, flags); 302 + } 303 + 304 + static void adi_gpio_unmask_irq(struct irq_data *d) 305 + { 306 + unsigned long flags; 307 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 308 + struct gpio_pint_regs *regs = port->pint->regs; 309 + 310 + spin_lock_irqsave(&port->lock, flags); 311 + spin_lock(&port->pint->lock); 312 + 313 + writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_set); 314 + 315 + spin_unlock(&port->pint->lock); 316 + spin_unlock_irqrestore(&port->lock, flags); 317 + } 318 + 319 + static unsigned int adi_gpio_irq_startup(struct irq_data *d) 320 + { 321 + unsigned long flags; 322 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 323 + struct gpio_pint_regs *regs; 324 + 325 + if (!port) { 326 + pr_err("GPIO IRQ %d :Not exist\n", d->irq); 327 + return -ENODEV; 328 + } 329 + 330 + regs = port->pint->regs; 331 + 332 + spin_lock_irqsave(&port->lock, flags); 333 + spin_lock(&port->pint->lock); 334 + 335 + port_setup(port, d->hwirq, true); 336 + writew(BIT(d->hwirq), &port->regs->dir_clear); 337 + writew(readw(&port->regs->inen) | BIT(d->hwirq), &port->regs->inen); 338 + 339 + writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_set); 340 + 341 + spin_unlock(&port->pint->lock); 342 + spin_unlock_irqrestore(&port->lock, flags); 343 + 344 + return 0; 345 + } 346 + 347 + static void adi_gpio_irq_shutdown(struct irq_data *d) 348 + { 349 + unsigned long flags; 350 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 351 + struct gpio_pint_regs *regs = port->pint->regs; 352 + 353 + spin_lock_irqsave(&port->lock, flags); 354 + spin_lock(&port->pint->lock); 355 + 356 + writel(hwirq_to_pintbit(port, d->hwirq), &regs->mask_clear); 357 + 358 + spin_unlock(&port->pint->lock); 359 + spin_unlock_irqrestore(&port->lock, flags); 360 + } 361 + 362 + static int adi_gpio_irq_type(struct irq_data *d, unsigned int type) 363 + { 364 + unsigned long flags; 365 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 366 + struct gpio_pint_regs *pint_regs; 367 + unsigned pintmask; 368 + unsigned int irq = d->irq; 369 + int ret = 0; 370 + char buf[16]; 371 + 372 + if (!port) { 373 + pr_err("GPIO IRQ %d :Not exist\n", d->irq); 374 + return -ENODEV; 375 + } 376 + 377 + pint_regs = port->pint->regs; 378 + 379 + pintmask = hwirq_to_pintbit(port, d->hwirq); 380 + 381 + spin_lock_irqsave(&port->lock, flags); 382 + spin_lock(&port->pint->lock); 383 + 384 + /* In case of interrupt autodetect, set irq type to edge sensitive. */ 385 + if (type == IRQ_TYPE_PROBE) 386 + type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING; 387 + 388 + if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING | 389 + IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) { 390 + snprintf(buf, 16, "gpio-irq%d", irq); 391 + port_setup(port, d->hwirq, true); 392 + } else 393 + goto out; 394 + 395 + /* The GPIO interrupt is triggered only when its input value 396 + * transfer from 0 to 1. So, invert the input value if the 397 + * irq type is low or falling 398 + */ 399 + if ((type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_LEVEL_LOW))) 400 + writel(pintmask, &pint_regs->invert_set); 401 + else 402 + writel(pintmask, &pint_regs->invert_clear); 403 + 404 + /* In edge sensitive case, if the input value of the requested irq 405 + * is already 1, invert it. 406 + */ 407 + if ((type & IRQ_TYPE_EDGE_BOTH) == IRQ_TYPE_EDGE_BOTH) { 408 + if (gpio_get_value(port->chip.base + d->hwirq)) 409 + writel(pintmask, &pint_regs->invert_set); 410 + else 411 + writel(pintmask, &pint_regs->invert_clear); 412 + } 413 + 414 + if (type & (IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING)) { 415 + writel(pintmask, &pint_regs->edge_set); 416 + __irq_set_handler_locked(irq, handle_edge_irq); 417 + } else { 418 + writel(pintmask, &pint_regs->edge_clear); 419 + __irq_set_handler_locked(irq, handle_level_irq); 420 + } 421 + 422 + out: 423 + spin_unlock(&port->pint->lock); 424 + spin_unlock_irqrestore(&port->lock, flags); 425 + 426 + return ret; 427 + } 428 + 429 + #ifdef CONFIG_PM 430 + static int adi_gpio_set_wake(struct irq_data *d, unsigned int state) 431 + { 432 + struct gpio_port *port = irq_data_get_irq_chip_data(d); 433 + 434 + if (!port || !port->pint || port->pint->irq != d->irq) 435 + return -EINVAL; 436 + 437 + #ifndef SEC_GCTL 438 + adi_internal_set_wake(port->pint->irq, state); 439 + #endif 440 + 441 + return 0; 442 + } 443 + 444 + static int adi_pint_suspend(void) 445 + { 446 + struct gpio_pint *pint; 447 + 448 + list_for_each_entry(pint, &adi_pint_list, node) { 449 + writel(0xffffffff, &pint->regs->mask_clear); 450 + pint->saved_data.assign = readl(&pint->regs->assign); 451 + pint->saved_data.edge_set = readl(&pint->regs->edge_set); 452 + pint->saved_data.invert_set = readl(&pint->regs->invert_set); 453 + } 454 + 455 + return 0; 456 + } 457 + 458 + static void adi_pint_resume(void) 459 + { 460 + struct gpio_pint *pint; 461 + 462 + list_for_each_entry(pint, &adi_pint_list, node) { 463 + writel(pint->saved_data.assign, &pint->regs->assign); 464 + writel(pint->saved_data.edge_set, &pint->regs->edge_set); 465 + writel(pint->saved_data.invert_set, &pint->regs->invert_set); 466 + } 467 + } 468 + 469 + static int adi_gpio_suspend(void) 470 + { 471 + struct gpio_port *port; 472 + 473 + list_for_each_entry(port, &adi_gpio_port_list, node) { 474 + port->saved_data.fer = readw(&port->regs->port_fer); 475 + port->saved_data.mux = readl(&port->regs->port_mux); 476 + port->saved_data.data = readw(&port->regs->data); 477 + port->saved_data.inen = readw(&port->regs->inen); 478 + port->saved_data.dir = readw(&port->regs->dir_set); 479 + } 480 + 481 + return adi_pint_suspend(); 482 + } 483 + 484 + static void adi_gpio_resume(void) 485 + { 486 + struct gpio_port *port; 487 + 488 + adi_pint_resume(); 489 + 490 + list_for_each_entry(port, &adi_gpio_port_list, node) { 491 + writel(port->saved_data.mux, &port->regs->port_mux); 492 + writew(port->saved_data.fer, &port->regs->port_fer); 493 + writew(port->saved_data.inen, &port->regs->inen); 494 + writew(port->saved_data.data & port->saved_data.dir, 495 + &port->regs->data_set); 496 + writew(port->saved_data.dir, &port->regs->dir_set); 497 + } 498 + 499 + } 500 + 501 + static struct syscore_ops gpio_pm_syscore_ops = { 502 + .suspend = adi_gpio_suspend, 503 + .resume = adi_gpio_resume, 504 + }; 505 + #else /* CONFIG_PM */ 506 + #define adi_gpio_set_wake NULL 507 + #endif /* CONFIG_PM */ 508 + 509 + #ifdef CONFIG_IRQ_PREFLOW_FASTEOI 510 + static inline void preflow_handler(struct irq_desc *desc) 511 + { 512 + if (desc->preflow_handler) 513 + desc->preflow_handler(&desc->irq_data); 514 + } 515 + #else 516 + static inline void preflow_handler(struct irq_desc *desc) { } 517 + #endif 518 + 519 + static void adi_gpio_handle_pint_irq(unsigned int inta_irq, 520 + struct irq_desc *desc) 521 + { 522 + u32 request; 523 + u32 level_mask, hwirq; 524 + bool umask = false; 525 + struct gpio_pint *pint = irq_desc_get_handler_data(desc); 526 + struct irq_chip *chip = irq_desc_get_chip(desc); 527 + struct gpio_pint_regs *regs = pint->regs; 528 + struct irq_domain *domain; 529 + 530 + preflow_handler(desc); 531 + chained_irq_enter(chip, desc); 532 + 533 + request = readl(&regs->request); 534 + level_mask = readl(&regs->edge_set) & request; 535 + 536 + hwirq = 0; 537 + domain = pint->domain[0]; 538 + while (request) { 539 + /* domain pointer need to be changed only once at IRQ 16 when 540 + * we go through IRQ requests from bit 0 to bit 31. 541 + */ 542 + if (hwirq == PINT_HI_OFFSET) 543 + domain = pint->domain[1]; 544 + 545 + if (request & 1) { 546 + if (level_mask & BIT(hwirq)) { 547 + umask = true; 548 + chained_irq_exit(chip, desc); 549 + } 550 + generic_handle_irq(irq_find_mapping(domain, 551 + hwirq % PINT_HI_OFFSET)); 552 + } 553 + 554 + hwirq++; 555 + request >>= 1; 556 + } 557 + 558 + if (!umask) 559 + chained_irq_exit(chip, desc); 560 + } 561 + 562 + static struct irq_chip adi_gpio_irqchip = { 563 + .name = "GPIO", 564 + .irq_ack = adi_gpio_ack_irq, 565 + .irq_mask = adi_gpio_mask_irq, 566 + .irq_mask_ack = adi_gpio_mask_ack_irq, 567 + .irq_unmask = adi_gpio_unmask_irq, 568 + .irq_disable = adi_gpio_mask_irq, 569 + .irq_enable = adi_gpio_unmask_irq, 570 + .irq_set_type = adi_gpio_irq_type, 571 + .irq_startup = adi_gpio_irq_startup, 572 + .irq_shutdown = adi_gpio_irq_shutdown, 573 + .irq_set_wake = adi_gpio_set_wake, 574 + }; 575 + 576 + static int adi_get_groups_count(struct pinctrl_dev *pctldev) 577 + { 578 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 579 + 580 + return pinctrl->soc->ngroups; 581 + } 582 + 583 + static const char *adi_get_group_name(struct pinctrl_dev *pctldev, 584 + unsigned selector) 585 + { 586 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 587 + 588 + return pinctrl->soc->groups[selector].name; 589 + } 590 + 591 + static int adi_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, 592 + const unsigned **pins, 593 + unsigned *num_pins) 594 + { 595 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 596 + 597 + *pins = pinctrl->soc->groups[selector].pins; 598 + *num_pins = pinctrl->soc->groups[selector].num; 599 + return 0; 600 + } 601 + 602 + static struct pinctrl_ops adi_pctrl_ops = { 603 + .get_groups_count = adi_get_groups_count, 604 + .get_group_name = adi_get_group_name, 605 + .get_group_pins = adi_get_group_pins, 606 + }; 607 + 608 + static int adi_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector, 609 + unsigned group) 610 + { 611 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 612 + struct gpio_port *port; 613 + struct pinctrl_gpio_range *range; 614 + unsigned long flags; 615 + unsigned short *mux, pin; 616 + 617 + mux = (unsigned short *)pinctrl->soc->functions[selector].mux; 618 + 619 + while (*mux) { 620 + pin = P_IDENT(*mux); 621 + 622 + range = pinctrl_find_gpio_range_from_pin(pctldev, pin); 623 + if (range == NULL) /* should not happen */ 624 + return -ENODEV; 625 + 626 + port = container_of(range->gc, struct gpio_port, chip); 627 + 628 + spin_lock_irqsave(&port->lock, flags); 629 + 630 + portmux_setup(port, pin_to_offset(range, pin), 631 + P_FUNCT2MUX(*mux)); 632 + port_setup(port, pin_to_offset(range, pin), false); 633 + mux++; 634 + 635 + spin_unlock_irqrestore(&port->lock, flags); 636 + } 637 + 638 + return 0; 639 + } 640 + 641 + static void adi_pinmux_disable(struct pinctrl_dev *pctldev, unsigned selector, 642 + unsigned group) 643 + { 644 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 645 + struct gpio_port *port; 646 + struct pinctrl_gpio_range *range; 647 + unsigned long flags; 648 + unsigned short *mux, pin; 649 + 650 + mux = (unsigned short *)pinctrl->soc->functions[selector].mux; 651 + 652 + while (*mux) { 653 + pin = P_IDENT(*mux); 654 + 655 + range = pinctrl_find_gpio_range_from_pin(pctldev, pin); 656 + if (range == NULL) /* should not happen */ 657 + return; 658 + 659 + port = container_of(range->gc, struct gpio_port, chip); 660 + 661 + spin_lock_irqsave(&port->lock, flags); 662 + 663 + port_setup(port, pin_to_offset(range, pin), true); 664 + mux++; 665 + 666 + spin_unlock_irqrestore(&port->lock, flags); 667 + } 668 + } 669 + 670 + static int adi_pinmux_get_funcs_count(struct pinctrl_dev *pctldev) 671 + { 672 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 673 + 674 + return pinctrl->soc->nfunctions; 675 + } 676 + 677 + static const char *adi_pinmux_get_func_name(struct pinctrl_dev *pctldev, 678 + unsigned selector) 679 + { 680 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 681 + 682 + return pinctrl->soc->functions[selector].name; 683 + } 684 + 685 + static int adi_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned selector, 686 + const char * const **groups, 687 + unsigned * const num_groups) 688 + { 689 + struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev); 690 + 691 + *groups = pinctrl->soc->functions[selector].groups; 692 + *num_groups = pinctrl->soc->functions[selector].num_groups; 693 + return 0; 694 + } 695 + 696 + static int adi_pinmux_request_gpio(struct pinctrl_dev *pctldev, 697 + struct pinctrl_gpio_range *range, unsigned pin) 698 + { 699 + struct gpio_port *port; 700 + unsigned long flags; 701 + u8 offset; 702 + 703 + port = container_of(range->gc, struct gpio_port, chip); 704 + offset = pin_to_offset(range, pin); 705 + 706 + spin_lock_irqsave(&port->lock, flags); 707 + 708 + port_setup(port, offset, true); 709 + 710 + spin_unlock_irqrestore(&port->lock, flags); 711 + 712 + return 0; 713 + } 714 + 715 + static struct pinmux_ops adi_pinmux_ops = { 716 + .enable = adi_pinmux_enable, 717 + .disable = adi_pinmux_disable, 718 + .get_functions_count = adi_pinmux_get_funcs_count, 719 + .get_function_name = adi_pinmux_get_func_name, 720 + .get_function_groups = adi_pinmux_get_groups, 721 + .gpio_request_enable = adi_pinmux_request_gpio, 722 + }; 723 + 724 + 725 + static struct pinctrl_desc adi_pinmux_desc = { 726 + .name = DRIVER_NAME, 727 + .pctlops = &adi_pctrl_ops, 728 + .pmxops = &adi_pinmux_ops, 729 + .owner = THIS_MODULE, 730 + }; 731 + 732 + static int adi_gpio_request(struct gpio_chip *chip, unsigned offset) 733 + { 734 + return pinctrl_request_gpio(chip->base + offset); 735 + } 736 + 737 + static void adi_gpio_free(struct gpio_chip *chip, unsigned offset) 738 + { 739 + pinctrl_free_gpio(chip->base + offset); 740 + } 741 + 742 + static int adi_gpio_direction_input(struct gpio_chip *chip, unsigned offset) 743 + { 744 + struct gpio_port *port; 745 + unsigned long flags; 746 + 747 + port = container_of(chip, struct gpio_port, chip); 748 + 749 + spin_lock_irqsave(&port->lock, flags); 750 + 751 + writew(BIT(offset), &port->regs->dir_clear); 752 + writew(readw(&port->regs->inen) | BIT(offset), &port->regs->inen); 753 + 754 + spin_unlock_irqrestore(&port->lock, flags); 755 + 756 + return 0; 757 + } 758 + 759 + static void adi_gpio_set_value(struct gpio_chip *chip, unsigned offset, 760 + int value) 761 + { 762 + struct gpio_port *port = container_of(chip, struct gpio_port, chip); 763 + struct gpio_port_t *regs = port->regs; 764 + unsigned long flags; 765 + 766 + spin_lock_irqsave(&port->lock, flags); 767 + 768 + if (value) 769 + writew(BIT(offset), &regs->data_set); 770 + else 771 + writew(BIT(offset), &regs->data_clear); 772 + 773 + spin_unlock_irqrestore(&port->lock, flags); 774 + } 775 + 776 + static int adi_gpio_direction_output(struct gpio_chip *chip, unsigned offset, 777 + int value) 778 + { 779 + struct gpio_port *port = container_of(chip, struct gpio_port, chip); 780 + struct gpio_port_t *regs = port->regs; 781 + unsigned long flags; 782 + 783 + spin_lock_irqsave(&port->lock, flags); 784 + 785 + writew(readw(&regs->inen) & ~BIT(offset), &regs->inen); 786 + if (value) 787 + writew(BIT(offset), &regs->data_set); 788 + else 789 + writew(BIT(offset), &regs->data_clear); 790 + writew(BIT(offset), &regs->dir_set); 791 + 792 + spin_unlock_irqrestore(&port->lock, flags); 793 + 794 + return 0; 795 + } 796 + 797 + static int adi_gpio_get_value(struct gpio_chip *chip, unsigned offset) 798 + { 799 + struct gpio_port *port = container_of(chip, struct gpio_port, chip); 800 + struct gpio_port_t *regs = port->regs; 801 + unsigned long flags; 802 + int ret; 803 + 804 + spin_lock_irqsave(&port->lock, flags); 805 + 806 + ret = !!(readw(&regs->data) & BIT(offset)); 807 + 808 + spin_unlock_irqrestore(&port->lock, flags); 809 + 810 + return ret; 811 + } 812 + 813 + static int adi_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 814 + { 815 + struct gpio_port *port = container_of(chip, struct gpio_port, chip); 816 + 817 + if (port->irq_base >= 0) 818 + return irq_find_mapping(port->domain, offset); 819 + else 820 + return irq_create_mapping(port->domain, offset); 821 + } 822 + 823 + static int adi_pint_map_port(struct gpio_pint *pint, bool assign, u8 map, 824 + struct irq_domain *domain) 825 + { 826 + struct gpio_pint_regs *regs = pint->regs; 827 + u32 map_mask; 828 + 829 + if (pint->map_count > 1) 830 + return -EINVAL; 831 + 832 + pint->map_count++; 833 + 834 + /* The map_mask of each gpio port is a 16-bit duplicate 835 + * of the 8-bit map. It can be set to either high 16 bits or low 836 + * 16 bits of the pint assignment register. 837 + */ 838 + map_mask = (map << 8) | map; 839 + if (assign) { 840 + map_mask <<= PINT_HI_OFFSET; 841 + writel((readl(&regs->assign) & 0xFFFF) | map_mask, 842 + &regs->assign); 843 + } else 844 + writel((readl(&regs->assign) & 0xFFFF0000) | map_mask, 845 + &regs->assign); 846 + 847 + pint->domain[assign] = domain; 848 + 849 + return 0; 850 + } 851 + 852 + static int adi_gpio_pint_probe(struct platform_device *pdev) 853 + { 854 + struct device *dev = &pdev->dev; 855 + struct resource *res; 856 + struct gpio_pint *pint; 857 + 858 + pint = devm_kzalloc(dev, sizeof(struct gpio_pint), GFP_KERNEL); 859 + if (!pint) { 860 + dev_err(dev, "Memory alloc failed\n"); 861 + return -ENOMEM; 862 + } 863 + 864 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 865 + pint->base = devm_ioremap_resource(dev, res); 866 + if (IS_ERR(pint->base)) 867 + return PTR_ERR(pint->base); 868 + 869 + pint->regs = (struct gpio_pint_regs *)pint->base; 870 + 871 + res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 872 + if (!res) { 873 + dev_err(dev, "Invalid IRQ resource\n"); 874 + return -ENODEV; 875 + } 876 + 877 + spin_lock_init(&pint->lock); 878 + 879 + pint->irq = res->start; 880 + pint->pint_map_port = adi_pint_map_port; 881 + platform_set_drvdata(pdev, pint); 882 + 883 + irq_set_chained_handler(pint->irq, adi_gpio_handle_pint_irq); 884 + irq_set_handler_data(pint->irq, pint); 885 + 886 + list_add_tail(&pint->node, &adi_pint_list); 887 + 888 + return 0; 889 + } 890 + 891 + static int adi_gpio_pint_remove(struct platform_device *pdev) 892 + { 893 + struct gpio_pint *pint = platform_get_drvdata(pdev); 894 + 895 + list_del(&pint->node); 896 + irq_set_handler(pint->irq, handle_simple_irq); 897 + 898 + return 0; 899 + } 900 + 901 + static int adi_gpio_irq_map(struct irq_domain *d, unsigned int irq, 902 + irq_hw_number_t hwirq) 903 + { 904 + struct gpio_port *port = d->host_data; 905 + 906 + if (!port) 907 + return -EINVAL; 908 + 909 + irq_set_chip_data(irq, port); 910 + irq_set_chip_and_handler(irq, &adi_gpio_irqchip, 911 + handle_level_irq); 912 + 913 + return 0; 914 + } 915 + 916 + const struct irq_domain_ops adi_gpio_irq_domain_ops = { 917 + .map = adi_gpio_irq_map, 918 + .xlate = irq_domain_xlate_onecell, 919 + }; 920 + 921 + static int adi_gpio_init_int(struct gpio_port *port) 922 + { 923 + struct device_node *node = port->dev->of_node; 924 + struct gpio_pint *pint = port->pint; 925 + int ret; 926 + 927 + port->domain = irq_domain_add_linear(node, port->width, 928 + &adi_gpio_irq_domain_ops, port); 929 + if (!port->domain) { 930 + dev_err(port->dev, "Failed to create irqdomain\n"); 931 + return -ENOSYS; 932 + } 933 + 934 + /* According to BF54x and BF60x HRM, pin interrupt devices are not 935 + * part of the GPIO port device. in GPIO interrupt mode, the GPIO 936 + * pins of multiple port devices can be routed into one pin interrupt 937 + * device. The mapping can be configured by setting pint assignment 938 + * register with the mapping value of different GPIO port. This is 939 + * done via function pint_map_port(). 940 + */ 941 + ret = pint->pint_map_port(port->pint, port->pint_assign, 942 + port->pint_map, port->domain); 943 + if (ret) 944 + return ret; 945 + 946 + if (port->irq_base >= 0) { 947 + ret = irq_create_strict_mappings(port->domain, port->irq_base, 948 + 0, port->width); 949 + if (ret) { 950 + dev_err(port->dev, "Couldn't associate to domain\n"); 951 + return ret; 952 + } 953 + } 954 + 955 + return 0; 956 + } 957 + 958 + #define DEVNAME_SIZE 16 959 + 960 + static int adi_gpio_probe(struct platform_device *pdev) 961 + { 962 + struct device *dev = &pdev->dev; 963 + const struct adi_pinctrl_gpio_platform_data *pdata; 964 + struct resource *res; 965 + struct gpio_port *port; 966 + char pinctrl_devname[DEVNAME_SIZE]; 967 + static int gpio; 968 + int ret = 0, ret1; 969 + 970 + pdata = dev->platform_data; 971 + if (!pdata) 972 + return -EINVAL; 973 + 974 + port = devm_kzalloc(dev, sizeof(struct gpio_port), GFP_KERNEL); 975 + if (!port) { 976 + dev_err(dev, "Memory alloc failed\n"); 977 + return -ENOMEM; 978 + } 979 + 980 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 981 + port->base = devm_ioremap_resource(dev, res); 982 + if (IS_ERR(port->base)) 983 + return PTR_ERR(port->base); 984 + 985 + res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); 986 + if (!res) 987 + port->irq_base = -1; 988 + else 989 + port->irq_base = res->start; 990 + 991 + port->width = pdata->port_width; 992 + port->dev = dev; 993 + port->regs = (struct gpio_port_t *)port->base; 994 + port->pint_assign = pdata->pint_assign; 995 + port->pint_map = pdata->pint_map; 996 + 997 + port->pint = find_gpio_pint(pdata->pint_id); 998 + if (port->pint) { 999 + ret = adi_gpio_init_int(port); 1000 + if (ret) 1001 + return ret; 1002 + } 1003 + 1004 + spin_lock_init(&port->lock); 1005 + 1006 + platform_set_drvdata(pdev, port); 1007 + 1008 + port->chip.label = "adi-gpio"; 1009 + port->chip.direction_input = adi_gpio_direction_input; 1010 + port->chip.get = adi_gpio_get_value; 1011 + port->chip.direction_output = adi_gpio_direction_output; 1012 + port->chip.set = adi_gpio_set_value; 1013 + port->chip.request = adi_gpio_request; 1014 + port->chip.free = adi_gpio_free; 1015 + port->chip.to_irq = adi_gpio_to_irq; 1016 + if (pdata->port_gpio_base > 0) 1017 + port->chip.base = pdata->port_gpio_base; 1018 + else 1019 + port->chip.base = gpio; 1020 + port->chip.ngpio = port->width; 1021 + gpio = port->chip.base + port->width; 1022 + 1023 + ret = gpiochip_add(&port->chip); 1024 + if (ret) { 1025 + dev_err(&pdev->dev, "Fail to add GPIO chip.\n"); 1026 + goto out_remove_domain; 1027 + } 1028 + 1029 + /* Add gpio pin range */ 1030 + snprintf(pinctrl_devname, DEVNAME_SIZE, "pinctrl-adi2.%d", 1031 + pdata->pinctrl_id); 1032 + pinctrl_devname[DEVNAME_SIZE - 1] = 0; 1033 + ret = gpiochip_add_pin_range(&port->chip, pinctrl_devname, 1034 + 0, pdata->port_pin_base, port->width); 1035 + if (ret) { 1036 + dev_err(&pdev->dev, "Fail to add pin range to %s.\n", 1037 + pinctrl_devname); 1038 + goto out_remove_gpiochip; 1039 + } 1040 + 1041 + list_add_tail(&port->node, &adi_gpio_port_list); 1042 + 1043 + return 0; 1044 + 1045 + out_remove_gpiochip: 1046 + ret1 = gpiochip_remove(&port->chip); 1047 + out_remove_domain: 1048 + if (port->pint) 1049 + irq_domain_remove(port->domain); 1050 + 1051 + return ret; 1052 + } 1053 + 1054 + static int adi_gpio_remove(struct platform_device *pdev) 1055 + { 1056 + struct gpio_port *port = platform_get_drvdata(pdev); 1057 + int ret; 1058 + u8 offset; 1059 + 1060 + list_del(&port->node); 1061 + gpiochip_remove_pin_ranges(&port->chip); 1062 + ret = gpiochip_remove(&port->chip); 1063 + if (port->pint) { 1064 + for (offset = 0; offset < port->width; offset++) 1065 + irq_dispose_mapping(irq_find_mapping(port->domain, 1066 + offset)); 1067 + irq_domain_remove(port->domain); 1068 + } 1069 + 1070 + return ret; 1071 + } 1072 + 1073 + static int adi_pinctrl_probe(struct platform_device *pdev) 1074 + { 1075 + struct adi_pinctrl *pinctrl; 1076 + 1077 + pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL); 1078 + if (!pinctrl) 1079 + return -ENOMEM; 1080 + 1081 + pinctrl->dev = &pdev->dev; 1082 + 1083 + adi_pinctrl_soc_init(&pinctrl->soc); 1084 + 1085 + adi_pinmux_desc.pins = pinctrl->soc->pins; 1086 + adi_pinmux_desc.npins = pinctrl->soc->npins; 1087 + 1088 + /* Now register the pin controller and all pins it handles */ 1089 + pinctrl->pctl = pinctrl_register(&adi_pinmux_desc, &pdev->dev, pinctrl); 1090 + if (!pinctrl->pctl) { 1091 + dev_err(&pdev->dev, "could not register pinctrl ADI2 driver\n"); 1092 + return -EINVAL; 1093 + } 1094 + 1095 + platform_set_drvdata(pdev, pinctrl); 1096 + 1097 + return 0; 1098 + } 1099 + 1100 + static int adi_pinctrl_remove(struct platform_device *pdev) 1101 + { 1102 + struct adi_pinctrl *pinctrl = platform_get_drvdata(pdev); 1103 + 1104 + pinctrl_unregister(pinctrl->pctl); 1105 + 1106 + return 0; 1107 + } 1108 + 1109 + static struct platform_driver adi_pinctrl_driver = { 1110 + .probe = adi_pinctrl_probe, 1111 + .remove = adi_pinctrl_remove, 1112 + .driver = { 1113 + .name = DRIVER_NAME, 1114 + }, 1115 + }; 1116 + 1117 + static struct platform_driver adi_gpio_pint_driver = { 1118 + .probe = adi_gpio_pint_probe, 1119 + .remove = adi_gpio_pint_remove, 1120 + .driver = { 1121 + .name = "adi-gpio-pint", 1122 + }, 1123 + }; 1124 + 1125 + static struct platform_driver adi_gpio_driver = { 1126 + .probe = adi_gpio_probe, 1127 + .remove = adi_gpio_remove, 1128 + .driver = { 1129 + .name = "adi-gpio", 1130 + }, 1131 + }; 1132 + 1133 + static int __init adi_pinctrl_setup(void) 1134 + { 1135 + int ret; 1136 + 1137 + ret = platform_driver_register(&adi_pinctrl_driver); 1138 + if (ret) 1139 + return ret; 1140 + 1141 + ret = platform_driver_register(&adi_gpio_pint_driver); 1142 + if (ret) 1143 + goto pint_error; 1144 + 1145 + ret = platform_driver_register(&adi_gpio_driver); 1146 + if (ret) 1147 + goto gpio_error; 1148 + 1149 + #ifdef CONFIG_PM 1150 + register_syscore_ops(&gpio_pm_syscore_ops); 1151 + #endif 1152 + return ret; 1153 + gpio_error: 1154 + platform_driver_unregister(&adi_gpio_pint_driver); 1155 + pint_error: 1156 + platform_driver_unregister(&adi_pinctrl_driver); 1157 + 1158 + return ret; 1159 + } 1160 + arch_initcall(adi_pinctrl_setup); 1161 + 1162 + MODULE_AUTHOR("Sonic Zhang <sonic.zhang@analog.com>"); 1163 + MODULE_DESCRIPTION("ADI gpio2 pin control driver"); 1164 + MODULE_LICENSE("GPL");
+75
drivers/pinctrl/pinctrl-adi2.h
··· 1 + /* 2 + * Pinctrl Driver for ADI GPIO2 controller 3 + * 4 + * Copyright 2007-2013 Analog Devices Inc. 5 + * 6 + * Licensed under the GPLv2 or later 7 + */ 8 + 9 + #ifndef PINCTRL_PINCTRL_ADI2_H 10 + #define PINCTRL_PINCTRL_ADI2_H 11 + 12 + #include <linux/pinctrl/pinctrl.h> 13 + 14 + /** 15 + * struct adi_pin_group - describes a pin group 16 + * @name: the name of this pin group 17 + * @pins: an array of pins 18 + * @num: the number of pins in this array 19 + */ 20 + struct adi_pin_group { 21 + const char *name; 22 + const unsigned *pins; 23 + const unsigned num; 24 + }; 25 + 26 + #define ADI_PIN_GROUP(n, p) \ 27 + { \ 28 + .name = n, \ 29 + .pins = p, \ 30 + .num = ARRAY_SIZE(p), \ 31 + } 32 + 33 + /** 34 + * struct adi_pmx_func - describes function mux setting of pin groups 35 + * @name: the name of this function mux setting 36 + * @groups: an array of pin groups 37 + * @num_groups: the number of pin groups in this array 38 + * @mux: the function mux setting array, end by zero 39 + */ 40 + struct adi_pmx_func { 41 + const char *name; 42 + const char * const *groups; 43 + const unsigned num_groups; 44 + const unsigned short *mux; 45 + }; 46 + 47 + #define ADI_PMX_FUNCTION(n, g, m) \ 48 + { \ 49 + .name = n, \ 50 + .groups = g, \ 51 + .num_groups = ARRAY_SIZE(g), \ 52 + .mux = m, \ 53 + } 54 + 55 + /** 56 + * struct adi_pinctrl_soc_data - ADI pin controller per-SoC configuration 57 + * @functions: The functions supported on this SoC. 58 + * @nfunction: The number of entries in @functions. 59 + * @groups: An array describing all pin groups the pin SoC supports. 60 + * @ngroups: The number of entries in @groups. 61 + * @pins: An array describing all pins the pin controller affects. 62 + * @npins: The number of entries in @pins. 63 + */ 64 + struct adi_pinctrl_soc_data { 65 + const struct adi_pmx_func *functions; 66 + int nfunctions; 67 + const struct adi_pin_group *groups; 68 + int ngroups; 69 + const struct pinctrl_pin_desc *pins; 70 + int npins; 71 + }; 72 + 73 + void adi_pinctrl_soc_init(const struct adi_pinctrl_soc_data **soc); 74 + 75 + #endif /* PINCTRL_PINCTRL_ADI2_H */
+630
drivers/pinctrl/pinctrl-as3722.c
··· 1 + /* 2 + * ams AS3722 pin control and GPIO driver. 3 + * 4 + * Copyright (c) 2013, NVIDIA Corporation. 5 + * 6 + * Author: Laxman Dewangan <ldewangan@nvidia.com> 7 + * 8 + * This program is free software; you can redistribute it and/or 9 + * modify it under the terms of the GNU General Public License as 10 + * published by the Free Software Foundation version 2. 11 + * 12 + * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind, 13 + * whether express or implied; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 + * General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 20 + * 02111-1307, USA 21 + */ 22 + 23 + #include <linux/delay.h> 24 + #include <linux/gpio.h> 25 + #include <linux/kernel.h> 26 + #include <linux/module.h> 27 + #include <linux/mfd/as3722.h> 28 + #include <linux/of.h> 29 + #include <linux/of_device.h> 30 + #include <linux/platform_device.h> 31 + #include <linux/pinctrl/consumer.h> 32 + #include <linux/pinctrl/machine.h> 33 + #include <linux/pinctrl/pinctrl.h> 34 + #include <linux/pinctrl/pinconf-generic.h> 35 + #include <linux/pinctrl/pinconf.h> 36 + #include <linux/pinctrl/pinmux.h> 37 + #include <linux/pm.h> 38 + #include <linux/slab.h> 39 + 40 + #include "core.h" 41 + #include "pinconf.h" 42 + #include "pinctrl-utils.h" 43 + 44 + #define AS3722_PIN_GPIO0 0 45 + #define AS3722_PIN_GPIO1 1 46 + #define AS3722_PIN_GPIO2 2 47 + #define AS3722_PIN_GPIO3 3 48 + #define AS3722_PIN_GPIO4 4 49 + #define AS3722_PIN_GPIO5 5 50 + #define AS3722_PIN_GPIO6 6 51 + #define AS3722_PIN_GPIO7 7 52 + #define AS3722_PIN_NUM (AS3722_PIN_GPIO7 + 1) 53 + 54 + #define AS3722_GPIO_MODE_PULL_UP BIT(PIN_CONFIG_BIAS_PULL_UP) 55 + #define AS3722_GPIO_MODE_PULL_DOWN BIT(PIN_CONFIG_BIAS_PULL_DOWN) 56 + #define AS3722_GPIO_MODE_HIGH_IMPED BIT(PIN_CONFIG_BIAS_HIGH_IMPEDANCE) 57 + #define AS3722_GPIO_MODE_OPEN_DRAIN BIT(PIN_CONFIG_DRIVE_OPEN_DRAIN) 58 + 59 + struct as3722_pin_function { 60 + const char *name; 61 + const char * const *groups; 62 + unsigned ngroups; 63 + int mux_option; 64 + }; 65 + 66 + struct as3722_gpio_pin_control { 67 + bool enable_gpio_invert; 68 + unsigned mode_prop; 69 + int io_function; 70 + }; 71 + 72 + struct as3722_pingroup { 73 + const char *name; 74 + const unsigned pins[1]; 75 + unsigned npins; 76 + }; 77 + 78 + struct as3722_pctrl_info { 79 + struct device *dev; 80 + struct pinctrl_dev *pctl; 81 + struct as3722 *as3722; 82 + struct gpio_chip gpio_chip; 83 + int pins_current_opt[AS3722_PIN_NUM]; 84 + const struct as3722_pin_function *functions; 85 + unsigned num_functions; 86 + const struct as3722_pingroup *pin_groups; 87 + int num_pin_groups; 88 + const struct pinctrl_pin_desc *pins; 89 + unsigned num_pins; 90 + struct as3722_gpio_pin_control gpio_control[AS3722_PIN_NUM]; 91 + }; 92 + 93 + static const struct pinctrl_pin_desc as3722_pins_desc[] = { 94 + PINCTRL_PIN(AS3722_PIN_GPIO0, "gpio0"), 95 + PINCTRL_PIN(AS3722_PIN_GPIO1, "gpio1"), 96 + PINCTRL_PIN(AS3722_PIN_GPIO2, "gpio2"), 97 + PINCTRL_PIN(AS3722_PIN_GPIO3, "gpio3"), 98 + PINCTRL_PIN(AS3722_PIN_GPIO4, "gpio4"), 99 + PINCTRL_PIN(AS3722_PIN_GPIO5, "gpio5"), 100 + PINCTRL_PIN(AS3722_PIN_GPIO6, "gpio6"), 101 + PINCTRL_PIN(AS3722_PIN_GPIO7, "gpio7"), 102 + }; 103 + 104 + static const char * const gpio_groups[] = { 105 + "gpio0", 106 + "gpio1", 107 + "gpio2", 108 + "gpio3", 109 + "gpio4", 110 + "gpio5", 111 + "gpio6", 112 + "gpio7", 113 + }; 114 + 115 + enum as3722_pinmux_option { 116 + AS3722_PINMUX_GPIO = 0, 117 + AS3722_PINMUX_INTERRUPT_OUT = 1, 118 + AS3722_PINMUX_VSUB_VBAT_UNDEB_LOW_OUT = 2, 119 + AS3722_PINMUX_GPIO_INTERRUPT = 3, 120 + AS3722_PINMUX_PWM_INPUT = 4, 121 + AS3722_PINMUX_VOLTAGE_IN_STBY = 5, 122 + AS3722_PINMUX_OC_PG_SD0 = 6, 123 + AS3722_PINMUX_PG_OUT = 7, 124 + AS3722_PINMUX_CLK32K_OUT = 8, 125 + AS3722_PINMUX_WATCHDOG_INPUT = 9, 126 + AS3722_PINMUX_SOFT_RESET_IN = 11, 127 + AS3722_PINMUX_PWM_OUTPUT = 12, 128 + AS3722_PINMUX_VSUB_VBAT_LOW_DEB_OUT = 13, 129 + AS3722_PINMUX_OC_PG_SD6 = 14, 130 + }; 131 + 132 + #define FUNCTION_GROUP(fname, mux) \ 133 + { \ 134 + .name = #fname, \ 135 + .groups = gpio_groups, \ 136 + .ngroups = ARRAY_SIZE(gpio_groups), \ 137 + .mux_option = AS3722_PINMUX_##mux, \ 138 + } 139 + 140 + static const struct as3722_pin_function as3722_pin_function[] = { 141 + FUNCTION_GROUP(gpio, GPIO), 142 + FUNCTION_GROUP(interrupt-out, INTERRUPT_OUT), 143 + FUNCTION_GROUP(gpio-in-interrupt, GPIO_INTERRUPT), 144 + FUNCTION_GROUP(vsup-vbat-low-undebounce-out, VSUB_VBAT_UNDEB_LOW_OUT), 145 + FUNCTION_GROUP(vsup-vbat-low-debounce-out, VSUB_VBAT_LOW_DEB_OUT), 146 + FUNCTION_GROUP(voltage-in-standby, VOLTAGE_IN_STBY), 147 + FUNCTION_GROUP(oc-pg-sd0, OC_PG_SD0), 148 + FUNCTION_GROUP(oc-pg-sd6, OC_PG_SD6), 149 + FUNCTION_GROUP(powergood-out, PG_OUT), 150 + FUNCTION_GROUP(pwm-in, PWM_INPUT), 151 + FUNCTION_GROUP(pwm-out, PWM_OUTPUT), 152 + FUNCTION_GROUP(clk32k-out, CLK32K_OUT), 153 + FUNCTION_GROUP(watchdog-in, WATCHDOG_INPUT), 154 + FUNCTION_GROUP(soft-reset-in, SOFT_RESET_IN), 155 + }; 156 + 157 + #define AS3722_PINGROUP(pg_name, pin_id) \ 158 + { \ 159 + .name = #pg_name, \ 160 + .pins = {AS3722_PIN_##pin_id}, \ 161 + .npins = 1, \ 162 + } 163 + 164 + static const struct as3722_pingroup as3722_pingroups[] = { 165 + AS3722_PINGROUP(gpio0, GPIO0), 166 + AS3722_PINGROUP(gpio1, GPIO1), 167 + AS3722_PINGROUP(gpio2, GPIO2), 168 + AS3722_PINGROUP(gpio3, GPIO3), 169 + AS3722_PINGROUP(gpio4, GPIO4), 170 + AS3722_PINGROUP(gpio5, GPIO5), 171 + AS3722_PINGROUP(gpio6, GPIO6), 172 + AS3722_PINGROUP(gpio7, GPIO7), 173 + }; 174 + 175 + static int as3722_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) 176 + { 177 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 178 + 179 + return as_pci->num_pin_groups; 180 + } 181 + 182 + static const char *as3722_pinctrl_get_group_name(struct pinctrl_dev *pctldev, 183 + unsigned group) 184 + { 185 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 186 + 187 + return as_pci->pin_groups[group].name; 188 + } 189 + 190 + static int as3722_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 191 + unsigned group, const unsigned **pins, unsigned *num_pins) 192 + { 193 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 194 + 195 + *pins = as_pci->pin_groups[group].pins; 196 + *num_pins = as_pci->pin_groups[group].npins; 197 + return 0; 198 + } 199 + 200 + static const struct pinctrl_ops as3722_pinctrl_ops = { 201 + .get_groups_count = as3722_pinctrl_get_groups_count, 202 + .get_group_name = as3722_pinctrl_get_group_name, 203 + .get_group_pins = as3722_pinctrl_get_group_pins, 204 + .dt_node_to_map = pinconf_generic_dt_node_to_map_pin, 205 + .dt_free_map = pinctrl_utils_dt_free_map, 206 + }; 207 + 208 + static int as3722_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) 209 + { 210 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 211 + 212 + return as_pci->num_functions; 213 + } 214 + 215 + static const char *as3722_pinctrl_get_func_name(struct pinctrl_dev *pctldev, 216 + unsigned function) 217 + { 218 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 219 + 220 + return as_pci->functions[function].name; 221 + } 222 + 223 + static int as3722_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, 224 + unsigned function, const char * const **groups, 225 + unsigned * const num_groups) 226 + { 227 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 228 + 229 + *groups = as_pci->functions[function].groups; 230 + *num_groups = as_pci->functions[function].ngroups; 231 + return 0; 232 + } 233 + 234 + static int as3722_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function, 235 + unsigned group) 236 + { 237 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 238 + int gpio_cntr_reg = AS3722_GPIOn_CONTROL_REG(group); 239 + u8 val = AS3722_GPIO_IOSF_VAL(as_pci->functions[function].mux_option); 240 + int ret; 241 + 242 + dev_dbg(as_pci->dev, "%s(): GPIO %u pin to function %u and val %u\n", 243 + __func__, group, function, val); 244 + 245 + ret = as3722_update_bits(as_pci->as3722, gpio_cntr_reg, 246 + AS3722_GPIO_IOSF_MASK, val); 247 + if (ret < 0) { 248 + dev_err(as_pci->dev, "GPIO%d_CTRL_REG update failed %d\n", 249 + group, ret); 250 + return ret; 251 + } 252 + as_pci->gpio_control[group].io_function = function; 253 + return ret; 254 + } 255 + 256 + static int as3722_pinctrl_gpio_get_mode(unsigned gpio_mode_prop, bool input) 257 + { 258 + if (gpio_mode_prop & AS3722_GPIO_MODE_HIGH_IMPED) 259 + return -EINVAL; 260 + 261 + if (gpio_mode_prop & AS3722_GPIO_MODE_OPEN_DRAIN) { 262 + if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_UP) 263 + return AS3722_GPIO_MODE_IO_OPEN_DRAIN_PULL_UP; 264 + return AS3722_GPIO_MODE_IO_OPEN_DRAIN; 265 + } 266 + if (input) { 267 + if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_UP) 268 + return AS3722_GPIO_MODE_INPUT_PULL_UP; 269 + else if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_DOWN) 270 + return AS3722_GPIO_MODE_INPUT_PULL_DOWN; 271 + return AS3722_GPIO_MODE_INPUT; 272 + } 273 + if (gpio_mode_prop & AS3722_GPIO_MODE_PULL_DOWN) 274 + return AS3722_GPIO_MODE_OUTPUT_VDDL; 275 + return AS3722_GPIO_MODE_OUTPUT_VDDH; 276 + } 277 + 278 + static int as3722_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev, 279 + struct pinctrl_gpio_range *range, unsigned offset) 280 + { 281 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 282 + 283 + if (as_pci->gpio_control[offset].io_function) 284 + return -EBUSY; 285 + return 0; 286 + } 287 + 288 + static int as3722_pinctrl_gpio_set_direction(struct pinctrl_dev *pctldev, 289 + struct pinctrl_gpio_range *range, unsigned offset, bool input) 290 + { 291 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 292 + struct as3722 *as3722 = as_pci->as3722; 293 + int mode; 294 + 295 + mode = as3722_pinctrl_gpio_get_mode( 296 + as_pci->gpio_control[offset].mode_prop, input); 297 + if (mode < 0) { 298 + dev_err(as_pci->dev, "%s direction for GPIO %d not supported\n", 299 + (input) ? "Input" : "Output", offset); 300 + return mode; 301 + } 302 + 303 + if (as_pci->gpio_control[offset].enable_gpio_invert) 304 + mode |= AS3722_GPIO_INV; 305 + 306 + return as3722_write(as3722, AS3722_GPIOn_CONTROL_REG(offset), mode); 307 + } 308 + 309 + static const struct pinmux_ops as3722_pinmux_ops = { 310 + .get_functions_count = as3722_pinctrl_get_funcs_count, 311 + .get_function_name = as3722_pinctrl_get_func_name, 312 + .get_function_groups = as3722_pinctrl_get_func_groups, 313 + .enable = as3722_pinctrl_enable, 314 + .gpio_request_enable = as3722_pinctrl_gpio_request_enable, 315 + .gpio_set_direction = as3722_pinctrl_gpio_set_direction, 316 + }; 317 + 318 + static int as3722_pinconf_get(struct pinctrl_dev *pctldev, 319 + unsigned pin, unsigned long *config) 320 + { 321 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 322 + enum pin_config_param param = pinconf_to_config_param(*config); 323 + int arg = 0; 324 + u16 prop; 325 + 326 + switch (param) { 327 + case PIN_CONFIG_BIAS_DISABLE: 328 + prop = AS3722_GPIO_MODE_PULL_UP | 329 + AS3722_GPIO_MODE_PULL_DOWN; 330 + if (!(as_pci->gpio_control[pin].mode_prop & prop)) 331 + arg = 1; 332 + prop = 0; 333 + break; 334 + 335 + case PIN_CONFIG_BIAS_PULL_UP: 336 + prop = AS3722_GPIO_MODE_PULL_UP; 337 + break; 338 + 339 + case PIN_CONFIG_BIAS_PULL_DOWN: 340 + prop = AS3722_GPIO_MODE_PULL_DOWN; 341 + break; 342 + 343 + case PIN_CONFIG_DRIVE_OPEN_DRAIN: 344 + prop = AS3722_GPIO_MODE_OPEN_DRAIN; 345 + break; 346 + 347 + case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: 348 + prop = AS3722_GPIO_MODE_HIGH_IMPED; 349 + break; 350 + 351 + default: 352 + dev_err(as_pci->dev, "Properties not supported\n"); 353 + return -ENOTSUPP; 354 + } 355 + 356 + if (as_pci->gpio_control[pin].mode_prop & prop) 357 + arg = 1; 358 + 359 + *config = pinconf_to_config_packed(param, (u16)arg); 360 + return 0; 361 + } 362 + 363 + static int as3722_pinconf_set(struct pinctrl_dev *pctldev, 364 + unsigned pin, unsigned long *configs, 365 + unsigned num_configs) 366 + { 367 + struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev); 368 + enum pin_config_param param; 369 + int mode_prop; 370 + int i; 371 + 372 + for (i = 0; i < num_configs; i++) { 373 + param = pinconf_to_config_param(configs[i]); 374 + mode_prop = as_pci->gpio_control[pin].mode_prop; 375 + 376 + switch (param) { 377 + case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 378 + break; 379 + 380 + case PIN_CONFIG_BIAS_DISABLE: 381 + mode_prop &= ~(AS3722_GPIO_MODE_PULL_UP | 382 + AS3722_GPIO_MODE_PULL_DOWN); 383 + break; 384 + case PIN_CONFIG_BIAS_PULL_UP: 385 + mode_prop |= AS3722_GPIO_MODE_PULL_UP; 386 + break; 387 + 388 + case PIN_CONFIG_BIAS_PULL_DOWN: 389 + mode_prop |= AS3722_GPIO_MODE_PULL_DOWN; 390 + break; 391 + 392 + case PIN_CONFIG_BIAS_HIGH_IMPEDANCE: 393 + mode_prop |= AS3722_GPIO_MODE_HIGH_IMPED; 394 + break; 395 + 396 + case PIN_CONFIG_DRIVE_OPEN_DRAIN: 397 + mode_prop |= AS3722_GPIO_MODE_OPEN_DRAIN; 398 + break; 399 + 400 + default: 401 + dev_err(as_pci->dev, "Properties not supported\n"); 402 + return -ENOTSUPP; 403 + } 404 + 405 + as_pci->gpio_control[pin].mode_prop = mode_prop; 406 + } 407 + return 0; 408 + } 409 + 410 + static const struct pinconf_ops as3722_pinconf_ops = { 411 + .pin_config_get = as3722_pinconf_get, 412 + .pin_config_set = as3722_pinconf_set, 413 + }; 414 + 415 + static struct pinctrl_desc as3722_pinctrl_desc = { 416 + .pctlops = &as3722_pinctrl_ops, 417 + .pmxops = &as3722_pinmux_ops, 418 + .confops = &as3722_pinconf_ops, 419 + .owner = THIS_MODULE, 420 + }; 421 + 422 + static inline struct as3722_pctrl_info *to_as_pci(struct gpio_chip *chip) 423 + { 424 + return container_of(chip, struct as3722_pctrl_info, gpio_chip); 425 + } 426 + 427 + static int as3722_gpio_get(struct gpio_chip *chip, unsigned offset) 428 + { 429 + struct as3722_pctrl_info *as_pci = to_as_pci(chip); 430 + struct as3722 *as3722 = as_pci->as3722; 431 + int ret; 432 + u32 reg; 433 + u32 control; 434 + u32 val; 435 + int mode; 436 + int invert_enable; 437 + 438 + ret = as3722_read(as3722, AS3722_GPIOn_CONTROL_REG(offset), &control); 439 + if (ret < 0) { 440 + dev_err(as_pci->dev, 441 + "GPIO_CONTROL%d_REG read failed: %d\n", offset, ret); 442 + return ret; 443 + } 444 + 445 + invert_enable = !!(control & AS3722_GPIO_INV); 446 + mode = control & AS3722_GPIO_MODE_MASK; 447 + switch (mode) { 448 + case AS3722_GPIO_MODE_INPUT: 449 + case AS3722_GPIO_MODE_INPUT_PULL_UP: 450 + case AS3722_GPIO_MODE_INPUT_PULL_DOWN: 451 + case AS3722_GPIO_MODE_IO_OPEN_DRAIN: 452 + case AS3722_GPIO_MODE_IO_OPEN_DRAIN_PULL_UP: 453 + reg = AS3722_GPIO_SIGNAL_IN_REG; 454 + break; 455 + case AS3722_GPIO_MODE_OUTPUT_VDDH: 456 + case AS3722_GPIO_MODE_OUTPUT_VDDL: 457 + reg = AS3722_GPIO_SIGNAL_OUT_REG; 458 + break; 459 + default: 460 + return -EINVAL; 461 + } 462 + 463 + ret = as3722_read(as3722, reg, &val); 464 + if (ret < 0) { 465 + dev_err(as_pci->dev, 466 + "GPIO_SIGNAL_IN_REG read failed: %d\n", ret); 467 + return ret; 468 + } 469 + 470 + val = !!(val & AS3722_GPIOn_SIGNAL(offset)); 471 + return (invert_enable) ? !val : val; 472 + } 473 + 474 + static void as3722_gpio_set(struct gpio_chip *chip, unsigned offset, 475 + int value) 476 + { 477 + struct as3722_pctrl_info *as_pci = to_as_pci(chip); 478 + struct as3722 *as3722 = as_pci->as3722; 479 + int en_invert = as_pci->gpio_control[offset].enable_gpio_invert; 480 + u32 val; 481 + int ret; 482 + 483 + if (value) 484 + val = (en_invert) ? 0 : AS3722_GPIOn_SIGNAL(offset); 485 + else 486 + val = (en_invert) ? AS3722_GPIOn_SIGNAL(offset) : 0; 487 + 488 + ret = as3722_update_bits(as3722, AS3722_GPIO_SIGNAL_OUT_REG, 489 + AS3722_GPIOn_SIGNAL(offset), val); 490 + if (ret < 0) 491 + dev_err(as_pci->dev, 492 + "GPIO_SIGNAL_OUT_REG update failed: %d\n", ret); 493 + } 494 + 495 + static int as3722_gpio_direction_input(struct gpio_chip *chip, unsigned offset) 496 + { 497 + return pinctrl_gpio_direction_input(chip->base + offset); 498 + } 499 + 500 + static int as3722_gpio_direction_output(struct gpio_chip *chip, 501 + unsigned offset, int value) 502 + { 503 + as3722_gpio_set(chip, offset, value); 504 + return pinctrl_gpio_direction_output(chip->base + offset); 505 + } 506 + 507 + static int as3722_gpio_to_irq(struct gpio_chip *chip, unsigned offset) 508 + { 509 + struct as3722_pctrl_info *as_pci = to_as_pci(chip); 510 + 511 + return as3722_irq_get_virq(as_pci->as3722, offset); 512 + } 513 + 514 + static int as3722_gpio_request(struct gpio_chip *chip, unsigned offset) 515 + { 516 + return pinctrl_request_gpio(chip->base + offset); 517 + } 518 + 519 + static void as3722_gpio_free(struct gpio_chip *chip, unsigned offset) 520 + { 521 + pinctrl_free_gpio(chip->base + offset); 522 + } 523 + 524 + static const struct gpio_chip as3722_gpio_chip = { 525 + .label = "as3722-gpio", 526 + .owner = THIS_MODULE, 527 + .request = as3722_gpio_request, 528 + .free = as3722_gpio_free, 529 + .get = as3722_gpio_get, 530 + .set = as3722_gpio_set, 531 + .direction_input = as3722_gpio_direction_input, 532 + .direction_output = as3722_gpio_direction_output, 533 + .to_irq = as3722_gpio_to_irq, 534 + .can_sleep = 1, 535 + .ngpio = AS3722_PIN_NUM, 536 + .base = -1, 537 + }; 538 + 539 + static int as3722_pinctrl_probe(struct platform_device *pdev) 540 + { 541 + struct as3722_pctrl_info *as_pci; 542 + int ret; 543 + int tret; 544 + 545 + as_pci = devm_kzalloc(&pdev->dev, sizeof(*as_pci), GFP_KERNEL); 546 + if (!as_pci) 547 + return -ENOMEM; 548 + 549 + as_pci->dev = &pdev->dev; 550 + as_pci->dev->of_node = pdev->dev.parent->of_node; 551 + as_pci->as3722 = dev_get_drvdata(pdev->dev.parent); 552 + platform_set_drvdata(pdev, as_pci); 553 + 554 + as_pci->pins = as3722_pins_desc; 555 + as_pci->num_pins = ARRAY_SIZE(as3722_pins_desc); 556 + as_pci->functions = as3722_pin_function; 557 + as_pci->num_functions = ARRAY_SIZE(as3722_pin_function); 558 + as_pci->pin_groups = as3722_pingroups; 559 + as_pci->num_pin_groups = ARRAY_SIZE(as3722_pingroups); 560 + as3722_pinctrl_desc.name = dev_name(&pdev->dev); 561 + as3722_pinctrl_desc.pins = as3722_pins_desc; 562 + as3722_pinctrl_desc.npins = ARRAY_SIZE(as3722_pins_desc); 563 + as_pci->pctl = pinctrl_register(&as3722_pinctrl_desc, 564 + &pdev->dev, as_pci); 565 + if (!as_pci->pctl) { 566 + dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); 567 + return -EINVAL; 568 + } 569 + 570 + as_pci->gpio_chip = as3722_gpio_chip; 571 + as_pci->gpio_chip.dev = &pdev->dev; 572 + as_pci->gpio_chip.of_node = pdev->dev.parent->of_node; 573 + ret = gpiochip_add(&as_pci->gpio_chip); 574 + if (ret < 0) { 575 + dev_err(&pdev->dev, "Couldn't register gpiochip, %d\n", ret); 576 + goto fail_chip_add; 577 + } 578 + 579 + ret = gpiochip_add_pin_range(&as_pci->gpio_chip, dev_name(&pdev->dev), 580 + 0, 0, AS3722_PIN_NUM); 581 + if (ret < 0) { 582 + dev_err(&pdev->dev, "Couldn't add pin range, %d\n", ret); 583 + goto fail_range_add; 584 + } 585 + 586 + return 0; 587 + 588 + fail_range_add: 589 + tret = gpiochip_remove(&as_pci->gpio_chip); 590 + if (tret < 0) 591 + dev_warn(&pdev->dev, "Couldn't remove gpio chip, %d\n", tret); 592 + 593 + fail_chip_add: 594 + pinctrl_unregister(as_pci->pctl); 595 + return ret; 596 + } 597 + 598 + static int as3722_pinctrl_remove(struct platform_device *pdev) 599 + { 600 + struct as3722_pctrl_info *as_pci = platform_get_drvdata(pdev); 601 + int ret; 602 + 603 + ret = gpiochip_remove(&as_pci->gpio_chip); 604 + if (ret < 0) 605 + return ret; 606 + pinctrl_unregister(as_pci->pctl); 607 + return 0; 608 + } 609 + 610 + static struct of_device_id as3722_pinctrl_of_match[] = { 611 + { .compatible = "ams,as3722-pinctrl", }, 612 + { }, 613 + }; 614 + MODULE_DEVICE_TABLE(of, as3722_pinctrl_of_match); 615 + 616 + static struct platform_driver as3722_pinctrl_driver = { 617 + .driver = { 618 + .name = "as3722-pinctrl", 619 + .owner = THIS_MODULE, 620 + .of_match_table = as3722_pinctrl_of_match, 621 + }, 622 + .probe = as3722_pinctrl_probe, 623 + .remove = as3722_pinctrl_remove, 624 + }; 625 + module_platform_driver(as3722_pinctrl_driver); 626 + 627 + MODULE_ALIAS("platform:as3722-pinctrl"); 628 + MODULE_DESCRIPTION("AS3722 pin control and GPIO driver"); 629 + MODULE_AUTHOR("Laxman Dewangan<ldewangan@nvidia.com>"); 630 + MODULE_LICENSE("GPL v2");
+23 -14
drivers/pinctrl/pinctrl-at91.c
··· 33 33 34 34 #include "core.h" 35 35 36 + #define MAX_GPIO_BANKS 5 36 37 #define MAX_NB_GPIO_PER_BANK 32 37 38 38 39 struct at91_pinctrl_mux_ops; ··· 145 144 void (*mux_C_periph)(void __iomem *pio, unsigned mask); 146 145 void (*mux_D_periph)(void __iomem *pio, unsigned mask); 147 146 bool (*get_deglitch)(void __iomem *pio, unsigned pin); 148 - void (*set_deglitch)(void __iomem *pio, unsigned mask, bool in_on); 147 + void (*set_deglitch)(void __iomem *pio, unsigned mask, bool is_on); 149 148 bool (*get_debounce)(void __iomem *pio, unsigned pin, u32 *div); 150 - void (*set_debounce)(void __iomem *pio, unsigned mask, bool in_on, u32 div); 149 + void (*set_debounce)(void __iomem *pio, unsigned mask, bool is_on, u32 div); 151 150 bool (*get_pulldown)(void __iomem *pio, unsigned pin); 152 - void (*set_pulldown)(void __iomem *pio, unsigned mask, bool in_on); 151 + void (*set_pulldown)(void __iomem *pio, unsigned mask, bool is_on); 153 152 bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin); 154 153 void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask); 155 154 /* irq */ ··· 244 243 int i; 245 244 246 245 /* 247 - * first find the group of this node and check if we need create 246 + * first find the group of this node and check if we need to create 248 247 * config maps for pins 249 248 */ 250 249 grp = at91_pinctrl_find_group_by_name(info, np->name); ··· 418 417 __raw_writel(mask, pio + (is_on ? PIO_IFER : PIO_IFDR)); 419 418 } 420 419 420 + static bool at91_mux_pio3_get_deglitch(void __iomem *pio, unsigned pin) 421 + { 422 + if ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1) 423 + return !((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1); 424 + 425 + return false; 426 + } 427 + 421 428 static void at91_mux_pio3_set_deglitch(void __iomem *pio, unsigned mask, bool is_on) 422 429 { 423 430 if (is_on) ··· 437 428 { 438 429 *div = __raw_readl(pio + PIO_SCDR); 439 430 440 - return (__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1; 431 + return ((__raw_readl(pio + PIO_IFSR) >> pin) & 0x1) && 432 + ((__raw_readl(pio + PIO_IFSCSR) >> pin) & 0x1); 441 433 } 442 434 443 435 static void at91_mux_pio3_set_debounce(void __iomem *pio, unsigned mask, ··· 448 438 __raw_writel(mask, pio + PIO_IFSCER); 449 439 __raw_writel(div & PIO_SCDR_DIV, pio + PIO_SCDR); 450 440 __raw_writel(mask, pio + PIO_IFER); 451 - } else { 452 - __raw_writel(mask, pio + PIO_IFDR); 453 - } 441 + } else 442 + __raw_writel(mask, pio + PIO_IFSCDR); 454 443 } 455 444 456 445 static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin) ··· 487 478 .mux_B_periph = at91_mux_pio3_set_B_periph, 488 479 .mux_C_periph = at91_mux_pio3_set_C_periph, 489 480 .mux_D_periph = at91_mux_pio3_set_D_periph, 490 - .get_deglitch = at91_mux_get_deglitch, 481 + .get_deglitch = at91_mux_pio3_get_deglitch, 491 482 .set_deglitch = at91_mux_pio3_set_deglitch, 492 483 .get_debounce = at91_mux_pio3_get_debounce, 493 484 .set_debounce = at91_mux_pio3_set_debounce, ··· 573 564 info->functions[selector].name, info->groups[group].name); 574 565 575 566 /* first check that all the pins of the group are valid with a valid 576 - * paramter */ 567 + * parameter */ 577 568 for (i = 0; i < npins; i++) { 578 569 pin = &pins_conf[i]; 579 570 ret = pin_check_config(info, info->groups[group].name, i, pin); ··· 967 958 at91_pinctrl_child_count(info, np); 968 959 969 960 if (info->nbanks < 1) { 970 - dev_err(&pdev->dev, "you need to specify atleast one gpio-controller\n"); 961 + dev_err(&pdev->dev, "you need to specify at least one gpio-controller\n"); 971 962 return -EINVAL; 972 963 } 973 964 ··· 1504 1495 if (at91_gpio->pioc_idx) 1505 1496 prev = gpio_chips[at91_gpio->pioc_idx - 1]; 1506 1497 1507 - /* The toplevel handler handles one bank of GPIOs, except 1498 + /* The top level handler handles one bank of GPIOs, except 1508 1499 * on some SoC it can handles up to three... 1509 1500 * We only set up the handler for the first of the list. 1510 1501 */ ··· 1680 1671 .driver = { 1681 1672 .name = "gpio-at91", 1682 1673 .owner = THIS_MODULE, 1683 - .of_match_table = of_match_ptr(at91_gpio_of_match), 1674 + .of_match_table = at91_gpio_of_match, 1684 1675 }, 1685 1676 .probe = at91_gpio_probe, 1686 1677 }; ··· 1689 1680 .driver = { 1690 1681 .name = "pinctrl-at91", 1691 1682 .owner = THIS_MODULE, 1692 - .of_match_table = of_match_ptr(at91_pinctrl_of_match), 1683 + .of_match_table = at91_pinctrl_of_match, 1693 1684 }, 1694 1685 .probe = at91_pinctrl_probe, 1695 1686 .remove = at91_pinctrl_remove,
+1 -1
drivers/pinctrl/pinctrl-exynos5440.c
··· 1048 1048 .driver = { 1049 1049 .name = "exynos5440-pinctrl", 1050 1050 .owner = THIS_MODULE, 1051 - .of_match_table = of_match_ptr(exynos5440_pinctrl_dt_match), 1051 + .of_match_table = exynos5440_pinctrl_dt_match, 1052 1052 }, 1053 1053 }; 1054 1054
+3 -3
drivers/pinctrl/pinctrl-imx.c
··· 245 245 * The input_reg[i] here is actually some IOMUXC general 246 246 * purpose register, not regular select input register. 247 247 */ 248 - val = readl(ipctl->base + pin->input_val); 248 + val = readl(ipctl->base + pin->input_reg); 249 249 val &= ~mask; 250 250 val |= select << shift; 251 - writel(val, ipctl->base + pin->input_val); 252 - } else if (pin->input_val) { 251 + writel(val, ipctl->base + pin->input_reg); 252 + } else if (pin->input_reg) { 253 253 /* 254 254 * Regular select input register can never be at offset 255 255 * 0, and we only print register value for regular case.
+653
drivers/pinctrl/pinctrl-imx1-core.c
··· 1 + /* 2 + * Core driver for the imx pin controller in imx1/21/27 3 + * 4 + * Copyright (C) 2013 Pengutronix 5 + * Author: Markus Pargmann <mpa@pengutronix.de> 6 + * 7 + * Based on pinctrl-imx.c: 8 + * Author: Dong Aisheng <dong.aisheng@linaro.org> 9 + * Copyright (C) 2012 Freescale Semiconductor, Inc. 10 + * Copyright (C) 2012 Linaro Ltd. 11 + * 12 + * This program is free software; you can redistribute it and/or modify 13 + * it under the terms of the GNU General Public License as published by 14 + * the Free Software Foundation; either version 2 of the License, or 15 + * (at your option) any later version. 16 + */ 17 + 18 + #include <linux/bitops.h> 19 + #include <linux/err.h> 20 + #include <linux/init.h> 21 + #include <linux/io.h> 22 + #include <linux/module.h> 23 + #include <linux/of.h> 24 + #include <linux/of_device.h> 25 + #include <linux/pinctrl/machine.h> 26 + #include <linux/pinctrl/pinconf.h> 27 + #include <linux/pinctrl/pinctrl.h> 28 + #include <linux/pinctrl/pinmux.h> 29 + #include <linux/slab.h> 30 + 31 + #include "core.h" 32 + #include "pinctrl-imx1.h" 33 + 34 + struct imx1_pinctrl { 35 + struct device *dev; 36 + struct pinctrl_dev *pctl; 37 + void __iomem *base; 38 + const struct imx1_pinctrl_soc_info *info; 39 + }; 40 + 41 + /* 42 + * MX1 register offsets 43 + */ 44 + 45 + #define MX1_DDIR 0x00 46 + #define MX1_OCR 0x04 47 + #define MX1_ICONFA 0x0c 48 + #define MX1_ICONFB 0x10 49 + #define MX1_GIUS 0x20 50 + #define MX1_GPR 0x38 51 + #define MX1_PUEN 0x40 52 + 53 + #define MX1_PORT_STRIDE 0x100 54 + 55 + 56 + /* 57 + * MUX_ID format defines 58 + */ 59 + #define MX1_MUX_FUNCTION(val) (BIT(0) & val) 60 + #define MX1_MUX_GPIO(val) ((BIT(1) & val) >> 1) 61 + #define MX1_MUX_DIR(val) ((BIT(2) & val) >> 2) 62 + #define MX1_MUX_OCONF(val) (((BIT(4) | BIT(5)) & val) >> 4) 63 + #define MX1_MUX_ICONFA(val) (((BIT(8) | BIT(9)) & val) >> 8) 64 + #define MX1_MUX_ICONFB(val) (((BIT(10) | BIT(11)) & val) >> 10) 65 + 66 + 67 + /* 68 + * IMX1 IOMUXC manages the pins based on ports. Each port has 32 pins. IOMUX 69 + * control register are seperated into function, output configuration, input 70 + * configuration A, input configuration B, GPIO in use and data direction. 71 + * 72 + * Those controls that are represented by 1 bit have a direct mapping between 73 + * bit position and pin id. If they are represented by 2 bit, the lower 16 pins 74 + * are in the first register and the upper 16 pins in the second (next) 75 + * register. pin_id is stored in bit (pin_id%16)*2 and the bit above. 76 + */ 77 + 78 + /* 79 + * Calculates the register offset from a pin_id 80 + */ 81 + static void __iomem *imx1_mem(struct imx1_pinctrl *ipctl, unsigned int pin_id) 82 + { 83 + unsigned int port = pin_id / 32; 84 + return ipctl->base + port * MX1_PORT_STRIDE; 85 + } 86 + 87 + /* 88 + * Write to a register with 2 bits per pin. The function will automatically 89 + * use the next register if the pin is managed in the second register. 90 + */ 91 + static void imx1_write_2bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, 92 + u32 value, u32 reg_offset) 93 + { 94 + void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; 95 + int offset = (pin_id % 16) * 2; /* offset, regardless of register used */ 96 + int mask = ~(0x3 << offset); /* Mask for 2 bits at offset */ 97 + u32 old_val; 98 + u32 new_val; 99 + 100 + dev_dbg(ipctl->dev, "write: register 0x%p offset %d value 0x%x\n", 101 + reg, offset, value); 102 + 103 + /* Use the next register if the pin's port pin number is >=16 */ 104 + if (pin_id % 32 >= 16) 105 + reg += 0x04; 106 + 107 + /* Get current state of pins */ 108 + old_val = readl(reg); 109 + old_val &= mask; 110 + 111 + new_val = value & 0x3; /* Make sure value is really 2 bit */ 112 + new_val <<= offset; 113 + new_val |= old_val;/* Set new state for pin_id */ 114 + 115 + writel(new_val, reg); 116 + } 117 + 118 + static void imx1_write_bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, 119 + u32 value, u32 reg_offset) 120 + { 121 + void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; 122 + int offset = pin_id % 32; 123 + int mask = ~BIT_MASK(offset); 124 + u32 old_val; 125 + u32 new_val; 126 + 127 + /* Get current state of pins */ 128 + old_val = readl(reg); 129 + old_val &= mask; 130 + 131 + new_val = value & 0x1; /* Make sure value is really 1 bit */ 132 + new_val <<= offset; 133 + new_val |= old_val;/* Set new state for pin_id */ 134 + 135 + writel(new_val, reg); 136 + } 137 + 138 + static int imx1_read_2bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, 139 + u32 reg_offset) 140 + { 141 + void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; 142 + int offset = pin_id % 16; 143 + 144 + /* Use the next register if the pin's port pin number is >=16 */ 145 + if (pin_id % 32 >= 16) 146 + reg += 0x04; 147 + 148 + return (readl(reg) & (BIT(offset) | BIT(offset+1))) >> offset; 149 + } 150 + 151 + static int imx1_read_bit(struct imx1_pinctrl *ipctl, unsigned int pin_id, 152 + u32 reg_offset) 153 + { 154 + void __iomem *reg = imx1_mem(ipctl, pin_id) + reg_offset; 155 + int offset = pin_id % 32; 156 + 157 + return !!(readl(reg) & BIT(offset)); 158 + } 159 + 160 + static const inline struct imx1_pin_group *imx1_pinctrl_find_group_by_name( 161 + const struct imx1_pinctrl_soc_info *info, 162 + const char *name) 163 + { 164 + const struct imx1_pin_group *grp = NULL; 165 + int i; 166 + 167 + for (i = 0; i < info->ngroups; i++) { 168 + if (!strcmp(info->groups[i].name, name)) { 169 + grp = &info->groups[i]; 170 + break; 171 + } 172 + } 173 + 174 + return grp; 175 + } 176 + 177 + static int imx1_get_groups_count(struct pinctrl_dev *pctldev) 178 + { 179 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 180 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 181 + 182 + return info->ngroups; 183 + } 184 + 185 + static const char *imx1_get_group_name(struct pinctrl_dev *pctldev, 186 + unsigned selector) 187 + { 188 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 189 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 190 + 191 + return info->groups[selector].name; 192 + } 193 + 194 + static int imx1_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector, 195 + const unsigned int **pins, 196 + unsigned *npins) 197 + { 198 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 199 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 200 + 201 + if (selector >= info->ngroups) 202 + return -EINVAL; 203 + 204 + *pins = info->groups[selector].pin_ids; 205 + *npins = info->groups[selector].npins; 206 + 207 + return 0; 208 + } 209 + 210 + static void imx1_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, 211 + unsigned offset) 212 + { 213 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 214 + 215 + seq_printf(s, "GPIO %d, function %d, direction %d, oconf %d, iconfa %d, iconfb %d", 216 + imx1_read_bit(ipctl, offset, MX1_GIUS), 217 + imx1_read_bit(ipctl, offset, MX1_GPR), 218 + imx1_read_bit(ipctl, offset, MX1_DDIR), 219 + imx1_read_2bit(ipctl, offset, MX1_OCR), 220 + imx1_read_2bit(ipctl, offset, MX1_ICONFA), 221 + imx1_read_2bit(ipctl, offset, MX1_ICONFB)); 222 + } 223 + 224 + static int imx1_dt_node_to_map(struct pinctrl_dev *pctldev, 225 + struct device_node *np, 226 + struct pinctrl_map **map, unsigned *num_maps) 227 + { 228 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 229 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 230 + const struct imx1_pin_group *grp; 231 + struct pinctrl_map *new_map; 232 + struct device_node *parent; 233 + int map_num = 1; 234 + int i, j; 235 + 236 + /* 237 + * first find the group of this node and check if we need create 238 + * config maps for pins 239 + */ 240 + grp = imx1_pinctrl_find_group_by_name(info, np->name); 241 + if (!grp) { 242 + dev_err(info->dev, "unable to find group for node %s\n", 243 + np->name); 244 + return -EINVAL; 245 + } 246 + 247 + for (i = 0; i < grp->npins; i++) 248 + map_num++; 249 + 250 + new_map = kmalloc(sizeof(struct pinctrl_map) * map_num, GFP_KERNEL); 251 + if (!new_map) 252 + return -ENOMEM; 253 + 254 + *map = new_map; 255 + *num_maps = map_num; 256 + 257 + /* create mux map */ 258 + parent = of_get_parent(np); 259 + if (!parent) { 260 + kfree(new_map); 261 + return -EINVAL; 262 + } 263 + new_map[0].type = PIN_MAP_TYPE_MUX_GROUP; 264 + new_map[0].data.mux.function = parent->name; 265 + new_map[0].data.mux.group = np->name; 266 + of_node_put(parent); 267 + 268 + /* create config map */ 269 + new_map++; 270 + for (i = j = 0; i < grp->npins; i++) { 271 + new_map[j].type = PIN_MAP_TYPE_CONFIGS_PIN; 272 + new_map[j].data.configs.group_or_pin = 273 + pin_get_name(pctldev, grp->pins[i].pin_id); 274 + new_map[j].data.configs.configs = &grp->pins[i].config; 275 + new_map[j].data.configs.num_configs = 1; 276 + j++; 277 + } 278 + 279 + dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n", 280 + (*map)->data.mux.function, (*map)->data.mux.group, map_num); 281 + 282 + return 0; 283 + } 284 + 285 + static void imx1_dt_free_map(struct pinctrl_dev *pctldev, 286 + struct pinctrl_map *map, unsigned num_maps) 287 + { 288 + kfree(map); 289 + } 290 + 291 + static const struct pinctrl_ops imx1_pctrl_ops = { 292 + .get_groups_count = imx1_get_groups_count, 293 + .get_group_name = imx1_get_group_name, 294 + .get_group_pins = imx1_get_group_pins, 295 + .pin_dbg_show = imx1_pin_dbg_show, 296 + .dt_node_to_map = imx1_dt_node_to_map, 297 + .dt_free_map = imx1_dt_free_map, 298 + 299 + }; 300 + 301 + static int imx1_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector, 302 + unsigned group) 303 + { 304 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 305 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 306 + const struct imx1_pin *pins; 307 + unsigned int npins; 308 + int i; 309 + 310 + /* 311 + * Configure the mux mode for each pin in the group for a specific 312 + * function. 313 + */ 314 + pins = info->groups[group].pins; 315 + npins = info->groups[group].npins; 316 + 317 + WARN_ON(!pins || !npins); 318 + 319 + dev_dbg(ipctl->dev, "enable function %s group %s\n", 320 + info->functions[selector].name, info->groups[group].name); 321 + 322 + for (i = 0; i < npins; i++) { 323 + unsigned int mux = pins[i].mux_id; 324 + unsigned int pin_id = pins[i].pin_id; 325 + unsigned int afunction = MX1_MUX_FUNCTION(mux); 326 + unsigned int gpio_in_use = MX1_MUX_GPIO(mux); 327 + unsigned int direction = MX1_MUX_DIR(mux); 328 + unsigned int gpio_oconf = MX1_MUX_OCONF(mux); 329 + unsigned int gpio_iconfa = MX1_MUX_ICONFA(mux); 330 + unsigned int gpio_iconfb = MX1_MUX_ICONFB(mux); 331 + 332 + dev_dbg(pctldev->dev, "%s, pin 0x%x, function %d, gpio %d, direction %d, oconf %d, iconfa %d, iconfb %d\n", 333 + __func__, pin_id, afunction, gpio_in_use, 334 + direction, gpio_oconf, gpio_iconfa, 335 + gpio_iconfb); 336 + 337 + imx1_write_bit(ipctl, pin_id, gpio_in_use, MX1_GIUS); 338 + imx1_write_bit(ipctl, pin_id, direction, MX1_DDIR); 339 + 340 + if (gpio_in_use) { 341 + imx1_write_2bit(ipctl, pin_id, gpio_oconf, MX1_OCR); 342 + imx1_write_2bit(ipctl, pin_id, gpio_iconfa, 343 + MX1_ICONFA); 344 + imx1_write_2bit(ipctl, pin_id, gpio_iconfb, 345 + MX1_ICONFB); 346 + } else { 347 + imx1_write_bit(ipctl, pin_id, afunction, MX1_GPR); 348 + } 349 + } 350 + 351 + return 0; 352 + } 353 + 354 + static int imx1_pmx_get_funcs_count(struct pinctrl_dev *pctldev) 355 + { 356 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 357 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 358 + 359 + return info->nfunctions; 360 + } 361 + 362 + static const char *imx1_pmx_get_func_name(struct pinctrl_dev *pctldev, 363 + unsigned selector) 364 + { 365 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 366 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 367 + 368 + return info->functions[selector].name; 369 + } 370 + 371 + static int imx1_pmx_get_groups(struct pinctrl_dev *pctldev, unsigned selector, 372 + const char * const **groups, 373 + unsigned * const num_groups) 374 + { 375 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 376 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 377 + 378 + *groups = info->functions[selector].groups; 379 + *num_groups = info->functions[selector].num_groups; 380 + 381 + return 0; 382 + } 383 + 384 + static const struct pinmux_ops imx1_pmx_ops = { 385 + .get_functions_count = imx1_pmx_get_funcs_count, 386 + .get_function_name = imx1_pmx_get_func_name, 387 + .get_function_groups = imx1_pmx_get_groups, 388 + .enable = imx1_pmx_enable, 389 + }; 390 + 391 + static int imx1_pinconf_get(struct pinctrl_dev *pctldev, 392 + unsigned pin_id, unsigned long *config) 393 + { 394 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 395 + 396 + *config = imx1_read_bit(ipctl, pin_id, MX1_PUEN); 397 + 398 + return 0; 399 + } 400 + 401 + static int imx1_pinconf_set(struct pinctrl_dev *pctldev, 402 + unsigned pin_id, unsigned long *configs, 403 + unsigned num_configs) 404 + { 405 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 406 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 407 + int i; 408 + 409 + for (i = 0; i != num_configs; ++i) { 410 + imx1_write_bit(ipctl, pin_id, configs[i] & 0x01, MX1_PUEN); 411 + 412 + dev_dbg(ipctl->dev, "pinconf set pullup pin %s\n", 413 + info->pins[pin_id].name); 414 + } 415 + 416 + return 0; 417 + } 418 + 419 + static void imx1_pinconf_dbg_show(struct pinctrl_dev *pctldev, 420 + struct seq_file *s, unsigned pin_id) 421 + { 422 + unsigned long config; 423 + 424 + imx1_pinconf_get(pctldev, pin_id, &config); 425 + seq_printf(s, "0x%lx", config); 426 + } 427 + 428 + static void imx1_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, 429 + struct seq_file *s, unsigned group) 430 + { 431 + struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); 432 + const struct imx1_pinctrl_soc_info *info = ipctl->info; 433 + struct imx1_pin_group *grp; 434 + unsigned long config; 435 + const char *name; 436 + int i, ret; 437 + 438 + if (group > info->ngroups) 439 + return; 440 + 441 + seq_puts(s, "\n"); 442 + grp = &info->groups[group]; 443 + for (i = 0; i < grp->npins; i++) { 444 + name = pin_get_name(pctldev, grp->pins[i].pin_id); 445 + ret = imx1_pinconf_get(pctldev, grp->pins[i].pin_id, &config); 446 + if (ret) 447 + return; 448 + seq_printf(s, "%s: 0x%lx", name, config); 449 + } 450 + } 451 + 452 + static const struct pinconf_ops imx1_pinconf_ops = { 453 + .pin_config_get = imx1_pinconf_get, 454 + .pin_config_set = imx1_pinconf_set, 455 + .pin_config_dbg_show = imx1_pinconf_dbg_show, 456 + .pin_config_group_dbg_show = imx1_pinconf_group_dbg_show, 457 + }; 458 + 459 + static struct pinctrl_desc imx1_pinctrl_desc = { 460 + .pctlops = &imx1_pctrl_ops, 461 + .pmxops = &imx1_pmx_ops, 462 + .confops = &imx1_pinconf_ops, 463 + .owner = THIS_MODULE, 464 + }; 465 + 466 + static int imx1_pinctrl_parse_groups(struct device_node *np, 467 + struct imx1_pin_group *grp, 468 + struct imx1_pinctrl_soc_info *info, 469 + u32 index) 470 + { 471 + int size; 472 + const __be32 *list; 473 + int i; 474 + 475 + dev_dbg(info->dev, "group(%d): %s\n", index, np->name); 476 + 477 + /* Initialise group */ 478 + grp->name = np->name; 479 + 480 + /* 481 + * the binding format is fsl,pins = <PIN MUX_ID CONFIG> 482 + */ 483 + list = of_get_property(np, "fsl,pins", &size); 484 + /* we do not check return since it's safe node passed down */ 485 + if (!size || size % 12) { 486 + dev_notice(info->dev, "Not a valid fsl,pins property (%s)\n", 487 + np->name); 488 + return -EINVAL; 489 + } 490 + 491 + grp->npins = size / 12; 492 + grp->pins = devm_kzalloc(info->dev, 493 + grp->npins * sizeof(struct imx1_pin), GFP_KERNEL); 494 + grp->pin_ids = devm_kzalloc(info->dev, 495 + grp->npins * sizeof(unsigned int), GFP_KERNEL); 496 + 497 + if (!grp->pins || !grp->pin_ids) 498 + return -ENOMEM; 499 + 500 + for (i = 0; i < grp->npins; i++) { 501 + grp->pins[i].pin_id = be32_to_cpu(*list++); 502 + grp->pins[i].mux_id = be32_to_cpu(*list++); 503 + grp->pins[i].config = be32_to_cpu(*list++); 504 + 505 + grp->pin_ids[i] = grp->pins[i].pin_id; 506 + } 507 + 508 + return 0; 509 + } 510 + 511 + static int imx1_pinctrl_parse_functions(struct device_node *np, 512 + struct imx1_pinctrl_soc_info *info, 513 + u32 index) 514 + { 515 + struct device_node *child; 516 + struct imx1_pmx_func *func; 517 + struct imx1_pin_group *grp; 518 + int ret; 519 + static u32 grp_index; 520 + u32 i = 0; 521 + 522 + dev_dbg(info->dev, "parse function(%d): %s\n", index, np->name); 523 + 524 + func = &info->functions[index]; 525 + 526 + /* Initialise function */ 527 + func->name = np->name; 528 + func->num_groups = of_get_child_count(np); 529 + if (func->num_groups <= 0) 530 + return -EINVAL; 531 + 532 + func->groups = devm_kzalloc(info->dev, 533 + func->num_groups * sizeof(char *), GFP_KERNEL); 534 + 535 + if (!func->groups) 536 + return -ENOMEM; 537 + 538 + for_each_child_of_node(np, child) { 539 + func->groups[i] = child->name; 540 + grp = &info->groups[grp_index++]; 541 + ret = imx1_pinctrl_parse_groups(child, grp, info, i++); 542 + if (ret == -ENOMEM) 543 + return ret; 544 + } 545 + 546 + return 0; 547 + } 548 + 549 + static int imx1_pinctrl_parse_dt(struct platform_device *pdev, 550 + struct imx1_pinctrl *pctl, struct imx1_pinctrl_soc_info *info) 551 + { 552 + struct device_node *np = pdev->dev.of_node; 553 + struct device_node *child; 554 + int ret; 555 + u32 nfuncs = 0; 556 + u32 ngroups = 0; 557 + u32 ifunc = 0; 558 + 559 + if (!np) 560 + return -ENODEV; 561 + 562 + for_each_child_of_node(np, child) { 563 + ++nfuncs; 564 + ngroups += of_get_child_count(child); 565 + } 566 + 567 + if (!nfuncs) { 568 + dev_err(&pdev->dev, "No pin functions defined\n"); 569 + return -EINVAL; 570 + } 571 + 572 + info->nfunctions = nfuncs; 573 + info->functions = devm_kzalloc(&pdev->dev, 574 + nfuncs * sizeof(struct imx1_pmx_func), GFP_KERNEL); 575 + 576 + info->ngroups = ngroups; 577 + info->groups = devm_kzalloc(&pdev->dev, 578 + ngroups * sizeof(struct imx1_pin_group), GFP_KERNEL); 579 + 580 + 581 + if (!info->functions || !info->groups) 582 + return -ENOMEM; 583 + 584 + for_each_child_of_node(np, child) { 585 + ret = imx1_pinctrl_parse_functions(child, info, ifunc++); 586 + if (ret == -ENOMEM) 587 + return -ENOMEM; 588 + } 589 + 590 + return 0; 591 + } 592 + 593 + int imx1_pinctrl_core_probe(struct platform_device *pdev, 594 + struct imx1_pinctrl_soc_info *info) 595 + { 596 + struct imx1_pinctrl *ipctl; 597 + struct resource *res; 598 + struct pinctrl_desc *pctl_desc; 599 + int ret; 600 + 601 + if (!info || !info->pins || !info->npins) { 602 + dev_err(&pdev->dev, "wrong pinctrl info\n"); 603 + return -EINVAL; 604 + } 605 + info->dev = &pdev->dev; 606 + 607 + /* Create state holders etc for this driver */ 608 + ipctl = devm_kzalloc(&pdev->dev, sizeof(*ipctl), GFP_KERNEL); 609 + if (!ipctl) 610 + return -ENOMEM; 611 + 612 + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 613 + if (!res) 614 + return -ENOENT; 615 + 616 + ipctl->base = devm_ioremap_nocache(&pdev->dev, res->start, 617 + resource_size(res)); 618 + if (!ipctl->base) 619 + return -ENOMEM; 620 + 621 + pctl_desc = &imx1_pinctrl_desc; 622 + pctl_desc->name = dev_name(&pdev->dev); 623 + pctl_desc->pins = info->pins; 624 + pctl_desc->npins = info->npins; 625 + 626 + ret = imx1_pinctrl_parse_dt(pdev, ipctl, info); 627 + if (ret) { 628 + dev_err(&pdev->dev, "fail to probe dt properties\n"); 629 + return ret; 630 + } 631 + 632 + ipctl->info = info; 633 + ipctl->dev = info->dev; 634 + platform_set_drvdata(pdev, ipctl); 635 + ipctl->pctl = pinctrl_register(pctl_desc, &pdev->dev, ipctl); 636 + if (!ipctl->pctl) { 637 + dev_err(&pdev->dev, "could not register IMX pinctrl driver\n"); 638 + return -EINVAL; 639 + } 640 + 641 + dev_info(&pdev->dev, "initialized IMX pinctrl driver\n"); 642 + 643 + return 0; 644 + } 645 + 646 + int imx1_pinctrl_core_remove(struct platform_device *pdev) 647 + { 648 + struct imx1_pinctrl *ipctl = platform_get_drvdata(pdev); 649 + 650 + pinctrl_unregister(ipctl->pctl); 651 + 652 + return 0; 653 + }
+73
drivers/pinctrl/pinctrl-imx1.h
··· 1 + /* 2 + * IMX pinmux core definitions 3 + * 4 + * Copyright (C) 2012 Freescale Semiconductor, Inc. 5 + * Copyright (C) 2012 Linaro Ltd. 6 + * 7 + * Author: Dong Aisheng <dong.aisheng@linaro.org> 8 + * 9 + * This program is free software; you can redistribute it and/or modify 10 + * it under the terms of the GNU General Public License as published by 11 + * the Free Software Foundation; either version 2 of the License, or 12 + * (at your option) any later version. 13 + */ 14 + 15 + #ifndef __DRIVERS_PINCTRL_IMX1_H 16 + #define __DRIVERS_PINCTRL_IMX1_H 17 + 18 + struct platform_device; 19 + 20 + /** 21 + * struct imx1_pin - describes an IMX1/21/27 pin. 22 + * @pin_id: ID of the described pin. 23 + * @mux_id: ID of the mux setup. 24 + * @config: Configuration of the pin (currently only pullup-enable). 25 + */ 26 + struct imx1_pin { 27 + unsigned int pin_id; 28 + unsigned int mux_id; 29 + unsigned long config; 30 + }; 31 + 32 + /** 33 + * struct imx1_pin_group - describes an IMX pin group 34 + * @name: the name of this specific pin group 35 + * @pins: an array of imx1_pin structs used in this group 36 + * @npins: the number of pins in this group array, i.e. the number of 37 + * elements in .pins so we can iterate over that array 38 + */ 39 + struct imx1_pin_group { 40 + const char *name; 41 + unsigned int *pin_ids; 42 + struct imx1_pin *pins; 43 + unsigned npins; 44 + }; 45 + 46 + /** 47 + * struct imx1_pmx_func - describes IMX pinmux functions 48 + * @name: the name of this specific function 49 + * @groups: corresponding pin groups 50 + * @num_groups: the number of groups 51 + */ 52 + struct imx1_pmx_func { 53 + const char *name; 54 + const char **groups; 55 + unsigned num_groups; 56 + }; 57 + 58 + struct imx1_pinctrl_soc_info { 59 + struct device *dev; 60 + const struct pinctrl_pin_desc *pins; 61 + unsigned int npins; 62 + struct imx1_pin_group *groups; 63 + unsigned int ngroups; 64 + struct imx1_pmx_func *functions; 65 + unsigned int nfunctions; 66 + }; 67 + 68 + #define IMX_PINCTRL_PIN(pin) PINCTRL_PIN(pin, #pin) 69 + 70 + int imx1_pinctrl_core_probe(struct platform_device *pdev, 71 + struct imx1_pinctrl_soc_info *info); 72 + int imx1_pinctrl_core_remove(struct platform_device *pdev); 73 + #endif /* __DRIVERS_PINCTRL_IMX1_H */
+477
drivers/pinctrl/pinctrl-imx27.c
··· 1 + /* 2 + * imx27 pinctrl driver based on imx pinmux core 3 + * 4 + * Copyright (C) 2013 Pengutronix 5 + * 6 + * Author: Markus Pargmann <mpa@pengutronix.de> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + */ 13 + 14 + #include <linux/err.h> 15 + #include <linux/init.h> 16 + #include <linux/io.h> 17 + #include <linux/module.h> 18 + #include <linux/of.h> 19 + #include <linux/of_device.h> 20 + #include <linux/pinctrl/pinctrl.h> 21 + 22 + #include "pinctrl-imx1.h" 23 + 24 + #define PAD_ID(port, pin) (port*32 + pin) 25 + #define PA 0 26 + #define PB 1 27 + #define PC 2 28 + #define PD 3 29 + #define PE 4 30 + #define PF 5 31 + 32 + enum imx27_pads { 33 + MX27_PAD_USBH2_CLK = PAD_ID(PA, 0), 34 + MX27_PAD_USBH2_DIR = PAD_ID(PA, 1), 35 + MX27_PAD_USBH2_DATA7 = PAD_ID(PA, 2), 36 + MX27_PAD_USBH2_NXT = PAD_ID(PA, 3), 37 + MX27_PAD_USBH2_STP = PAD_ID(PA, 4), 38 + MX27_PAD_LSCLK = PAD_ID(PA, 5), 39 + MX27_PAD_LD0 = PAD_ID(PA, 6), 40 + MX27_PAD_LD1 = PAD_ID(PA, 7), 41 + MX27_PAD_LD2 = PAD_ID(PA, 8), 42 + MX27_PAD_LD3 = PAD_ID(PA, 9), 43 + MX27_PAD_LD4 = PAD_ID(PA, 10), 44 + MX27_PAD_LD5 = PAD_ID(PA, 11), 45 + MX27_PAD_LD6 = PAD_ID(PA, 12), 46 + MX27_PAD_LD7 = PAD_ID(PA, 13), 47 + MX27_PAD_LD8 = PAD_ID(PA, 14), 48 + MX27_PAD_LD9 = PAD_ID(PA, 15), 49 + MX27_PAD_LD10 = PAD_ID(PA, 16), 50 + MX27_PAD_LD11 = PAD_ID(PA, 17), 51 + MX27_PAD_LD12 = PAD_ID(PA, 18), 52 + MX27_PAD_LD13 = PAD_ID(PA, 19), 53 + MX27_PAD_LD14 = PAD_ID(PA, 20), 54 + MX27_PAD_LD15 = PAD_ID(PA, 21), 55 + MX27_PAD_LD16 = PAD_ID(PA, 22), 56 + MX27_PAD_LD17 = PAD_ID(PA, 23), 57 + MX27_PAD_REV = PAD_ID(PA, 24), 58 + MX27_PAD_CLS = PAD_ID(PA, 25), 59 + MX27_PAD_PS = PAD_ID(PA, 26), 60 + MX27_PAD_SPL_SPR = PAD_ID(PA, 27), 61 + MX27_PAD_HSYNC = PAD_ID(PA, 28), 62 + MX27_PAD_VSYNC = PAD_ID(PA, 29), 63 + MX27_PAD_CONTRAST = PAD_ID(PA, 30), 64 + MX27_PAD_OE_ACD = PAD_ID(PA, 31), 65 + 66 + MX27_PAD_UNUSED0 = PAD_ID(PB, 0), 67 + MX27_PAD_UNUSED1 = PAD_ID(PB, 1), 68 + MX27_PAD_UNUSED2 = PAD_ID(PB, 2), 69 + MX27_PAD_UNUSED3 = PAD_ID(PB, 3), 70 + MX27_PAD_SD2_D0 = PAD_ID(PB, 4), 71 + MX27_PAD_SD2_D1 = PAD_ID(PB, 5), 72 + MX27_PAD_SD2_D2 = PAD_ID(PB, 6), 73 + MX27_PAD_SD2_D3 = PAD_ID(PB, 7), 74 + MX27_PAD_SD2_CMD = PAD_ID(PB, 8), 75 + MX27_PAD_SD2_CLK = PAD_ID(PB, 9), 76 + MX27_PAD_CSI_D0 = PAD_ID(PB, 10), 77 + MX27_PAD_CSI_D1 = PAD_ID(PB, 11), 78 + MX27_PAD_CSI_D2 = PAD_ID(PB, 12), 79 + MX27_PAD_CSI_D3 = PAD_ID(PB, 13), 80 + MX27_PAD_CSI_D4 = PAD_ID(PB, 14), 81 + MX27_PAD_CSI_MCLK = PAD_ID(PB, 15), 82 + MX27_PAD_CSI_PIXCLK = PAD_ID(PB, 16), 83 + MX27_PAD_CSI_D5 = PAD_ID(PB, 17), 84 + MX27_PAD_CSI_D6 = PAD_ID(PB, 18), 85 + MX27_PAD_CSI_D7 = PAD_ID(PB, 19), 86 + MX27_PAD_CSI_VSYNC = PAD_ID(PB, 20), 87 + MX27_PAD_CSI_HSYNC = PAD_ID(PB, 21), 88 + MX27_PAD_USBH1_SUSP = PAD_ID(PB, 22), 89 + MX27_PAD_USB_PWR = PAD_ID(PB, 23), 90 + MX27_PAD_USB_OC_B = PAD_ID(PB, 24), 91 + MX27_PAD_USBH1_RCV = PAD_ID(PB, 25), 92 + MX27_PAD_USBH1_FS = PAD_ID(PB, 26), 93 + MX27_PAD_USBH1_OE_B = PAD_ID(PB, 27), 94 + MX27_PAD_USBH1_TXDM = PAD_ID(PB, 28), 95 + MX27_PAD_USBH1_TXDP = PAD_ID(PB, 29), 96 + MX27_PAD_USBH1_RXDM = PAD_ID(PB, 30), 97 + MX27_PAD_USBH1_RXDP = PAD_ID(PB, 31), 98 + 99 + MX27_PAD_UNUSED4 = PAD_ID(PC, 0), 100 + MX27_PAD_UNUSED5 = PAD_ID(PC, 1), 101 + MX27_PAD_UNUSED6 = PAD_ID(PC, 2), 102 + MX27_PAD_UNUSED7 = PAD_ID(PC, 3), 103 + MX27_PAD_UNUSED8 = PAD_ID(PC, 4), 104 + MX27_PAD_I2C2_SDA = PAD_ID(PC, 5), 105 + MX27_PAD_I2C2_SCL = PAD_ID(PC, 6), 106 + MX27_PAD_USBOTG_DATA5 = PAD_ID(PC, 7), 107 + MX27_PAD_USBOTG_DATA6 = PAD_ID(PC, 8), 108 + MX27_PAD_USBOTG_DATA0 = PAD_ID(PC, 9), 109 + MX27_PAD_USBOTG_DATA2 = PAD_ID(PC, 10), 110 + MX27_PAD_USBOTG_DATA1 = PAD_ID(PC, 11), 111 + MX27_PAD_USBOTG_DATA4 = PAD_ID(PC, 12), 112 + MX27_PAD_USBOTG_DATA3 = PAD_ID(PC, 13), 113 + MX27_PAD_TOUT = PAD_ID(PC, 14), 114 + MX27_PAD_TIN = PAD_ID(PC, 15), 115 + MX27_PAD_SSI4_FS = PAD_ID(PC, 16), 116 + MX27_PAD_SSI4_RXDAT = PAD_ID(PC, 17), 117 + MX27_PAD_SSI4_TXDAT = PAD_ID(PC, 18), 118 + MX27_PAD_SSI4_CLK = PAD_ID(PC, 19), 119 + MX27_PAD_SSI1_FS = PAD_ID(PC, 20), 120 + MX27_PAD_SSI1_RXDAT = PAD_ID(PC, 21), 121 + MX27_PAD_SSI1_TXDAT = PAD_ID(PC, 22), 122 + MX27_PAD_SSI1_CLK = PAD_ID(PC, 23), 123 + MX27_PAD_SSI2_FS = PAD_ID(PC, 24), 124 + MX27_PAD_SSI2_RXDAT = PAD_ID(PC, 25), 125 + MX27_PAD_SSI2_TXDAT = PAD_ID(PC, 26), 126 + MX27_PAD_SSI2_CLK = PAD_ID(PC, 27), 127 + MX27_PAD_SSI3_FS = PAD_ID(PC, 28), 128 + MX27_PAD_SSI3_RXDAT = PAD_ID(PC, 29), 129 + MX27_PAD_SSI3_TXDAT = PAD_ID(PC, 30), 130 + MX27_PAD_SSI3_CLK = PAD_ID(PC, 31), 131 + 132 + MX27_PAD_SD3_CMD = PAD_ID(PD, 0), 133 + MX27_PAD_SD3_CLK = PAD_ID(PD, 1), 134 + MX27_PAD_ATA_DATA0 = PAD_ID(PD, 2), 135 + MX27_PAD_ATA_DATA1 = PAD_ID(PD, 3), 136 + MX27_PAD_ATA_DATA2 = PAD_ID(PD, 4), 137 + MX27_PAD_ATA_DATA3 = PAD_ID(PD, 5), 138 + MX27_PAD_ATA_DATA4 = PAD_ID(PD, 6), 139 + MX27_PAD_ATA_DATA5 = PAD_ID(PD, 7), 140 + MX27_PAD_ATA_DATA6 = PAD_ID(PD, 8), 141 + MX27_PAD_ATA_DATA7 = PAD_ID(PD, 9), 142 + MX27_PAD_ATA_DATA8 = PAD_ID(PD, 10), 143 + MX27_PAD_ATA_DATA9 = PAD_ID(PD, 11), 144 + MX27_PAD_ATA_DATA10 = PAD_ID(PD, 12), 145 + MX27_PAD_ATA_DATA11 = PAD_ID(PD, 13), 146 + MX27_PAD_ATA_DATA12 = PAD_ID(PD, 14), 147 + MX27_PAD_ATA_DATA13 = PAD_ID(PD, 15), 148 + MX27_PAD_ATA_DATA14 = PAD_ID(PD, 16), 149 + MX27_PAD_I2C_DATA = PAD_ID(PD, 17), 150 + MX27_PAD_I2C_CLK = PAD_ID(PD, 18), 151 + MX27_PAD_CSPI2_SS2 = PAD_ID(PD, 19), 152 + MX27_PAD_CSPI2_SS1 = PAD_ID(PD, 20), 153 + MX27_PAD_CSPI2_SS0 = PAD_ID(PD, 21), 154 + MX27_PAD_CSPI2_SCLK = PAD_ID(PD, 22), 155 + MX27_PAD_CSPI2_MISO = PAD_ID(PD, 23), 156 + MX27_PAD_CSPI2_MOSI = PAD_ID(PD, 24), 157 + MX27_PAD_CSPI1_RDY = PAD_ID(PD, 25), 158 + MX27_PAD_CSPI1_SS2 = PAD_ID(PD, 26), 159 + MX27_PAD_CSPI1_SS1 = PAD_ID(PD, 27), 160 + MX27_PAD_CSPI1_SS0 = PAD_ID(PD, 28), 161 + MX27_PAD_CSPI1_SCLK = PAD_ID(PD, 29), 162 + MX27_PAD_CSPI1_MISO = PAD_ID(PD, 30), 163 + MX27_PAD_CSPI1_MOSI = PAD_ID(PD, 31), 164 + 165 + MX27_PAD_USBOTG_NXT = PAD_ID(PE, 0), 166 + MX27_PAD_USBOTG_STP = PAD_ID(PE, 1), 167 + MX27_PAD_USBOTG_DIR = PAD_ID(PE, 2), 168 + MX27_PAD_UART2_CTS = PAD_ID(PE, 3), 169 + MX27_PAD_UART2_RTS = PAD_ID(PE, 4), 170 + MX27_PAD_PWMO = PAD_ID(PE, 5), 171 + MX27_PAD_UART2_TXD = PAD_ID(PE, 6), 172 + MX27_PAD_UART2_RXD = PAD_ID(PE, 7), 173 + MX27_PAD_UART3_TXD = PAD_ID(PE, 8), 174 + MX27_PAD_UART3_RXD = PAD_ID(PE, 9), 175 + MX27_PAD_UART3_CTS = PAD_ID(PE, 10), 176 + MX27_PAD_UART3_RTS = PAD_ID(PE, 11), 177 + MX27_PAD_UART1_TXD = PAD_ID(PE, 12), 178 + MX27_PAD_UART1_RXD = PAD_ID(PE, 13), 179 + MX27_PAD_UART1_CTS = PAD_ID(PE, 14), 180 + MX27_PAD_UART1_RTS = PAD_ID(PE, 15), 181 + MX27_PAD_RTCK = PAD_ID(PE, 16), 182 + MX27_PAD_RESET_OUT_B = PAD_ID(PE, 17), 183 + MX27_PAD_SD1_D0 = PAD_ID(PE, 18), 184 + MX27_PAD_SD1_D1 = PAD_ID(PE, 19), 185 + MX27_PAD_SD1_D2 = PAD_ID(PE, 20), 186 + MX27_PAD_SD1_D3 = PAD_ID(PE, 21), 187 + MX27_PAD_SD1_CMD = PAD_ID(PE, 22), 188 + MX27_PAD_SD1_CLK = PAD_ID(PE, 23), 189 + MX27_PAD_USBOTG_CLK = PAD_ID(PE, 24), 190 + MX27_PAD_USBOTG_DATA7 = PAD_ID(PE, 25), 191 + MX27_PAD_UNUSED9 = PAD_ID(PE, 26), 192 + MX27_PAD_UNUSED10 = PAD_ID(PE, 27), 193 + MX27_PAD_UNUSED11 = PAD_ID(PE, 28), 194 + MX27_PAD_UNUSED12 = PAD_ID(PE, 29), 195 + MX27_PAD_UNUSED13 = PAD_ID(PE, 30), 196 + MX27_PAD_UNUSED14 = PAD_ID(PE, 31), 197 + 198 + MX27_PAD_NFRB = PAD_ID(PF, 0), 199 + MX27_PAD_NFCLE = PAD_ID(PF, 1), 200 + MX27_PAD_NFWP_B = PAD_ID(PF, 2), 201 + MX27_PAD_NFCE_B = PAD_ID(PF, 3), 202 + MX27_PAD_NFALE = PAD_ID(PF, 4), 203 + MX27_PAD_NFRE_B = PAD_ID(PF, 5), 204 + MX27_PAD_NFWE_B = PAD_ID(PF, 6), 205 + MX27_PAD_PC_POE = PAD_ID(PF, 7), 206 + MX27_PAD_PC_RW_B = PAD_ID(PF, 8), 207 + MX27_PAD_IOIS16 = PAD_ID(PF, 9), 208 + MX27_PAD_PC_RST = PAD_ID(PF, 10), 209 + MX27_PAD_PC_BVD2 = PAD_ID(PF, 11), 210 + MX27_PAD_PC_BVD1 = PAD_ID(PF, 12), 211 + MX27_PAD_PC_VS2 = PAD_ID(PF, 13), 212 + MX27_PAD_PC_VS1 = PAD_ID(PF, 14), 213 + MX27_PAD_CLKO = PAD_ID(PF, 15), 214 + MX27_PAD_PC_PWRON = PAD_ID(PF, 16), 215 + MX27_PAD_PC_READY = PAD_ID(PF, 17), 216 + MX27_PAD_PC_WAIT_B = PAD_ID(PF, 18), 217 + MX27_PAD_PC_CD2_B = PAD_ID(PF, 19), 218 + MX27_PAD_PC_CD1_B = PAD_ID(PF, 20), 219 + MX27_PAD_CS4_B = PAD_ID(PF, 21), 220 + MX27_PAD_CS5_B = PAD_ID(PF, 22), 221 + MX27_PAD_ATA_DATA15 = PAD_ID(PF, 23), 222 + MX27_PAD_UNUSED15 = PAD_ID(PF, 24), 223 + MX27_PAD_UNUSED16 = PAD_ID(PF, 25), 224 + MX27_PAD_UNUSED17 = PAD_ID(PF, 26), 225 + MX27_PAD_UNUSED18 = PAD_ID(PF, 27), 226 + MX27_PAD_UNUSED19 = PAD_ID(PF, 28), 227 + MX27_PAD_UNUSED20 = PAD_ID(PF, 29), 228 + MX27_PAD_UNUSED21 = PAD_ID(PF, 30), 229 + MX27_PAD_UNUSED22 = PAD_ID(PF, 31), 230 + }; 231 + 232 + /* Pad names for the pinmux subsystem */ 233 + static const struct pinctrl_pin_desc imx27_pinctrl_pads[] = { 234 + IMX_PINCTRL_PIN(MX27_PAD_USBH2_CLK), 235 + IMX_PINCTRL_PIN(MX27_PAD_USBH2_DIR), 236 + IMX_PINCTRL_PIN(MX27_PAD_USBH2_DATA7), 237 + IMX_PINCTRL_PIN(MX27_PAD_USBH2_NXT), 238 + IMX_PINCTRL_PIN(MX27_PAD_USBH2_STP), 239 + IMX_PINCTRL_PIN(MX27_PAD_LSCLK), 240 + IMX_PINCTRL_PIN(MX27_PAD_LD0), 241 + IMX_PINCTRL_PIN(MX27_PAD_LD1), 242 + IMX_PINCTRL_PIN(MX27_PAD_LD2), 243 + IMX_PINCTRL_PIN(MX27_PAD_LD3), 244 + IMX_PINCTRL_PIN(MX27_PAD_LD4), 245 + IMX_PINCTRL_PIN(MX27_PAD_LD5), 246 + IMX_PINCTRL_PIN(MX27_PAD_LD6), 247 + IMX_PINCTRL_PIN(MX27_PAD_LD7), 248 + IMX_PINCTRL_PIN(MX27_PAD_LD8), 249 + IMX_PINCTRL_PIN(MX27_PAD_LD9), 250 + IMX_PINCTRL_PIN(MX27_PAD_LD10), 251 + IMX_PINCTRL_PIN(MX27_PAD_LD11), 252 + IMX_PINCTRL_PIN(MX27_PAD_LD12), 253 + IMX_PINCTRL_PIN(MX27_PAD_LD13), 254 + IMX_PINCTRL_PIN(MX27_PAD_LD14), 255 + IMX_PINCTRL_PIN(MX27_PAD_LD15), 256 + IMX_PINCTRL_PIN(MX27_PAD_LD16), 257 + IMX_PINCTRL_PIN(MX27_PAD_LD17), 258 + IMX_PINCTRL_PIN(MX27_PAD_REV), 259 + IMX_PINCTRL_PIN(MX27_PAD_CLS), 260 + IMX_PINCTRL_PIN(MX27_PAD_PS), 261 + IMX_PINCTRL_PIN(MX27_PAD_SPL_SPR), 262 + IMX_PINCTRL_PIN(MX27_PAD_HSYNC), 263 + IMX_PINCTRL_PIN(MX27_PAD_VSYNC), 264 + IMX_PINCTRL_PIN(MX27_PAD_CONTRAST), 265 + IMX_PINCTRL_PIN(MX27_PAD_OE_ACD), 266 + 267 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED0), 268 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED1), 269 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED2), 270 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED3), 271 + IMX_PINCTRL_PIN(MX27_PAD_SD2_D0), 272 + IMX_PINCTRL_PIN(MX27_PAD_SD2_D1), 273 + IMX_PINCTRL_PIN(MX27_PAD_SD2_D2), 274 + IMX_PINCTRL_PIN(MX27_PAD_SD2_D3), 275 + IMX_PINCTRL_PIN(MX27_PAD_SD2_CMD), 276 + IMX_PINCTRL_PIN(MX27_PAD_SD2_CLK), 277 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D0), 278 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D1), 279 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D2), 280 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D3), 281 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D4), 282 + IMX_PINCTRL_PIN(MX27_PAD_CSI_MCLK), 283 + IMX_PINCTRL_PIN(MX27_PAD_CSI_PIXCLK), 284 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D5), 285 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D6), 286 + IMX_PINCTRL_PIN(MX27_PAD_CSI_D7), 287 + IMX_PINCTRL_PIN(MX27_PAD_CSI_VSYNC), 288 + IMX_PINCTRL_PIN(MX27_PAD_CSI_HSYNC), 289 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_SUSP), 290 + IMX_PINCTRL_PIN(MX27_PAD_USB_PWR), 291 + IMX_PINCTRL_PIN(MX27_PAD_USB_OC_B), 292 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_RCV), 293 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_FS), 294 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_OE_B), 295 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_TXDM), 296 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_TXDP), 297 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_RXDM), 298 + IMX_PINCTRL_PIN(MX27_PAD_USBH1_RXDP), 299 + 300 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED4), 301 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED5), 302 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED6), 303 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED7), 304 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED8), 305 + IMX_PINCTRL_PIN(MX27_PAD_I2C2_SDA), 306 + IMX_PINCTRL_PIN(MX27_PAD_I2C2_SCL), 307 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA5), 308 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA6), 309 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA0), 310 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA2), 311 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA1), 312 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA4), 313 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA3), 314 + IMX_PINCTRL_PIN(MX27_PAD_TOUT), 315 + IMX_PINCTRL_PIN(MX27_PAD_TIN), 316 + IMX_PINCTRL_PIN(MX27_PAD_SSI4_FS), 317 + IMX_PINCTRL_PIN(MX27_PAD_SSI4_RXDAT), 318 + IMX_PINCTRL_PIN(MX27_PAD_SSI4_TXDAT), 319 + IMX_PINCTRL_PIN(MX27_PAD_SSI4_CLK), 320 + IMX_PINCTRL_PIN(MX27_PAD_SSI1_FS), 321 + IMX_PINCTRL_PIN(MX27_PAD_SSI1_RXDAT), 322 + IMX_PINCTRL_PIN(MX27_PAD_SSI1_TXDAT), 323 + IMX_PINCTRL_PIN(MX27_PAD_SSI1_CLK), 324 + IMX_PINCTRL_PIN(MX27_PAD_SSI2_FS), 325 + IMX_PINCTRL_PIN(MX27_PAD_SSI2_RXDAT), 326 + IMX_PINCTRL_PIN(MX27_PAD_SSI2_TXDAT), 327 + IMX_PINCTRL_PIN(MX27_PAD_SSI2_CLK), 328 + IMX_PINCTRL_PIN(MX27_PAD_SSI3_FS), 329 + IMX_PINCTRL_PIN(MX27_PAD_SSI3_RXDAT), 330 + IMX_PINCTRL_PIN(MX27_PAD_SSI3_TXDAT), 331 + IMX_PINCTRL_PIN(MX27_PAD_SSI3_CLK), 332 + 333 + IMX_PINCTRL_PIN(MX27_PAD_SD3_CMD), 334 + IMX_PINCTRL_PIN(MX27_PAD_SD3_CLK), 335 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA0), 336 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA1), 337 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA2), 338 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA3), 339 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA4), 340 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA5), 341 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA6), 342 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA7), 343 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA8), 344 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA9), 345 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA10), 346 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA11), 347 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA12), 348 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA13), 349 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA14), 350 + IMX_PINCTRL_PIN(MX27_PAD_I2C_DATA), 351 + IMX_PINCTRL_PIN(MX27_PAD_I2C_CLK), 352 + IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SS2), 353 + IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SS1), 354 + IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SS0), 355 + IMX_PINCTRL_PIN(MX27_PAD_CSPI2_SCLK), 356 + IMX_PINCTRL_PIN(MX27_PAD_CSPI2_MISO), 357 + IMX_PINCTRL_PIN(MX27_PAD_CSPI2_MOSI), 358 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_RDY), 359 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SS2), 360 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SS1), 361 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SS0), 362 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_SCLK), 363 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_MISO), 364 + IMX_PINCTRL_PIN(MX27_PAD_CSPI1_MOSI), 365 + 366 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_NXT), 367 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_STP), 368 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DIR), 369 + IMX_PINCTRL_PIN(MX27_PAD_UART2_CTS), 370 + IMX_PINCTRL_PIN(MX27_PAD_UART2_RTS), 371 + IMX_PINCTRL_PIN(MX27_PAD_PWMO), 372 + IMX_PINCTRL_PIN(MX27_PAD_UART2_TXD), 373 + IMX_PINCTRL_PIN(MX27_PAD_UART2_RXD), 374 + IMX_PINCTRL_PIN(MX27_PAD_UART3_TXD), 375 + IMX_PINCTRL_PIN(MX27_PAD_UART3_RXD), 376 + IMX_PINCTRL_PIN(MX27_PAD_UART3_CTS), 377 + IMX_PINCTRL_PIN(MX27_PAD_UART3_RTS), 378 + IMX_PINCTRL_PIN(MX27_PAD_UART1_TXD), 379 + IMX_PINCTRL_PIN(MX27_PAD_UART1_RXD), 380 + IMX_PINCTRL_PIN(MX27_PAD_UART1_CTS), 381 + IMX_PINCTRL_PIN(MX27_PAD_UART1_RTS), 382 + IMX_PINCTRL_PIN(MX27_PAD_RTCK), 383 + IMX_PINCTRL_PIN(MX27_PAD_RESET_OUT_B), 384 + IMX_PINCTRL_PIN(MX27_PAD_SD1_D0), 385 + IMX_PINCTRL_PIN(MX27_PAD_SD1_D1), 386 + IMX_PINCTRL_PIN(MX27_PAD_SD1_D2), 387 + IMX_PINCTRL_PIN(MX27_PAD_SD1_D3), 388 + IMX_PINCTRL_PIN(MX27_PAD_SD1_CMD), 389 + IMX_PINCTRL_PIN(MX27_PAD_SD1_CLK), 390 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_CLK), 391 + IMX_PINCTRL_PIN(MX27_PAD_USBOTG_DATA7), 392 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED9), 393 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED10), 394 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED11), 395 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED12), 396 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED13), 397 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED14), 398 + 399 + IMX_PINCTRL_PIN(MX27_PAD_NFRB), 400 + IMX_PINCTRL_PIN(MX27_PAD_NFCLE), 401 + IMX_PINCTRL_PIN(MX27_PAD_NFWP_B), 402 + IMX_PINCTRL_PIN(MX27_PAD_NFCE_B), 403 + IMX_PINCTRL_PIN(MX27_PAD_NFALE), 404 + IMX_PINCTRL_PIN(MX27_PAD_NFRE_B), 405 + IMX_PINCTRL_PIN(MX27_PAD_NFWE_B), 406 + IMX_PINCTRL_PIN(MX27_PAD_PC_POE), 407 + IMX_PINCTRL_PIN(MX27_PAD_PC_RW_B), 408 + IMX_PINCTRL_PIN(MX27_PAD_IOIS16), 409 + IMX_PINCTRL_PIN(MX27_PAD_PC_RST), 410 + IMX_PINCTRL_PIN(MX27_PAD_PC_BVD2), 411 + IMX_PINCTRL_PIN(MX27_PAD_PC_BVD1), 412 + IMX_PINCTRL_PIN(MX27_PAD_PC_VS2), 413 + IMX_PINCTRL_PIN(MX27_PAD_PC_VS1), 414 + IMX_PINCTRL_PIN(MX27_PAD_CLKO), 415 + IMX_PINCTRL_PIN(MX27_PAD_PC_PWRON), 416 + IMX_PINCTRL_PIN(MX27_PAD_PC_READY), 417 + IMX_PINCTRL_PIN(MX27_PAD_PC_WAIT_B), 418 + IMX_PINCTRL_PIN(MX27_PAD_PC_CD2_B), 419 + IMX_PINCTRL_PIN(MX27_PAD_PC_CD1_B), 420 + IMX_PINCTRL_PIN(MX27_PAD_CS4_B), 421 + IMX_PINCTRL_PIN(MX27_PAD_CS5_B), 422 + IMX_PINCTRL_PIN(MX27_PAD_ATA_DATA15), 423 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED15), 424 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED16), 425 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED17), 426 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED18), 427 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED19), 428 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED20), 429 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED21), 430 + IMX_PINCTRL_PIN(MX27_PAD_UNUSED22), 431 + }; 432 + 433 + static struct imx1_pinctrl_soc_info imx27_pinctrl_info = { 434 + .pins = imx27_pinctrl_pads, 435 + .npins = ARRAY_SIZE(imx27_pinctrl_pads), 436 + }; 437 + 438 + static struct of_device_id imx27_pinctrl_of_match[] = { 439 + { .compatible = "fsl,imx27-iomuxc", }, 440 + { /* sentinel */ } 441 + }; 442 + 443 + struct imx27_pinctrl_private { 444 + int num_gpio_childs; 445 + struct platform_device **gpio_dev; 446 + struct mxc_gpio_platform_data *gpio_pdata; 447 + }; 448 + 449 + static int imx27_pinctrl_probe(struct platform_device *pdev) 450 + { 451 + return imx1_pinctrl_core_probe(pdev, &imx27_pinctrl_info); 452 + } 453 + 454 + static struct platform_driver imx27_pinctrl_driver = { 455 + .driver = { 456 + .name = "imx27-pinctrl", 457 + .owner = THIS_MODULE, 458 + .of_match_table = of_match_ptr(imx27_pinctrl_of_match), 459 + }, 460 + .probe = imx27_pinctrl_probe, 461 + .remove = imx1_pinctrl_core_remove, 462 + }; 463 + 464 + static int __init imx27_pinctrl_init(void) 465 + { 466 + return platform_driver_register(&imx27_pinctrl_driver); 467 + } 468 + arch_initcall(imx27_pinctrl_init); 469 + 470 + static void __exit imx27_pinctrl_exit(void) 471 + { 472 + platform_driver_unregister(&imx27_pinctrl_driver); 473 + } 474 + module_exit(imx27_pinctrl_exit); 475 + MODULE_AUTHOR("Markus Pargmann <mpa@pengutronix.de>"); 476 + MODULE_DESCRIPTION("Freescale IMX27 pinctrl driver"); 477 + MODULE_LICENSE("GPL v2");
+1 -1
drivers/pinctrl/pinctrl-imx35.c
··· 1019 1019 .driver = { 1020 1020 .name = "imx35-pinctrl", 1021 1021 .owner = THIS_MODULE, 1022 - .of_match_table = of_match_ptr(imx35_pinctrl_of_match), 1022 + .of_match_table = imx35_pinctrl_of_match, 1023 1023 }, 1024 1024 .probe = imx35_pinctrl_probe, 1025 1025 .remove = imx_pinctrl_remove,
+426
drivers/pinctrl/pinctrl-imx50.c
··· 1 + /* 2 + * imx50 pinctrl driver based on imx pinmux core 3 + * 4 + * Copyright (C) 2013 Greg Ungerer <gerg@uclinux.org> 5 + * Copyright (C) 2012 Freescale Semiconductor, Inc. 6 + * Copyright (C) 2012 Linaro, Inc. 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + */ 13 + 14 + #include <linux/err.h> 15 + #include <linux/init.h> 16 + #include <linux/io.h> 17 + #include <linux/module.h> 18 + #include <linux/of.h> 19 + #include <linux/of_device.h> 20 + #include <linux/pinctrl/pinctrl.h> 21 + 22 + #include "pinctrl-imx.h" 23 + 24 + enum imx50_pads { 25 + MX50_PAD_RESERVE0 = 0, 26 + MX50_PAD_RESERVE1 = 1, 27 + MX50_PAD_RESERVE2 = 2, 28 + MX50_PAD_RESERVE3 = 3, 29 + MX50_PAD_RESERVE4 = 4, 30 + MX50_PAD_RESERVE5 = 5, 31 + MX50_PAD_RESERVE6 = 6, 32 + MX50_PAD_RESERVE7 = 7, 33 + MX50_PAD_KEY_COL0 = 8, 34 + MX50_PAD_KEY_ROW0 = 9, 35 + MX50_PAD_KEY_COL1 = 10, 36 + MX50_PAD_KEY_ROW1 = 11, 37 + MX50_PAD_KEY_COL2 = 12, 38 + MX50_PAD_KEY_ROW2 = 13, 39 + MX50_PAD_KEY_COL3 = 14, 40 + MX50_PAD_KEY_ROW3 = 15, 41 + MX50_PAD_I2C1_SCL = 16, 42 + MX50_PAD_I2C1_SDA = 17, 43 + MX50_PAD_I2C2_SCL = 18, 44 + MX50_PAD_I2C2_SDA = 19, 45 + MX50_PAD_I2C3_SCL = 20, 46 + MX50_PAD_I2C3_SDA = 21, 47 + MX50_PAD_PWM1 = 22, 48 + MX50_PAD_PWM2 = 23, 49 + MX50_PAD_0WIRE = 24, 50 + MX50_PAD_EPITO = 25, 51 + MX50_PAD_WDOG = 26, 52 + MX50_PAD_SSI_TXFS = 27, 53 + MX50_PAD_SSI_TXC = 28, 54 + MX50_PAD_SSI_TXD = 29, 55 + MX50_PAD_SSI_RXD = 30, 56 + MX50_PAD_SSI_RXF = 31, 57 + MX50_PAD_SSI_RXC = 32, 58 + MX50_PAD_UART1_TXD = 33, 59 + MX50_PAD_UART1_RXD = 34, 60 + MX50_PAD_UART1_CTS = 35, 61 + MX50_PAD_UART1_RTS = 36, 62 + MX50_PAD_UART2_TXD = 37, 63 + MX50_PAD_UART2_RXD = 38, 64 + MX50_PAD_UART2_CTS = 39, 65 + MX50_PAD_UART2_RTS = 40, 66 + MX50_PAD_UART3_TXD = 41, 67 + MX50_PAD_UART3_RXD = 42, 68 + MX50_PAD_UART4_TXD = 43, 69 + MX50_PAD_UART4_RXD = 44, 70 + MX50_PAD_CSPI_CLK = 45, 71 + MX50_PAD_CSPI_MOSI = 46, 72 + MX50_PAD_CSPI_MISO = 47, 73 + MX50_PAD_CSPI_SS0 = 48, 74 + MX50_PAD_ECSPI1_CLK = 49, 75 + MX50_PAD_ECSPI1_MOSI = 50, 76 + MX50_PAD_ECSPI1_MISO = 51, 77 + MX50_PAD_ECSPI1_SS0 = 52, 78 + MX50_PAD_ECSPI2_CLK = 53, 79 + MX50_PAD_ECSPI2_MOSI = 54, 80 + MX50_PAD_ECSPI2_MISO = 55, 81 + MX50_PAD_ECSPI2_SS0 = 56, 82 + MX50_PAD_SD1_CLK = 57, 83 + MX50_PAD_SD1_CMD = 58, 84 + MX50_PAD_SD1_D0 = 59, 85 + MX50_PAD_SD1_D1 = 60, 86 + MX50_PAD_SD1_D2 = 61, 87 + MX50_PAD_SD1_D3 = 62, 88 + MX50_PAD_SD2_CLK = 63, 89 + MX50_PAD_SD2_CMD = 64, 90 + MX50_PAD_SD2_D0 = 65, 91 + MX50_PAD_SD2_D1 = 66, 92 + MX50_PAD_SD2_D2 = 67, 93 + MX50_PAD_SD2_D3 = 68, 94 + MX50_PAD_SD2_D4 = 69, 95 + MX50_PAD_SD2_D5 = 70, 96 + MX50_PAD_SD2_D6 = 71, 97 + MX50_PAD_SD2_D7 = 72, 98 + MX50_PAD_SD2_WP = 73, 99 + MX50_PAD_SD2_CD = 74, 100 + MX50_PAD_DISP_D0 = 75, 101 + MX50_PAD_DISP_D1 = 76, 102 + MX50_PAD_DISP_D2 = 77, 103 + MX50_PAD_DISP_D3 = 78, 104 + MX50_PAD_DISP_D4 = 79, 105 + MX50_PAD_DISP_D5 = 80, 106 + MX50_PAD_DISP_D6 = 81, 107 + MX50_PAD_DISP_D7 = 82, 108 + MX50_PAD_DISP_WR = 83, 109 + MX50_PAD_DISP_RD = 84, 110 + MX50_PAD_DISP_RS = 85, 111 + MX50_PAD_DISP_CS = 86, 112 + MX50_PAD_DISP_BUSY = 87, 113 + MX50_PAD_DISP_RESET = 88, 114 + MX50_PAD_SD3_CLK = 89, 115 + MX50_PAD_SD3_CMD = 90, 116 + MX50_PAD_SD3_D0 = 91, 117 + MX50_PAD_SD3_D1 = 92, 118 + MX50_PAD_SD3_D2 = 93, 119 + MX50_PAD_SD3_D3 = 94, 120 + MX50_PAD_SD3_D4 = 95, 121 + MX50_PAD_SD3_D5 = 96, 122 + MX50_PAD_SD3_D6 = 97, 123 + MX50_PAD_SD3_D7 = 98, 124 + MX50_PAD_SD3_WP = 99, 125 + MX50_PAD_DISP_D8 = 100, 126 + MX50_PAD_DISP_D9 = 101, 127 + MX50_PAD_DISP_D10 = 102, 128 + MX50_PAD_DISP_D11 = 103, 129 + MX50_PAD_DISP_D12 = 104, 130 + MX50_PAD_DISP_D13 = 105, 131 + MX50_PAD_DISP_D14 = 106, 132 + MX50_PAD_DISP_D15 = 107, 133 + MX50_PAD_EPDC_D0 = 108, 134 + MX50_PAD_EPDC_D1 = 109, 135 + MX50_PAD_EPDC_D2 = 110, 136 + MX50_PAD_EPDC_D3 = 111, 137 + MX50_PAD_EPDC_D4 = 112, 138 + MX50_PAD_EPDC_D5 = 113, 139 + MX50_PAD_EPDC_D6 = 114, 140 + MX50_PAD_EPDC_D7 = 115, 141 + MX50_PAD_EPDC_D8 = 116, 142 + MX50_PAD_EPDC_D9 = 117, 143 + MX50_PAD_EPDC_D10 = 118, 144 + MX50_PAD_EPDC_D11 = 119, 145 + MX50_PAD_EPDC_D12 = 120, 146 + MX50_PAD_EPDC_D13 = 121, 147 + MX50_PAD_EPDC_D14 = 122, 148 + MX50_PAD_EPDC_D15 = 123, 149 + MX50_PAD_EPDC_GDCLK = 124, 150 + MX50_PAD_EPDC_GDSP = 125, 151 + MX50_PAD_EPDC_GDOE = 126, 152 + MX50_PAD_EPDC_GDRL = 127, 153 + MX50_PAD_EPDC_SDCLK = 128, 154 + MX50_PAD_EPDC_SDOEZ = 129, 155 + MX50_PAD_EPDC_SDOED = 130, 156 + MX50_PAD_EPDC_SDOE = 131, 157 + MX50_PAD_EPDC_SDLE = 132, 158 + MX50_PAD_EPDC_SDCLKN = 133, 159 + MX50_PAD_EPDC_SDSHR = 134, 160 + MX50_PAD_EPDC_PWRCOM = 135, 161 + MX50_PAD_EPDC_PWRSTAT = 136, 162 + MX50_PAD_EPDC_PWRCTRL0 = 137, 163 + MX50_PAD_EPDC_PWRCTRL1 = 138, 164 + MX50_PAD_EPDC_PWRCTRL2 = 139, 165 + MX50_PAD_EPDC_PWRCTRL3 = 140, 166 + MX50_PAD_EPDC_VCOM0 = 141, 167 + MX50_PAD_EPDC_VCOM1 = 142, 168 + MX50_PAD_EPDC_BDR0 = 143, 169 + MX50_PAD_EPDC_BDR1 = 144, 170 + MX50_PAD_EPDC_SDCE0 = 145, 171 + MX50_PAD_EPDC_SDCE1 = 146, 172 + MX50_PAD_EPDC_SDCE2 = 147, 173 + MX50_PAD_EPDC_SDCE3 = 148, 174 + MX50_PAD_EPDC_SDCE4 = 149, 175 + MX50_PAD_EPDC_SDCE5 = 150, 176 + MX50_PAD_EIM_DA0 = 151, 177 + MX50_PAD_EIM_DA1 = 152, 178 + MX50_PAD_EIM_DA2 = 153, 179 + MX50_PAD_EIM_DA3 = 154, 180 + MX50_PAD_EIM_DA4 = 155, 181 + MX50_PAD_EIM_DA5 = 156, 182 + MX50_PAD_EIM_DA6 = 157, 183 + MX50_PAD_EIM_DA7 = 158, 184 + MX50_PAD_EIM_DA8 = 159, 185 + MX50_PAD_EIM_DA9 = 160, 186 + MX50_PAD_EIM_DA10 = 161, 187 + MX50_PAD_EIM_DA11 = 162, 188 + MX50_PAD_EIM_DA12 = 163, 189 + MX50_PAD_EIM_DA13 = 164, 190 + MX50_PAD_EIM_DA14 = 165, 191 + MX50_PAD_EIM_DA15 = 166, 192 + MX50_PAD_EIM_CS2 = 167, 193 + MX50_PAD_EIM_CS1 = 168, 194 + MX50_PAD_EIM_CS0 = 169, 195 + MX50_PAD_EIM_EB0 = 170, 196 + MX50_PAD_EIM_EB1 = 171, 197 + MX50_PAD_EIM_WAIT = 172, 198 + MX50_PAD_EIM_BCLK = 173, 199 + MX50_PAD_EIM_RDY = 174, 200 + MX50_PAD_EIM_OE = 175, 201 + MX50_PAD_EIM_RW = 176, 202 + MX50_PAD_EIM_LBA = 177, 203 + MX50_PAD_EIM_CRE = 178, 204 + }; 205 + 206 + /* Pad names for the pinmux subsystem */ 207 + static const struct pinctrl_pin_desc imx50_pinctrl_pads[] = { 208 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE0), 209 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE1), 210 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE2), 211 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE3), 212 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE4), 213 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE5), 214 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE6), 215 + IMX_PINCTRL_PIN(MX50_PAD_RESERVE7), 216 + IMX_PINCTRL_PIN(MX50_PAD_KEY_COL0), 217 + IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW0), 218 + IMX_PINCTRL_PIN(MX50_PAD_KEY_COL1), 219 + IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW1), 220 + IMX_PINCTRL_PIN(MX50_PAD_KEY_COL2), 221 + IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW2), 222 + IMX_PINCTRL_PIN(MX50_PAD_KEY_COL3), 223 + IMX_PINCTRL_PIN(MX50_PAD_KEY_ROW3), 224 + IMX_PINCTRL_PIN(MX50_PAD_I2C1_SCL), 225 + IMX_PINCTRL_PIN(MX50_PAD_I2C1_SDA), 226 + IMX_PINCTRL_PIN(MX50_PAD_I2C2_SCL), 227 + IMX_PINCTRL_PIN(MX50_PAD_I2C2_SDA), 228 + IMX_PINCTRL_PIN(MX50_PAD_I2C3_SCL), 229 + IMX_PINCTRL_PIN(MX50_PAD_I2C3_SDA), 230 + IMX_PINCTRL_PIN(MX50_PAD_PWM1), 231 + IMX_PINCTRL_PIN(MX50_PAD_PWM2), 232 + IMX_PINCTRL_PIN(MX50_PAD_0WIRE), 233 + IMX_PINCTRL_PIN(MX50_PAD_EPITO), 234 + IMX_PINCTRL_PIN(MX50_PAD_WDOG), 235 + IMX_PINCTRL_PIN(MX50_PAD_SSI_TXFS), 236 + IMX_PINCTRL_PIN(MX50_PAD_SSI_TXC), 237 + IMX_PINCTRL_PIN(MX50_PAD_SSI_TXD), 238 + IMX_PINCTRL_PIN(MX50_PAD_SSI_RXD), 239 + IMX_PINCTRL_PIN(MX50_PAD_SSI_RXF), 240 + IMX_PINCTRL_PIN(MX50_PAD_SSI_RXC), 241 + IMX_PINCTRL_PIN(MX50_PAD_UART1_TXD), 242 + IMX_PINCTRL_PIN(MX50_PAD_UART1_RXD), 243 + IMX_PINCTRL_PIN(MX50_PAD_UART1_CTS), 244 + IMX_PINCTRL_PIN(MX50_PAD_UART1_RTS), 245 + IMX_PINCTRL_PIN(MX50_PAD_UART2_TXD), 246 + IMX_PINCTRL_PIN(MX50_PAD_UART2_RXD), 247 + IMX_PINCTRL_PIN(MX50_PAD_UART2_CTS), 248 + IMX_PINCTRL_PIN(MX50_PAD_UART2_RTS), 249 + IMX_PINCTRL_PIN(MX50_PAD_UART3_TXD), 250 + IMX_PINCTRL_PIN(MX50_PAD_UART3_RXD), 251 + IMX_PINCTRL_PIN(MX50_PAD_UART4_TXD), 252 + IMX_PINCTRL_PIN(MX50_PAD_UART4_RXD), 253 + IMX_PINCTRL_PIN(MX50_PAD_CSPI_CLK), 254 + IMX_PINCTRL_PIN(MX50_PAD_CSPI_MOSI), 255 + IMX_PINCTRL_PIN(MX50_PAD_CSPI_MISO), 256 + IMX_PINCTRL_PIN(MX50_PAD_CSPI_SS0), 257 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_CLK), 258 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_MOSI), 259 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_MISO), 260 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI1_SS0), 261 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_CLK), 262 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_MOSI), 263 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_MISO), 264 + IMX_PINCTRL_PIN(MX50_PAD_ECSPI2_SS0), 265 + IMX_PINCTRL_PIN(MX50_PAD_SD1_CLK), 266 + IMX_PINCTRL_PIN(MX50_PAD_SD1_CMD), 267 + IMX_PINCTRL_PIN(MX50_PAD_SD1_D0), 268 + IMX_PINCTRL_PIN(MX50_PAD_SD1_D1), 269 + IMX_PINCTRL_PIN(MX50_PAD_SD1_D2), 270 + IMX_PINCTRL_PIN(MX50_PAD_SD1_D3), 271 + IMX_PINCTRL_PIN(MX50_PAD_SD2_CLK), 272 + IMX_PINCTRL_PIN(MX50_PAD_SD2_CMD), 273 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D0), 274 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D1), 275 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D2), 276 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D3), 277 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D4), 278 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D5), 279 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D6), 280 + IMX_PINCTRL_PIN(MX50_PAD_SD2_D7), 281 + IMX_PINCTRL_PIN(MX50_PAD_SD2_WP), 282 + IMX_PINCTRL_PIN(MX50_PAD_SD2_CD), 283 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D0), 284 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D1), 285 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D2), 286 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D3), 287 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D4), 288 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D5), 289 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D6), 290 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D7), 291 + IMX_PINCTRL_PIN(MX50_PAD_DISP_WR), 292 + IMX_PINCTRL_PIN(MX50_PAD_DISP_RD), 293 + IMX_PINCTRL_PIN(MX50_PAD_DISP_RS), 294 + IMX_PINCTRL_PIN(MX50_PAD_DISP_CS), 295 + IMX_PINCTRL_PIN(MX50_PAD_DISP_BUSY), 296 + IMX_PINCTRL_PIN(MX50_PAD_DISP_RESET), 297 + IMX_PINCTRL_PIN(MX50_PAD_SD3_CLK), 298 + IMX_PINCTRL_PIN(MX50_PAD_SD3_CMD), 299 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D0), 300 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D1), 301 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D2), 302 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D3), 303 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D4), 304 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D5), 305 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D6), 306 + IMX_PINCTRL_PIN(MX50_PAD_SD3_D7), 307 + IMX_PINCTRL_PIN(MX50_PAD_SD3_WP), 308 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D8), 309 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D9), 310 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D10), 311 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D11), 312 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D12), 313 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D13), 314 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D14), 315 + IMX_PINCTRL_PIN(MX50_PAD_DISP_D15), 316 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D0), 317 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D1), 318 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D2), 319 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D3), 320 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D4), 321 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D5), 322 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D6), 323 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D7), 324 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D8), 325 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D9), 326 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D10), 327 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D11), 328 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D12), 329 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D13), 330 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D14), 331 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_D15), 332 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDCLK), 333 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDSP), 334 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDOE), 335 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_GDRL), 336 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCLK), 337 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDOEZ), 338 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDOED), 339 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDOE), 340 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDLE), 341 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCLKN), 342 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDSHR), 343 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCOM), 344 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRSTAT), 345 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL0), 346 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL1), 347 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL2), 348 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_PWRCTRL3), 349 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_VCOM0), 350 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_VCOM1), 351 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_BDR0), 352 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_BDR1), 353 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE0), 354 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE1), 355 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE2), 356 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE3), 357 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE4), 358 + IMX_PINCTRL_PIN(MX50_PAD_EPDC_SDCE5), 359 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA0), 360 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA1), 361 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA2), 362 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA3), 363 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA4), 364 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA5), 365 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA6), 366 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA7), 367 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA8), 368 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA9), 369 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA10), 370 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA11), 371 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA12), 372 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA13), 373 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA14), 374 + IMX_PINCTRL_PIN(MX50_PAD_EIM_DA15), 375 + IMX_PINCTRL_PIN(MX50_PAD_EIM_CS2), 376 + IMX_PINCTRL_PIN(MX50_PAD_EIM_CS1), 377 + IMX_PINCTRL_PIN(MX50_PAD_EIM_CS0), 378 + IMX_PINCTRL_PIN(MX50_PAD_EIM_EB0), 379 + IMX_PINCTRL_PIN(MX50_PAD_EIM_EB1), 380 + IMX_PINCTRL_PIN(MX50_PAD_EIM_WAIT), 381 + IMX_PINCTRL_PIN(MX50_PAD_EIM_BCLK), 382 + IMX_PINCTRL_PIN(MX50_PAD_EIM_RDY), 383 + IMX_PINCTRL_PIN(MX50_PAD_EIM_OE), 384 + IMX_PINCTRL_PIN(MX50_PAD_EIM_RW), 385 + IMX_PINCTRL_PIN(MX50_PAD_EIM_LBA), 386 + IMX_PINCTRL_PIN(MX50_PAD_EIM_CRE), 387 + }; 388 + 389 + static struct imx_pinctrl_soc_info imx50_pinctrl_info = { 390 + .pins = imx50_pinctrl_pads, 391 + .npins = ARRAY_SIZE(imx50_pinctrl_pads), 392 + }; 393 + 394 + static struct of_device_id imx50_pinctrl_of_match[] = { 395 + { .compatible = "fsl,imx50-iomuxc", }, 396 + { /* sentinel */ } 397 + }; 398 + 399 + static int imx50_pinctrl_probe(struct platform_device *pdev) 400 + { 401 + return imx_pinctrl_probe(pdev, &imx50_pinctrl_info); 402 + } 403 + 404 + static struct platform_driver imx50_pinctrl_driver = { 405 + .driver = { 406 + .name = "imx50-pinctrl", 407 + .owner = THIS_MODULE, 408 + .of_match_table = of_match_ptr(imx50_pinctrl_of_match), 409 + }, 410 + .probe = imx50_pinctrl_probe, 411 + .remove = imx_pinctrl_remove, 412 + }; 413 + 414 + static int __init imx50_pinctrl_init(void) 415 + { 416 + return platform_driver_register(&imx50_pinctrl_driver); 417 + } 418 + arch_initcall(imx50_pinctrl_init); 419 + 420 + static void __exit imx50_pinctrl_exit(void) 421 + { 422 + platform_driver_unregister(&imx50_pinctrl_driver); 423 + } 424 + module_exit(imx50_pinctrl_exit); 425 + MODULE_DESCRIPTION("Freescale IMX50 pinctrl driver"); 426 + MODULE_LICENSE("GPL v2");
+1 -1
drivers/pinctrl/pinctrl-imx51.c
··· 782 782 .driver = { 783 783 .name = "imx51-pinctrl", 784 784 .owner = THIS_MODULE, 785 - .of_match_table = of_match_ptr(imx51_pinctrl_of_match), 785 + .of_match_table = imx51_pinctrl_of_match, 786 786 }, 787 787 .probe = imx51_pinctrl_probe, 788 788 .remove = imx_pinctrl_remove,
+1 -1
drivers/pinctrl/pinctrl-imx53.c
··· 468 468 .driver = { 469 469 .name = "imx53-pinctrl", 470 470 .owner = THIS_MODULE, 471 - .of_match_table = of_match_ptr(imx53_pinctrl_of_match), 471 + .of_match_table = imx53_pinctrl_of_match, 472 472 }, 473 473 .probe = imx53_pinctrl_probe, 474 474 .remove = imx_pinctrl_remove,
+1 -1
drivers/pinctrl/pinctrl-imx6dl.c
··· 474 474 .driver = { 475 475 .name = "imx6dl-pinctrl", 476 476 .owner = THIS_MODULE, 477 - .of_match_table = of_match_ptr(imx6dl_pinctrl_of_match), 477 + .of_match_table = imx6dl_pinctrl_of_match, 478 478 }, 479 479 .probe = imx6dl_pinctrl_probe, 480 480 .remove = imx_pinctrl_remove,
+1 -1
drivers/pinctrl/pinctrl-imx6q.c
··· 480 480 .driver = { 481 481 .name = "imx6q-pinctrl", 482 482 .owner = THIS_MODULE, 483 - .of_match_table = of_match_ptr(imx6q_pinctrl_of_match), 483 + .of_match_table = imx6q_pinctrl_of_match, 484 484 }, 485 485 .probe = imx6q_pinctrl_probe, 486 486 .remove = imx_pinctrl_remove,
+1 -1
drivers/pinctrl/pinctrl-imx6sl.c
··· 380 380 .driver = { 381 381 .name = "imx6sl-pinctrl", 382 382 .owner = THIS_MODULE, 383 - .of_match_table = of_match_ptr(imx6sl_pinctrl_of_match), 383 + .of_match_table = imx6sl_pinctrl_of_match, 384 384 }, 385 385 .probe = imx6sl_pinctrl_probe, 386 386 .remove = imx_pinctrl_remove,
-20
drivers/pinctrl/pinctrl-palmas.c
··· 891 891 param = pinconf_to_config_param(configs[i]); 892 892 param_val = pinconf_to_config_argument(configs[i]); 893 893 894 - if (param == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) 895 - continue; 896 - 897 894 switch (param) { 898 895 case PIN_CONFIG_BIAS_DISABLE: 899 896 case PIN_CONFIG_BIAS_PULL_UP: ··· 959 962 return 0; 960 963 } 961 964 962 - static int palmas_pinconf_group_get(struct pinctrl_dev *pctldev, 963 - unsigned group, unsigned long *config) 964 - { 965 - dev_err(pctldev->dev, "palmas_pinconf_group_get op not supported\n"); 966 - return -ENOTSUPP; 967 - } 968 - 969 - static int palmas_pinconf_group_set(struct pinctrl_dev *pctldev, 970 - unsigned group, unsigned long *configs, 971 - unsigned num_configs) 972 - { 973 - dev_err(pctldev->dev, "palmas_pinconf_group_set op not supported\n"); 974 - return -ENOTSUPP; 975 - } 976 - 977 965 static const struct pinconf_ops palmas_pinconf_ops = { 978 966 .pin_config_get = palmas_pinconf_get, 979 967 .pin_config_set = palmas_pinconf_set, 980 - .pin_config_group_get = palmas_pinconf_group_get, 981 - .pin_config_group_set = palmas_pinconf_group_set, 982 968 }; 983 969 984 970 static struct pinctrl_desc palmas_pinctrl_desc = {
+229 -63
drivers/pinctrl/pinctrl-rockchip.c
··· 56 56 #define GPIO_EXT_PORT 0x50 57 57 #define GPIO_LS_SYNC 0x60 58 58 59 + enum rockchip_pinctrl_type { 60 + RK2928, 61 + RK3066B, 62 + RK3188, 63 + }; 64 + 65 + enum rockchip_pin_bank_type { 66 + COMMON_BANK, 67 + RK3188_BANK0, 68 + }; 69 + 59 70 /** 60 71 * @reg_base: register base of the gpio bank 72 + * @reg_pull: optional separate register for additional pull settings 61 73 * @clk: clock of the gpio bank 62 74 * @irq: interrupt of the gpio bank 63 75 * @pin_base: first pin number ··· 86 74 */ 87 75 struct rockchip_pin_bank { 88 76 void __iomem *reg_base; 77 + void __iomem *reg_pull; 89 78 struct clk *clk; 90 79 int irq; 91 80 u32 pin_base; 92 81 u8 nr_pins; 93 82 char *name; 94 83 u8 bank_num; 84 + enum rockchip_pin_bank_type bank_type; 95 85 bool valid; 96 86 struct device_node *of_node; 97 87 struct rockchip_pinctrl *drvdata; ··· 101 87 struct gpio_chip gpio_chip; 102 88 struct pinctrl_gpio_range grange; 103 89 spinlock_t slock; 104 - 90 + u32 toggle_edge_mode; 105 91 }; 106 92 107 93 #define PIN_BANK(id, pins, label) \ ··· 112 98 } 113 99 114 100 /** 115 - * @pull_auto: some SoCs don't allow pulls to be specified as up or down, but 116 - * instead decide this automatically based on the pad-type. 117 101 */ 118 102 struct rockchip_pin_ctrl { 119 103 struct rockchip_pin_bank *pin_banks; 120 104 u32 nr_banks; 121 105 u32 nr_pins; 122 106 char *label; 107 + enum rockchip_pinctrl_type type; 123 108 int mux_offset; 124 - int pull_offset; 125 - bool pull_auto; 126 - int pull_bank_stride; 109 + void (*pull_calc_reg)(struct rockchip_pin_bank *bank, int pin_num, 110 + void __iomem **reg, u8 *bit); 127 111 }; 128 112 129 113 struct rockchip_pin_config { ··· 160 148 161 149 struct rockchip_pinctrl { 162 150 void __iomem *reg_base; 151 + void __iomem *reg_pull; 163 152 struct device *dev; 164 153 struct rockchip_pin_ctrl *ctrl; 165 154 struct pinctrl_desc pctl; ··· 367 354 spin_unlock_irqrestore(&bank->slock, flags); 368 355 } 369 356 357 + #define RK2928_PULL_OFFSET 0x118 358 + #define RK2928_PULL_PINS_PER_REG 16 359 + #define RK2928_PULL_BANK_STRIDE 8 360 + 361 + static void rk2928_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 362 + int pin_num, void __iomem **reg, u8 *bit) 363 + { 364 + struct rockchip_pinctrl *info = bank->drvdata; 365 + 366 + *reg = info->reg_base + RK2928_PULL_OFFSET; 367 + *reg += bank->bank_num * RK2928_PULL_BANK_STRIDE; 368 + *reg += (pin_num / RK2928_PULL_PINS_PER_REG) * 4; 369 + 370 + *bit = pin_num % RK2928_PULL_PINS_PER_REG; 371 + }; 372 + 373 + #define RK3188_PULL_BITS_PER_PIN 2 374 + #define RK3188_PULL_PINS_PER_REG 8 375 + #define RK3188_PULL_BANK_STRIDE 16 376 + 377 + static void rk3188_calc_pull_reg_and_bit(struct rockchip_pin_bank *bank, 378 + int pin_num, void __iomem **reg, u8 *bit) 379 + { 380 + struct rockchip_pinctrl *info = bank->drvdata; 381 + 382 + /* The first 12 pins of the first bank are located elsewhere */ 383 + if (bank->bank_type == RK3188_BANK0 && pin_num < 12) { 384 + *reg = bank->reg_pull + 385 + ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 386 + *bit = pin_num % RK3188_PULL_PINS_PER_REG; 387 + *bit *= RK3188_PULL_BITS_PER_PIN; 388 + } else { 389 + *reg = info->reg_pull - 4; 390 + *reg += bank->bank_num * RK3188_PULL_BANK_STRIDE; 391 + *reg += ((pin_num / RK3188_PULL_PINS_PER_REG) * 4); 392 + 393 + /* 394 + * The bits in these registers have an inverse ordering 395 + * with the lowest pin being in bits 15:14 and the highest 396 + * pin in bits 1:0 397 + */ 398 + *bit = 7 - (pin_num % RK3188_PULL_PINS_PER_REG); 399 + *bit *= RK3188_PULL_BITS_PER_PIN; 400 + } 401 + } 402 + 370 403 static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num) 371 404 { 372 405 struct rockchip_pinctrl *info = bank->drvdata; 373 406 struct rockchip_pin_ctrl *ctrl = info->ctrl; 374 407 void __iomem *reg; 375 408 u8 bit; 409 + u32 data; 376 410 377 411 /* rk3066b does support any pulls */ 378 - if (!ctrl->pull_offset) 412 + if (ctrl->type == RK3066B) 379 413 return PIN_CONFIG_BIAS_DISABLE; 380 414 381 - reg = info->reg_base + ctrl->pull_offset; 415 + ctrl->pull_calc_reg(bank, pin_num, &reg, &bit); 382 416 383 - if (ctrl->pull_auto) { 384 - reg += bank->bank_num * ctrl->pull_bank_stride; 385 - reg += (pin_num / 16) * 4; 386 - bit = pin_num % 16; 387 - 417 + switch (ctrl->type) { 418 + case RK2928: 388 419 return !(readl_relaxed(reg) & BIT(bit)) 389 420 ? PIN_CONFIG_BIAS_PULL_PIN_DEFAULT 390 421 : PIN_CONFIG_BIAS_DISABLE; 391 - } else { 392 - dev_err(info->dev, "pull support for rk31xx not implemented\n"); 422 + case RK3188: 423 + data = readl_relaxed(reg) >> bit; 424 + data &= (1 << RK3188_PULL_BITS_PER_PIN) - 1; 425 + 426 + switch (data) { 427 + case 0: 428 + return PIN_CONFIG_BIAS_DISABLE; 429 + case 1: 430 + return PIN_CONFIG_BIAS_PULL_UP; 431 + case 2: 432 + return PIN_CONFIG_BIAS_PULL_DOWN; 433 + case 3: 434 + return PIN_CONFIG_BIAS_BUS_HOLD; 435 + } 436 + 437 + dev_err(info->dev, "unknown pull setting\n"); 393 438 return -EIO; 394 - } 439 + default: 440 + dev_err(info->dev, "unsupported pinctrl type\n"); 441 + return -EINVAL; 442 + }; 395 443 } 396 444 397 445 static int rockchip_set_pull(struct rockchip_pin_bank *bank, ··· 469 395 bank->bank_num, pin_num, pull); 470 396 471 397 /* rk3066b does support any pulls */ 472 - if (!ctrl->pull_offset) 398 + if (ctrl->type == RK3066B) 473 399 return pull ? -EINVAL : 0; 474 400 475 - reg = info->reg_base + ctrl->pull_offset; 401 + ctrl->pull_calc_reg(bank, pin_num, &reg, &bit); 476 402 477 - if (ctrl->pull_auto) { 478 - if (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT && 479 - pull != PIN_CONFIG_BIAS_DISABLE) { 480 - dev_err(info->dev, "only PIN_DEFAULT and DISABLE allowed\n"); 481 - return -EINVAL; 482 - } 483 - 484 - reg += bank->bank_num * ctrl->pull_bank_stride; 485 - reg += (pin_num / 16) * 4; 486 - bit = pin_num % 16; 487 - 403 + switch (ctrl->type) { 404 + case RK2928: 488 405 spin_lock_irqsave(&bank->slock, flags); 489 406 490 407 data = BIT(bit + 16); ··· 484 419 writel(data, reg); 485 420 486 421 spin_unlock_irqrestore(&bank->slock, flags); 487 - } else { 488 - if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) { 489 - dev_err(info->dev, "pull direction (up/down) needs to be specified\n"); 422 + break; 423 + case RK3188: 424 + spin_lock_irqsave(&bank->slock, flags); 425 + 426 + /* enable the write to the equivalent lower bits */ 427 + data = ((1 << RK3188_PULL_BITS_PER_PIN) - 1) << (bit + 16); 428 + 429 + switch (pull) { 430 + case PIN_CONFIG_BIAS_DISABLE: 431 + break; 432 + case PIN_CONFIG_BIAS_PULL_UP: 433 + data |= (1 << bit); 434 + break; 435 + case PIN_CONFIG_BIAS_PULL_DOWN: 436 + data |= (2 << bit); 437 + break; 438 + case PIN_CONFIG_BIAS_BUS_HOLD: 439 + data |= (3 << bit); 440 + break; 441 + default: 442 + dev_err(info->dev, "unsupported pull setting %d\n", 443 + pull); 490 444 return -EINVAL; 491 445 } 492 446 493 - dev_err(info->dev, "pull support for rk31xx not implemented\n"); 494 - return -EIO; 447 + writel(data, reg); 448 + 449 + spin_unlock_irqrestore(&bank->slock, flags); 450 + break; 451 + default: 452 + dev_err(info->dev, "unsupported pinctrl type\n"); 453 + return -EINVAL; 495 454 } 496 455 497 456 return 0; ··· 645 556 static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl, 646 557 enum pin_config_param pull) 647 558 { 648 - /* rk3066b does support any pulls */ 649 - if (!ctrl->pull_offset) 559 + switch (ctrl->type) { 560 + case RK2928: 561 + return (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT || 562 + pull == PIN_CONFIG_BIAS_DISABLE); 563 + case RK3066B: 650 564 return pull ? false : true; 651 - 652 - if (ctrl->pull_auto) { 653 - if (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT && 654 - pull != PIN_CONFIG_BIAS_DISABLE) 655 - return false; 656 - } else { 657 - if (pull == PIN_CONFIG_BIAS_PULL_PIN_DEFAULT) 658 - return false; 565 + case RK3188: 566 + return (pull != PIN_CONFIG_BIAS_PULL_PIN_DEFAULT); 659 567 } 660 568 661 - return true; 569 + return false; 662 570 } 663 571 664 572 /* set the pin config settings for a specified pin */ ··· 683 597 case PIN_CONFIG_BIAS_PULL_UP: 684 598 case PIN_CONFIG_BIAS_PULL_DOWN: 685 599 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 600 + case PIN_CONFIG_BIAS_BUS_HOLD: 686 601 if (!rockchip_pinconf_pull_valid(info->ctrl, param)) 687 602 return -ENOTSUPP; 688 603 ··· 722 635 case PIN_CONFIG_BIAS_PULL_UP: 723 636 case PIN_CONFIG_BIAS_PULL_DOWN: 724 637 case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT: 638 + case PIN_CONFIG_BIAS_BUS_HOLD: 725 639 if (!rockchip_pinconf_pull_valid(info->ctrl, param)) 726 640 return -ENOTSUPP; 727 641 ··· 744 656 .pin_config_set = rockchip_pinconf_set, 745 657 }; 746 658 747 - static const char *gpio_compat = "rockchip,gpio-bank"; 659 + static const struct of_device_id rockchip_bank_match[] = { 660 + { .compatible = "rockchip,gpio-bank" }, 661 + { .compatible = "rockchip,rk3188-gpio-bank0" }, 662 + {}, 663 + }; 748 664 749 665 static void rockchip_pinctrl_child_count(struct rockchip_pinctrl *info, 750 666 struct device_node *np) ··· 756 664 struct device_node *child; 757 665 758 666 for_each_child_of_node(np, child) { 759 - if (of_device_is_compatible(child, gpio_compat)) 667 + if (of_match_node(rockchip_bank_match, child)) 760 668 continue; 761 669 762 670 info->nfunctions++; ··· 899 807 i = 0; 900 808 901 809 for_each_child_of_node(np, child) { 902 - if (of_device_is_compatible(child, gpio_compat)) 810 + if (of_match_node(rockchip_bank_match, child)) 903 811 continue; 812 + 904 813 ret = rockchip_pinctrl_parse_functions(child, info, i++); 905 814 if (ret) { 906 815 dev_err(&pdev->dev, "failed to parse function\n"); ··· 1078 985 { 1079 986 struct irq_chip *chip = irq_get_chip(irq); 1080 987 struct rockchip_pin_bank *bank = irq_get_handler_data(irq); 988 + u32 polarity = 0, data = 0; 1081 989 u32 pend; 990 + bool edge_changed = false; 1082 991 1083 992 dev_dbg(bank->drvdata->dev, "got irq for bank %s\n", bank->name); 1084 993 1085 994 chained_irq_enter(chip, desc); 1086 995 1087 996 pend = readl_relaxed(bank->reg_base + GPIO_INT_STATUS); 997 + 998 + if (bank->toggle_edge_mode) { 999 + polarity = readl_relaxed(bank->reg_base + 1000 + GPIO_INT_POLARITY); 1001 + data = readl_relaxed(bank->reg_base + GPIO_EXT_PORT); 1002 + } 1088 1003 1089 1004 while (pend) { 1090 1005 unsigned int virq; ··· 1108 1007 1109 1008 dev_dbg(bank->drvdata->dev, "handling irq %d\n", irq); 1110 1009 1010 + /* 1011 + * Triggering IRQ on both rising and falling edge 1012 + * needs manual intervention. 1013 + */ 1014 + if (bank->toggle_edge_mode & BIT(irq)) { 1015 + if (data & BIT(irq)) 1016 + polarity &= ~BIT(irq); 1017 + else 1018 + polarity |= BIT(irq); 1019 + 1020 + edge_changed = true; 1021 + } 1022 + 1111 1023 generic_handle_irq(virq); 1024 + } 1025 + 1026 + if (bank->toggle_edge_mode && edge_changed) { 1027 + /* Interrupt params should only be set with ints disabled */ 1028 + data = readl_relaxed(bank->reg_base + GPIO_INTEN); 1029 + writel_relaxed(0, bank->reg_base + GPIO_INTEN); 1030 + writel(polarity, bank->reg_base + GPIO_INT_POLARITY); 1031 + writel(data, bank->reg_base + GPIO_INTEN); 1112 1032 } 1113 1033 1114 1034 chained_irq_exit(chip, desc); ··· 1144 1022 u32 level; 1145 1023 u32 data; 1146 1024 1025 + /* make sure the pin is configured as gpio input */ 1026 + rockchip_set_mux(bank, d->hwirq, RK_FUNC_GPIO); 1027 + data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR); 1028 + data &= ~mask; 1029 + writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR); 1030 + 1147 1031 if (type & IRQ_TYPE_EDGE_BOTH) 1148 1032 __irq_set_handler_locked(d->irq, handle_edge_irq); 1149 1033 else ··· 1161 1033 polarity = readl_relaxed(gc->reg_base + GPIO_INT_POLARITY); 1162 1034 1163 1035 switch (type) { 1036 + case IRQ_TYPE_EDGE_BOTH: 1037 + bank->toggle_edge_mode |= mask; 1038 + level |= mask; 1039 + 1040 + /* 1041 + * Determine gpio state. If 1 next interrupt should be falling 1042 + * otherwise rising. 1043 + */ 1044 + data = readl(bank->reg_base + GPIO_EXT_PORT); 1045 + if (data & mask) 1046 + polarity &= ~mask; 1047 + else 1048 + polarity |= mask; 1049 + break; 1164 1050 case IRQ_TYPE_EDGE_RISING: 1051 + bank->toggle_edge_mode &= ~mask; 1165 1052 level |= mask; 1166 1053 polarity |= mask; 1167 1054 break; 1168 1055 case IRQ_TYPE_EDGE_FALLING: 1056 + bank->toggle_edge_mode &= ~mask; 1169 1057 level |= mask; 1170 1058 polarity &= ~mask; 1171 1059 break; 1172 1060 case IRQ_TYPE_LEVEL_HIGH: 1061 + bank->toggle_edge_mode &= ~mask; 1173 1062 level &= ~mask; 1174 1063 polarity |= mask; 1175 1064 break; 1176 1065 case IRQ_TYPE_LEVEL_LOW: 1066 + bank->toggle_edge_mode &= ~mask; 1177 1067 level &= ~mask; 1178 1068 polarity &= ~mask; 1179 1069 break; ··· 1204 1058 writel_relaxed(polarity, gc->reg_base + GPIO_INT_POLARITY); 1205 1059 1206 1060 irq_gc_unlock(gc); 1207 - 1208 - /* make sure the pin is configured as gpio input */ 1209 - rockchip_set_mux(bank, d->hwirq, RK_FUNC_GPIO); 1210 - data = readl_relaxed(bank->reg_base + GPIO_SWPORT_DDR); 1211 - data &= ~mask; 1212 - writel_relaxed(data, bank->reg_base + GPIO_SWPORT_DDR); 1213 1061 1214 1062 return 0; 1215 1063 } ··· 1345 1205 if (IS_ERR(bank->reg_base)) 1346 1206 return PTR_ERR(bank->reg_base); 1347 1207 1208 + /* 1209 + * special case, where parts of the pull setting-registers are 1210 + * part of the PMU register space 1211 + */ 1212 + if (of_device_is_compatible(bank->of_node, 1213 + "rockchip,rk3188-gpio-bank0")) { 1214 + bank->bank_type = RK3188_BANK0; 1215 + 1216 + if (of_address_to_resource(bank->of_node, 1, &res)) { 1217 + dev_err(dev, "cannot find IO resource for bank\n"); 1218 + return -ENOENT; 1219 + } 1220 + 1221 + bank->reg_pull = devm_ioremap_resource(dev, &res); 1222 + if (IS_ERR(bank->reg_pull)) 1223 + return PTR_ERR(bank->reg_pull); 1224 + } else { 1225 + bank->bank_type = COMMON_BANK; 1226 + } 1227 + 1348 1228 bank->irq = irq_of_parse_and_map(bank->of_node, 0); 1349 1229 1350 1230 bank->clk = of_clk_get(bank->of_node, 0); ··· 1449 1289 if (IS_ERR(info->reg_base)) 1450 1290 return PTR_ERR(info->reg_base); 1451 1291 1292 + /* The RK3188 has its pull registers in a separate place */ 1293 + if (ctrl->type == RK3188) { 1294 + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 1295 + info->reg_pull = devm_ioremap_resource(&pdev->dev, res); 1296 + if (IS_ERR(info->reg_base)) 1297 + return PTR_ERR(info->reg_base); 1298 + } 1299 + 1452 1300 ret = rockchip_gpiolib_register(pdev, info); 1453 1301 if (ret) 1454 1302 return ret; ··· 1483 1315 .pin_banks = rk2928_pin_banks, 1484 1316 .nr_banks = ARRAY_SIZE(rk2928_pin_banks), 1485 1317 .label = "RK2928-GPIO", 1318 + .type = RK2928, 1486 1319 .mux_offset = 0xa8, 1487 - .pull_offset = 0x118, 1488 - .pull_auto = 1, 1489 - .pull_bank_stride = 8, 1320 + .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 1490 1321 }; 1491 1322 1492 1323 static struct rockchip_pin_bank rk3066a_pin_banks[] = { ··· 1501 1334 .pin_banks = rk3066a_pin_banks, 1502 1335 .nr_banks = ARRAY_SIZE(rk3066a_pin_banks), 1503 1336 .label = "RK3066a-GPIO", 1337 + .type = RK2928, 1504 1338 .mux_offset = 0xa8, 1505 - .pull_offset = 0x118, 1506 - .pull_auto = 1, 1507 - .pull_bank_stride = 8, 1339 + .pull_calc_reg = rk2928_calc_pull_reg_and_bit, 1508 1340 }; 1509 1341 1510 1342 static struct rockchip_pin_bank rk3066b_pin_banks[] = { ··· 1517 1351 .pin_banks = rk3066b_pin_banks, 1518 1352 .nr_banks = ARRAY_SIZE(rk3066b_pin_banks), 1519 1353 .label = "RK3066b-GPIO", 1354 + .type = RK3066B, 1520 1355 .mux_offset = 0x60, 1521 - .pull_offset = -EINVAL, 1522 1356 }; 1523 1357 1524 1358 static struct rockchip_pin_bank rk3188_pin_banks[] = { ··· 1532 1366 .pin_banks = rk3188_pin_banks, 1533 1367 .nr_banks = ARRAY_SIZE(rk3188_pin_banks), 1534 1368 .label = "RK3188-GPIO", 1369 + .type = RK3188, 1535 1370 .mux_offset = 0x68, 1536 - .pull_offset = 0x164, 1537 - .pull_bank_stride = 16, 1371 + .pull_calc_reg = rk3188_calc_pull_reg_and_bit, 1538 1372 }; 1539 1373 1540 1374 static const struct of_device_id rockchip_pinctrl_dt_match[] = {
+1 -1
drivers/pinctrl/pinctrl-samsung.c
··· 1148 1148 .driver = { 1149 1149 .name = "samsung-pinctrl", 1150 1150 .owner = THIS_MODULE, 1151 - .of_match_table = of_match_ptr(samsung_pinctrl_dt_match), 1151 + .of_match_table = samsung_pinctrl_dt_match, 1152 1152 }, 1153 1153 }; 1154 1154
+875
drivers/pinctrl/pinctrl-tb10x.c
··· 1 + /* 2 + * Abilis Systems TB10x pin control driver 3 + * 4 + * Copyright (C) Abilis Systems 2012 5 + * 6 + * Author: Christian Ruppert <christian.ruppert@abilis.com> 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License version 2 as 10 + * published by the Free Software Foundation. 11 + * 12 + * This program is distributed in the hope that it will be useful, 13 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 + * GNU General Public License for more details. 16 + * 17 + * You should have received a copy of the GNU General Public License 18 + * along with this program; if not, write to the Free Software 19 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20 + */ 21 + 22 + #include <linux/stringify.h> 23 + #include <linux/pinctrl/pinctrl.h> 24 + #include <linux/pinctrl/pinmux.h> 25 + #include <linux/pinctrl/machine.h> 26 + #include <linux/platform_device.h> 27 + #include <linux/module.h> 28 + #include <linux/mutex.h> 29 + #include <linux/err.h> 30 + #include <linux/io.h> 31 + #include <linux/of.h> 32 + #include <linux/slab.h> 33 + 34 + #include "pinctrl-utils.h" 35 + 36 + #define TB10X_PORT1 (0) 37 + #define TB10X_PORT2 (16) 38 + #define TB10X_PORT3 (32) 39 + #define TB10X_PORT4 (48) 40 + #define TB10X_PORT5 (128) 41 + #define TB10X_PORT6 (64) 42 + #define TB10X_PORT7 (80) 43 + #define TB10X_PORT8 (96) 44 + #define TB10X_PORT9 (112) 45 + #define TB10X_GPIOS (256) 46 + 47 + #define PCFG_PORT_BITWIDTH (2) 48 + #define PCFG_PORT_MASK(PORT) \ 49 + (((1 << PCFG_PORT_BITWIDTH) - 1) << (PCFG_PORT_BITWIDTH * (PORT))) 50 + 51 + static const struct pinctrl_pin_desc tb10x_pins[] = { 52 + /* Port 1 */ 53 + PINCTRL_PIN(TB10X_PORT1 + 0, "MICLK_S0"), 54 + PINCTRL_PIN(TB10X_PORT1 + 1, "MISTRT_S0"), 55 + PINCTRL_PIN(TB10X_PORT1 + 2, "MIVAL_S0"), 56 + PINCTRL_PIN(TB10X_PORT1 + 3, "MDI_S0"), 57 + PINCTRL_PIN(TB10X_PORT1 + 4, "GPIOA0"), 58 + PINCTRL_PIN(TB10X_PORT1 + 5, "GPIOA1"), 59 + PINCTRL_PIN(TB10X_PORT1 + 6, "GPIOA2"), 60 + PINCTRL_PIN(TB10X_PORT1 + 7, "MDI_S1"), 61 + PINCTRL_PIN(TB10X_PORT1 + 8, "MIVAL_S1"), 62 + PINCTRL_PIN(TB10X_PORT1 + 9, "MISTRT_S1"), 63 + PINCTRL_PIN(TB10X_PORT1 + 10, "MICLK_S1"), 64 + /* Port 2 */ 65 + PINCTRL_PIN(TB10X_PORT2 + 0, "MICLK_S2"), 66 + PINCTRL_PIN(TB10X_PORT2 + 1, "MISTRT_S2"), 67 + PINCTRL_PIN(TB10X_PORT2 + 2, "MIVAL_S2"), 68 + PINCTRL_PIN(TB10X_PORT2 + 3, "MDI_S2"), 69 + PINCTRL_PIN(TB10X_PORT2 + 4, "GPIOC0"), 70 + PINCTRL_PIN(TB10X_PORT2 + 5, "GPIOC1"), 71 + PINCTRL_PIN(TB10X_PORT2 + 6, "GPIOC2"), 72 + PINCTRL_PIN(TB10X_PORT2 + 7, "MDI_S3"), 73 + PINCTRL_PIN(TB10X_PORT2 + 8, "MIVAL_S3"), 74 + PINCTRL_PIN(TB10X_PORT2 + 9, "MISTRT_S3"), 75 + PINCTRL_PIN(TB10X_PORT2 + 10, "MICLK_S3"), 76 + /* Port 3 */ 77 + PINCTRL_PIN(TB10X_PORT3 + 0, "MICLK_S4"), 78 + PINCTRL_PIN(TB10X_PORT3 + 1, "MISTRT_S4"), 79 + PINCTRL_PIN(TB10X_PORT3 + 2, "MIVAL_S4"), 80 + PINCTRL_PIN(TB10X_PORT3 + 3, "MDI_S4"), 81 + PINCTRL_PIN(TB10X_PORT3 + 4, "GPIOE0"), 82 + PINCTRL_PIN(TB10X_PORT3 + 5, "GPIOE1"), 83 + PINCTRL_PIN(TB10X_PORT3 + 6, "GPIOE2"), 84 + PINCTRL_PIN(TB10X_PORT3 + 7, "MDI_S5"), 85 + PINCTRL_PIN(TB10X_PORT3 + 8, "MIVAL_S5"), 86 + PINCTRL_PIN(TB10X_PORT3 + 9, "MISTRT_S5"), 87 + PINCTRL_PIN(TB10X_PORT3 + 10, "MICLK_S5"), 88 + /* Port 4 */ 89 + PINCTRL_PIN(TB10X_PORT4 + 0, "MICLK_S6"), 90 + PINCTRL_PIN(TB10X_PORT4 + 1, "MISTRT_S6"), 91 + PINCTRL_PIN(TB10X_PORT4 + 2, "MIVAL_S6"), 92 + PINCTRL_PIN(TB10X_PORT4 + 3, "MDI_S6"), 93 + PINCTRL_PIN(TB10X_PORT4 + 4, "GPIOG0"), 94 + PINCTRL_PIN(TB10X_PORT4 + 5, "GPIOG1"), 95 + PINCTRL_PIN(TB10X_PORT4 + 6, "GPIOG2"), 96 + PINCTRL_PIN(TB10X_PORT4 + 7, "MDI_S7"), 97 + PINCTRL_PIN(TB10X_PORT4 + 8, "MIVAL_S7"), 98 + PINCTRL_PIN(TB10X_PORT4 + 9, "MISTRT_S7"), 99 + PINCTRL_PIN(TB10X_PORT4 + 10, "MICLK_S7"), 100 + /* Port 5 */ 101 + PINCTRL_PIN(TB10X_PORT5 + 0, "PC_CE1N"), 102 + PINCTRL_PIN(TB10X_PORT5 + 1, "PC_CE2N"), 103 + PINCTRL_PIN(TB10X_PORT5 + 2, "PC_REGN"), 104 + PINCTRL_PIN(TB10X_PORT5 + 3, "PC_INPACKN"), 105 + PINCTRL_PIN(TB10X_PORT5 + 4, "PC_OEN"), 106 + PINCTRL_PIN(TB10X_PORT5 + 5, "PC_WEN"), 107 + PINCTRL_PIN(TB10X_PORT5 + 6, "PC_IORDN"), 108 + PINCTRL_PIN(TB10X_PORT5 + 7, "PC_IOWRN"), 109 + PINCTRL_PIN(TB10X_PORT5 + 8, "PC_RDYIRQN"), 110 + PINCTRL_PIN(TB10X_PORT5 + 9, "PC_WAITN"), 111 + PINCTRL_PIN(TB10X_PORT5 + 10, "PC_A0"), 112 + PINCTRL_PIN(TB10X_PORT5 + 11, "PC_A1"), 113 + PINCTRL_PIN(TB10X_PORT5 + 12, "PC_A2"), 114 + PINCTRL_PIN(TB10X_PORT5 + 13, "PC_A3"), 115 + PINCTRL_PIN(TB10X_PORT5 + 14, "PC_A4"), 116 + PINCTRL_PIN(TB10X_PORT5 + 15, "PC_A5"), 117 + PINCTRL_PIN(TB10X_PORT5 + 16, "PC_A6"), 118 + PINCTRL_PIN(TB10X_PORT5 + 17, "PC_A7"), 119 + PINCTRL_PIN(TB10X_PORT5 + 18, "PC_A8"), 120 + PINCTRL_PIN(TB10X_PORT5 + 19, "PC_A9"), 121 + PINCTRL_PIN(TB10X_PORT5 + 20, "PC_A10"), 122 + PINCTRL_PIN(TB10X_PORT5 + 21, "PC_A11"), 123 + PINCTRL_PIN(TB10X_PORT5 + 22, "PC_A12"), 124 + PINCTRL_PIN(TB10X_PORT5 + 23, "PC_A13"), 125 + PINCTRL_PIN(TB10X_PORT5 + 24, "PC_A14"), 126 + PINCTRL_PIN(TB10X_PORT5 + 25, "PC_D0"), 127 + PINCTRL_PIN(TB10X_PORT5 + 26, "PC_D1"), 128 + PINCTRL_PIN(TB10X_PORT5 + 27, "PC_D2"), 129 + PINCTRL_PIN(TB10X_PORT5 + 28, "PC_D3"), 130 + PINCTRL_PIN(TB10X_PORT5 + 29, "PC_D4"), 131 + PINCTRL_PIN(TB10X_PORT5 + 30, "PC_D5"), 132 + PINCTRL_PIN(TB10X_PORT5 + 31, "PC_D6"), 133 + PINCTRL_PIN(TB10X_PORT5 + 32, "PC_D7"), 134 + PINCTRL_PIN(TB10X_PORT5 + 33, "PC_MOSTRT"), 135 + PINCTRL_PIN(TB10X_PORT5 + 34, "PC_MOVAL"), 136 + PINCTRL_PIN(TB10X_PORT5 + 35, "PC_MDO0"), 137 + PINCTRL_PIN(TB10X_PORT5 + 36, "PC_MDO1"), 138 + PINCTRL_PIN(TB10X_PORT5 + 37, "PC_MDO2"), 139 + PINCTRL_PIN(TB10X_PORT5 + 38, "PC_MDO3"), 140 + PINCTRL_PIN(TB10X_PORT5 + 39, "PC_MDO4"), 141 + PINCTRL_PIN(TB10X_PORT5 + 40, "PC_MDO5"), 142 + PINCTRL_PIN(TB10X_PORT5 + 41, "PC_MDO6"), 143 + PINCTRL_PIN(TB10X_PORT5 + 42, "PC_MDO7"), 144 + PINCTRL_PIN(TB10X_PORT5 + 43, "PC_MISTRT"), 145 + PINCTRL_PIN(TB10X_PORT5 + 44, "PC_MIVAL"), 146 + PINCTRL_PIN(TB10X_PORT5 + 45, "PC_MDI0"), 147 + PINCTRL_PIN(TB10X_PORT5 + 46, "PC_MDI1"), 148 + PINCTRL_PIN(TB10X_PORT5 + 47, "PC_MDI2"), 149 + PINCTRL_PIN(TB10X_PORT5 + 48, "PC_MDI3"), 150 + PINCTRL_PIN(TB10X_PORT5 + 49, "PC_MDI4"), 151 + PINCTRL_PIN(TB10X_PORT5 + 50, "PC_MDI5"), 152 + PINCTRL_PIN(TB10X_PORT5 + 51, "PC_MDI6"), 153 + PINCTRL_PIN(TB10X_PORT5 + 52, "PC_MDI7"), 154 + PINCTRL_PIN(TB10X_PORT5 + 53, "PC_MICLK"), 155 + /* Port 6 */ 156 + PINCTRL_PIN(TB10X_PORT6 + 0, "T_MOSTRT_S0"), 157 + PINCTRL_PIN(TB10X_PORT6 + 1, "T_MOVAL_S0"), 158 + PINCTRL_PIN(TB10X_PORT6 + 2, "T_MDO_S0"), 159 + PINCTRL_PIN(TB10X_PORT6 + 3, "T_MOSTRT_S1"), 160 + PINCTRL_PIN(TB10X_PORT6 + 4, "T_MOVAL_S1"), 161 + PINCTRL_PIN(TB10X_PORT6 + 5, "T_MDO_S1"), 162 + PINCTRL_PIN(TB10X_PORT6 + 6, "T_MOSTRT_S2"), 163 + PINCTRL_PIN(TB10X_PORT6 + 7, "T_MOVAL_S2"), 164 + PINCTRL_PIN(TB10X_PORT6 + 8, "T_MDO_S2"), 165 + PINCTRL_PIN(TB10X_PORT6 + 9, "T_MOSTRT_S3"), 166 + /* Port 7 */ 167 + PINCTRL_PIN(TB10X_PORT7 + 0, "UART0_TXD"), 168 + PINCTRL_PIN(TB10X_PORT7 + 1, "UART0_RXD"), 169 + PINCTRL_PIN(TB10X_PORT7 + 2, "UART0_CTS"), 170 + PINCTRL_PIN(TB10X_PORT7 + 3, "UART0_RTS"), 171 + PINCTRL_PIN(TB10X_PORT7 + 4, "UART1_TXD"), 172 + PINCTRL_PIN(TB10X_PORT7 + 5, "UART1_RXD"), 173 + PINCTRL_PIN(TB10X_PORT7 + 6, "UART1_CTS"), 174 + PINCTRL_PIN(TB10X_PORT7 + 7, "UART1_RTS"), 175 + /* Port 8 */ 176 + PINCTRL_PIN(TB10X_PORT8 + 0, "SPI3_CLK"), 177 + PINCTRL_PIN(TB10X_PORT8 + 1, "SPI3_MISO"), 178 + PINCTRL_PIN(TB10X_PORT8 + 2, "SPI3_MOSI"), 179 + PINCTRL_PIN(TB10X_PORT8 + 3, "SPI3_SSN"), 180 + /* Port 9 */ 181 + PINCTRL_PIN(TB10X_PORT9 + 0, "SPI1_CLK"), 182 + PINCTRL_PIN(TB10X_PORT9 + 1, "SPI1_MISO"), 183 + PINCTRL_PIN(TB10X_PORT9 + 2, "SPI1_MOSI"), 184 + PINCTRL_PIN(TB10X_PORT9 + 3, "SPI1_SSN0"), 185 + PINCTRL_PIN(TB10X_PORT9 + 4, "SPI1_SSN1"), 186 + /* Unmuxed GPIOs */ 187 + PINCTRL_PIN(TB10X_GPIOS + 0, "GPIOB0"), 188 + PINCTRL_PIN(TB10X_GPIOS + 1, "GPIOB1"), 189 + 190 + PINCTRL_PIN(TB10X_GPIOS + 2, "GPIOD0"), 191 + PINCTRL_PIN(TB10X_GPIOS + 3, "GPIOD1"), 192 + 193 + PINCTRL_PIN(TB10X_GPIOS + 4, "GPIOF0"), 194 + PINCTRL_PIN(TB10X_GPIOS + 5, "GPIOF1"), 195 + 196 + PINCTRL_PIN(TB10X_GPIOS + 6, "GPIOH0"), 197 + PINCTRL_PIN(TB10X_GPIOS + 7, "GPIOH1"), 198 + 199 + PINCTRL_PIN(TB10X_GPIOS + 8, "GPIOI0"), 200 + PINCTRL_PIN(TB10X_GPIOS + 9, "GPIOI1"), 201 + PINCTRL_PIN(TB10X_GPIOS + 10, "GPIOI2"), 202 + PINCTRL_PIN(TB10X_GPIOS + 11, "GPIOI3"), 203 + PINCTRL_PIN(TB10X_GPIOS + 12, "GPIOI4"), 204 + PINCTRL_PIN(TB10X_GPIOS + 13, "GPIOI5"), 205 + PINCTRL_PIN(TB10X_GPIOS + 14, "GPIOI6"), 206 + PINCTRL_PIN(TB10X_GPIOS + 15, "GPIOI7"), 207 + PINCTRL_PIN(TB10X_GPIOS + 16, "GPIOI8"), 208 + PINCTRL_PIN(TB10X_GPIOS + 17, "GPIOI9"), 209 + PINCTRL_PIN(TB10X_GPIOS + 18, "GPIOI10"), 210 + PINCTRL_PIN(TB10X_GPIOS + 19, "GPIOI11"), 211 + 212 + PINCTRL_PIN(TB10X_GPIOS + 20, "GPION0"), 213 + PINCTRL_PIN(TB10X_GPIOS + 21, "GPION1"), 214 + PINCTRL_PIN(TB10X_GPIOS + 22, "GPION2"), 215 + PINCTRL_PIN(TB10X_GPIOS + 23, "GPION3"), 216 + #define MAX_PIN (TB10X_GPIOS + 24) 217 + PINCTRL_PIN(MAX_PIN, "GPION4"), 218 + }; 219 + 220 + 221 + /* Port 1 */ 222 + static const unsigned mis0_pins[] = { TB10X_PORT1 + 0, TB10X_PORT1 + 1, 223 + TB10X_PORT1 + 2, TB10X_PORT1 + 3}; 224 + static const unsigned gpioa_pins[] = { TB10X_PORT1 + 4, TB10X_PORT1 + 5, 225 + TB10X_PORT1 + 6}; 226 + static const unsigned mis1_pins[] = { TB10X_PORT1 + 7, TB10X_PORT1 + 8, 227 + TB10X_PORT1 + 9, TB10X_PORT1 + 10}; 228 + static const unsigned mip1_pins[] = { TB10X_PORT1 + 0, TB10X_PORT1 + 1, 229 + TB10X_PORT1 + 2, TB10X_PORT1 + 3, 230 + TB10X_PORT1 + 4, TB10X_PORT1 + 5, 231 + TB10X_PORT1 + 6, TB10X_PORT1 + 7, 232 + TB10X_PORT1 + 8, TB10X_PORT1 + 9, 233 + TB10X_PORT1 + 10}; 234 + 235 + /* Port 2 */ 236 + static const unsigned mis2_pins[] = { TB10X_PORT2 + 0, TB10X_PORT2 + 1, 237 + TB10X_PORT2 + 2, TB10X_PORT2 + 3}; 238 + static const unsigned gpioc_pins[] = { TB10X_PORT2 + 4, TB10X_PORT2 + 5, 239 + TB10X_PORT2 + 6}; 240 + static const unsigned mis3_pins[] = { TB10X_PORT2 + 7, TB10X_PORT2 + 8, 241 + TB10X_PORT2 + 9, TB10X_PORT2 + 10}; 242 + static const unsigned mip3_pins[] = { TB10X_PORT2 + 0, TB10X_PORT2 + 1, 243 + TB10X_PORT2 + 2, TB10X_PORT2 + 3, 244 + TB10X_PORT2 + 4, TB10X_PORT2 + 5, 245 + TB10X_PORT2 + 6, TB10X_PORT2 + 7, 246 + TB10X_PORT2 + 8, TB10X_PORT2 + 9, 247 + TB10X_PORT2 + 10}; 248 + 249 + /* Port 3 */ 250 + static const unsigned mis4_pins[] = { TB10X_PORT3 + 0, TB10X_PORT3 + 1, 251 + TB10X_PORT3 + 2, TB10X_PORT3 + 3}; 252 + static const unsigned gpioe_pins[] = { TB10X_PORT3 + 4, TB10X_PORT3 + 5, 253 + TB10X_PORT3 + 6}; 254 + static const unsigned mis5_pins[] = { TB10X_PORT3 + 7, TB10X_PORT3 + 8, 255 + TB10X_PORT3 + 9, TB10X_PORT3 + 10}; 256 + static const unsigned mip5_pins[] = { TB10X_PORT3 + 0, TB10X_PORT3 + 1, 257 + TB10X_PORT3 + 2, TB10X_PORT3 + 3, 258 + TB10X_PORT3 + 4, TB10X_PORT3 + 5, 259 + TB10X_PORT3 + 6, TB10X_PORT3 + 7, 260 + TB10X_PORT3 + 8, TB10X_PORT3 + 9, 261 + TB10X_PORT3 + 10}; 262 + 263 + /* Port 4 */ 264 + static const unsigned mis6_pins[] = { TB10X_PORT4 + 0, TB10X_PORT4 + 1, 265 + TB10X_PORT4 + 2, TB10X_PORT4 + 3}; 266 + static const unsigned gpiog_pins[] = { TB10X_PORT4 + 4, TB10X_PORT4 + 5, 267 + TB10X_PORT4 + 6}; 268 + static const unsigned mis7_pins[] = { TB10X_PORT4 + 7, TB10X_PORT4 + 8, 269 + TB10X_PORT4 + 9, TB10X_PORT4 + 10}; 270 + static const unsigned mip7_pins[] = { TB10X_PORT4 + 0, TB10X_PORT4 + 1, 271 + TB10X_PORT4 + 2, TB10X_PORT4 + 3, 272 + TB10X_PORT4 + 4, TB10X_PORT4 + 5, 273 + TB10X_PORT4 + 6, TB10X_PORT4 + 7, 274 + TB10X_PORT4 + 8, TB10X_PORT4 + 9, 275 + TB10X_PORT4 + 10}; 276 + 277 + /* Port 6 */ 278 + static const unsigned mop_pins[] = { TB10X_PORT6 + 0, TB10X_PORT6 + 1, 279 + TB10X_PORT6 + 2, TB10X_PORT6 + 3, 280 + TB10X_PORT6 + 4, TB10X_PORT6 + 5, 281 + TB10X_PORT6 + 6, TB10X_PORT6 + 7, 282 + TB10X_PORT6 + 8, TB10X_PORT6 + 9}; 283 + static const unsigned mos0_pins[] = { TB10X_PORT6 + 0, TB10X_PORT6 + 1, 284 + TB10X_PORT6 + 2}; 285 + static const unsigned mos1_pins[] = { TB10X_PORT6 + 3, TB10X_PORT6 + 4, 286 + TB10X_PORT6 + 5}; 287 + static const unsigned mos2_pins[] = { TB10X_PORT6 + 6, TB10X_PORT6 + 7, 288 + TB10X_PORT6 + 8}; 289 + static const unsigned mos3_pins[] = { TB10X_PORT6 + 9}; 290 + 291 + /* Port 7 */ 292 + static const unsigned uart0_pins[] = { TB10X_PORT7 + 0, TB10X_PORT7 + 1, 293 + TB10X_PORT7 + 2, TB10X_PORT7 + 3}; 294 + static const unsigned uart1_pins[] = { TB10X_PORT7 + 4, TB10X_PORT7 + 5, 295 + TB10X_PORT7 + 6, TB10X_PORT7 + 7}; 296 + static const unsigned gpiol_pins[] = { TB10X_PORT7 + 0, TB10X_PORT7 + 1, 297 + TB10X_PORT7 + 2, TB10X_PORT7 + 3}; 298 + static const unsigned gpiom_pins[] = { TB10X_PORT7 + 4, TB10X_PORT7 + 5, 299 + TB10X_PORT7 + 6, TB10X_PORT7 + 7}; 300 + 301 + /* Port 8 */ 302 + static const unsigned spi3_pins[] = { TB10X_PORT8 + 0, TB10X_PORT8 + 1, 303 + TB10X_PORT8 + 2, TB10X_PORT8 + 3}; 304 + static const unsigned jtag_pins[] = { TB10X_PORT8 + 0, TB10X_PORT8 + 1, 305 + TB10X_PORT8 + 2, TB10X_PORT8 + 3}; 306 + 307 + /* Port 9 */ 308 + static const unsigned spi1_pins[] = { TB10X_PORT9 + 0, TB10X_PORT9 + 1, 309 + TB10X_PORT9 + 2, TB10X_PORT9 + 3, 310 + TB10X_PORT9 + 4}; 311 + static const unsigned gpion_pins[] = { TB10X_PORT9 + 0, TB10X_PORT9 + 1, 312 + TB10X_PORT9 + 2, TB10X_PORT9 + 3, 313 + TB10X_PORT9 + 4}; 314 + 315 + /* Port 5 */ 316 + static const unsigned gpioj_pins[] = { TB10X_PORT5 + 0, TB10X_PORT5 + 1, 317 + TB10X_PORT5 + 2, TB10X_PORT5 + 3, 318 + TB10X_PORT5 + 4, TB10X_PORT5 + 5, 319 + TB10X_PORT5 + 6, TB10X_PORT5 + 7, 320 + TB10X_PORT5 + 8, TB10X_PORT5 + 9, 321 + TB10X_PORT5 + 10, TB10X_PORT5 + 11, 322 + TB10X_PORT5 + 12, TB10X_PORT5 + 13, 323 + TB10X_PORT5 + 14, TB10X_PORT5 + 15, 324 + TB10X_PORT5 + 16, TB10X_PORT5 + 17, 325 + TB10X_PORT5 + 18, TB10X_PORT5 + 19, 326 + TB10X_PORT5 + 20, TB10X_PORT5 + 21, 327 + TB10X_PORT5 + 22, TB10X_PORT5 + 23, 328 + TB10X_PORT5 + 24, TB10X_PORT5 + 25, 329 + TB10X_PORT5 + 26, TB10X_PORT5 + 27, 330 + TB10X_PORT5 + 28, TB10X_PORT5 + 29, 331 + TB10X_PORT5 + 30, TB10X_PORT5 + 31}; 332 + static const unsigned gpiok_pins[] = { TB10X_PORT5 + 32, TB10X_PORT5 + 33, 333 + TB10X_PORT5 + 34, TB10X_PORT5 + 35, 334 + TB10X_PORT5 + 36, TB10X_PORT5 + 37, 335 + TB10X_PORT5 + 38, TB10X_PORT5 + 39, 336 + TB10X_PORT5 + 40, TB10X_PORT5 + 41, 337 + TB10X_PORT5 + 42, TB10X_PORT5 + 43, 338 + TB10X_PORT5 + 44, TB10X_PORT5 + 45, 339 + TB10X_PORT5 + 46, TB10X_PORT5 + 47, 340 + TB10X_PORT5 + 48, TB10X_PORT5 + 49, 341 + TB10X_PORT5 + 50, TB10X_PORT5 + 51, 342 + TB10X_PORT5 + 52, TB10X_PORT5 + 53}; 343 + static const unsigned ciplus_pins[] = { TB10X_PORT5 + 0, TB10X_PORT5 + 1, 344 + TB10X_PORT5 + 2, TB10X_PORT5 + 3, 345 + TB10X_PORT5 + 4, TB10X_PORT5 + 5, 346 + TB10X_PORT5 + 6, TB10X_PORT5 + 7, 347 + TB10X_PORT5 + 8, TB10X_PORT5 + 9, 348 + TB10X_PORT5 + 10, TB10X_PORT5 + 11, 349 + TB10X_PORT5 + 12, TB10X_PORT5 + 13, 350 + TB10X_PORT5 + 14, TB10X_PORT5 + 15, 351 + TB10X_PORT5 + 16, TB10X_PORT5 + 17, 352 + TB10X_PORT5 + 18, TB10X_PORT5 + 19, 353 + TB10X_PORT5 + 20, TB10X_PORT5 + 21, 354 + TB10X_PORT5 + 22, TB10X_PORT5 + 23, 355 + TB10X_PORT5 + 24, TB10X_PORT5 + 25, 356 + TB10X_PORT5 + 26, TB10X_PORT5 + 27, 357 + TB10X_PORT5 + 28, TB10X_PORT5 + 29, 358 + TB10X_PORT5 + 30, TB10X_PORT5 + 31, 359 + TB10X_PORT5 + 32, TB10X_PORT5 + 33, 360 + TB10X_PORT5 + 34, TB10X_PORT5 + 35, 361 + TB10X_PORT5 + 36, TB10X_PORT5 + 37, 362 + TB10X_PORT5 + 38, TB10X_PORT5 + 39, 363 + TB10X_PORT5 + 40, TB10X_PORT5 + 41, 364 + TB10X_PORT5 + 42, TB10X_PORT5 + 43, 365 + TB10X_PORT5 + 44, TB10X_PORT5 + 45, 366 + TB10X_PORT5 + 46, TB10X_PORT5 + 47, 367 + TB10X_PORT5 + 48, TB10X_PORT5 + 49, 368 + TB10X_PORT5 + 50, TB10X_PORT5 + 51, 369 + TB10X_PORT5 + 52, TB10X_PORT5 + 53}; 370 + static const unsigned mcard_pins[] = { TB10X_PORT5 + 3, TB10X_PORT5 + 10, 371 + TB10X_PORT5 + 11, TB10X_PORT5 + 12, 372 + TB10X_PORT5 + 22, TB10X_PORT5 + 23, 373 + TB10X_PORT5 + 33, TB10X_PORT5 + 35, 374 + TB10X_PORT5 + 36, TB10X_PORT5 + 37, 375 + TB10X_PORT5 + 38, TB10X_PORT5 + 39, 376 + TB10X_PORT5 + 40, TB10X_PORT5 + 41, 377 + TB10X_PORT5 + 42, TB10X_PORT5 + 43, 378 + TB10X_PORT5 + 45, TB10X_PORT5 + 46, 379 + TB10X_PORT5 + 47, TB10X_PORT5 + 48, 380 + TB10X_PORT5 + 49, TB10X_PORT5 + 50, 381 + TB10X_PORT5 + 51, TB10X_PORT5 + 52, 382 + TB10X_PORT5 + 53}; 383 + static const unsigned stc0_pins[] = { TB10X_PORT5 + 34, TB10X_PORT5 + 35, 384 + TB10X_PORT5 + 36, TB10X_PORT5 + 37, 385 + TB10X_PORT5 + 38, TB10X_PORT5 + 39, 386 + TB10X_PORT5 + 40}; 387 + static const unsigned stc1_pins[] = { TB10X_PORT5 + 25, TB10X_PORT5 + 26, 388 + TB10X_PORT5 + 27, TB10X_PORT5 + 28, 389 + TB10X_PORT5 + 29, TB10X_PORT5 + 30, 390 + TB10X_PORT5 + 44}; 391 + 392 + /* Unmuxed GPIOs */ 393 + static const unsigned gpiob_pins[] = { TB10X_GPIOS + 0, TB10X_GPIOS + 1}; 394 + static const unsigned gpiod_pins[] = { TB10X_GPIOS + 2, TB10X_GPIOS + 3}; 395 + static const unsigned gpiof_pins[] = { TB10X_GPIOS + 4, TB10X_GPIOS + 5}; 396 + static const unsigned gpioh_pins[] = { TB10X_GPIOS + 6, TB10X_GPIOS + 7}; 397 + static const unsigned gpioi_pins[] = { TB10X_GPIOS + 8, TB10X_GPIOS + 9, 398 + TB10X_GPIOS + 10, TB10X_GPIOS + 11, 399 + TB10X_GPIOS + 12, TB10X_GPIOS + 13, 400 + TB10X_GPIOS + 14, TB10X_GPIOS + 15, 401 + TB10X_GPIOS + 16, TB10X_GPIOS + 17, 402 + TB10X_GPIOS + 18, TB10X_GPIOS + 19}; 403 + 404 + struct tb10x_pinfuncgrp { 405 + const char *name; 406 + const unsigned int *pins; 407 + const unsigned int pincnt; 408 + const int port; 409 + const unsigned int mode; 410 + const int isgpio; 411 + }; 412 + #define DEFPINFUNCGRP(NAME, PORT, MODE, ISGPIO) { \ 413 + .name = __stringify(NAME), \ 414 + .pins = NAME##_pins, .pincnt = ARRAY_SIZE(NAME##_pins), \ 415 + .port = (PORT), .mode = (MODE), \ 416 + .isgpio = (ISGPIO), \ 417 + } 418 + static const struct tb10x_pinfuncgrp tb10x_pingroups[] = { 419 + DEFPINFUNCGRP(mis0, 0, 0, 0), 420 + DEFPINFUNCGRP(gpioa, 0, 0, 1), 421 + DEFPINFUNCGRP(mis1, 0, 0, 0), 422 + DEFPINFUNCGRP(mip1, 0, 1, 0), 423 + DEFPINFUNCGRP(mis2, 1, 0, 0), 424 + DEFPINFUNCGRP(gpioc, 1, 0, 1), 425 + DEFPINFUNCGRP(mis3, 1, 0, 0), 426 + DEFPINFUNCGRP(mip3, 1, 1, 0), 427 + DEFPINFUNCGRP(mis4, 2, 0, 0), 428 + DEFPINFUNCGRP(gpioe, 2, 0, 1), 429 + DEFPINFUNCGRP(mis5, 2, 0, 0), 430 + DEFPINFUNCGRP(mip5, 2, 1, 0), 431 + DEFPINFUNCGRP(mis6, 3, 0, 0), 432 + DEFPINFUNCGRP(gpiog, 3, 0, 1), 433 + DEFPINFUNCGRP(mis7, 3, 0, 0), 434 + DEFPINFUNCGRP(mip7, 3, 1, 0), 435 + DEFPINFUNCGRP(gpioj, 4, 0, 1), 436 + DEFPINFUNCGRP(gpiok, 4, 0, 1), 437 + DEFPINFUNCGRP(ciplus, 4, 1, 0), 438 + DEFPINFUNCGRP(mcard, 4, 2, 0), 439 + DEFPINFUNCGRP(stc0, 4, 3, 0), 440 + DEFPINFUNCGRP(stc1, 4, 3, 0), 441 + DEFPINFUNCGRP(mop, 5, 0, 0), 442 + DEFPINFUNCGRP(mos0, 5, 1, 0), 443 + DEFPINFUNCGRP(mos1, 5, 1, 0), 444 + DEFPINFUNCGRP(mos2, 5, 1, 0), 445 + DEFPINFUNCGRP(mos3, 5, 1, 0), 446 + DEFPINFUNCGRP(uart0, 6, 0, 0), 447 + DEFPINFUNCGRP(uart1, 6, 0, 0), 448 + DEFPINFUNCGRP(gpiol, 6, 1, 1), 449 + DEFPINFUNCGRP(gpiom, 6, 1, 1), 450 + DEFPINFUNCGRP(spi3, 7, 0, 0), 451 + DEFPINFUNCGRP(jtag, 7, 1, 0), 452 + DEFPINFUNCGRP(spi1, 8, 0, 0), 453 + DEFPINFUNCGRP(gpion, 8, 1, 1), 454 + DEFPINFUNCGRP(gpiob, -1, 0, 1), 455 + DEFPINFUNCGRP(gpiod, -1, 0, 1), 456 + DEFPINFUNCGRP(gpiof, -1, 0, 1), 457 + DEFPINFUNCGRP(gpioh, -1, 0, 1), 458 + DEFPINFUNCGRP(gpioi, -1, 0, 1), 459 + }; 460 + #undef DEFPINFUNCGRP 461 + 462 + struct tb10x_of_pinfunc { 463 + const char *name; 464 + const char *group; 465 + }; 466 + 467 + #define TB10X_PORTS (9) 468 + 469 + /** 470 + * struct tb10x_port - state of an I/O port 471 + * @mode: Node this port is currently in. 472 + * @count: Number of enabled functions which require this port to be 473 + * configured in @mode. 474 + */ 475 + struct tb10x_port { 476 + unsigned int mode; 477 + unsigned int count; 478 + }; 479 + 480 + /** 481 + * struct tb10x_pinctrl - TB10x pin controller internal state 482 + * @pctl: pointer to the pinctrl_dev structure of this pin controller. 483 + * @base: register set base address. 484 + * @pingroups: pointer to an array of the pin groups this driver manages. 485 + * @pinfuncgrpcnt: number of pingroups in @pingroups. 486 + * @pinfuncs: pointer to an array of pin functions this driver manages. 487 + * @pinfuncnt: number of pin functions in @pinfuncs. 488 + * @mutex: mutex for exclusive access to a pin controller's state. 489 + * @ports: current state of each port. 490 + * @gpios: Indicates if a given pin is currently used as GPIO (1) or not (0). 491 + */ 492 + struct tb10x_pinctrl { 493 + struct pinctrl_dev *pctl; 494 + void *base; 495 + const struct tb10x_pinfuncgrp *pingroups; 496 + unsigned int pinfuncgrpcnt; 497 + struct tb10x_of_pinfunc *pinfuncs; 498 + unsigned int pinfuncnt; 499 + struct mutex mutex; 500 + struct tb10x_port ports[TB10X_PORTS]; 501 + DECLARE_BITMAP(gpios, MAX_PIN + 1); 502 + }; 503 + 504 + static inline void tb10x_pinctrl_set_config(struct tb10x_pinctrl *state, 505 + unsigned int port, unsigned int mode) 506 + { 507 + u32 pcfg; 508 + 509 + if (state->ports[port].count) 510 + return; 511 + 512 + state->ports[port].mode = mode; 513 + 514 + pcfg = ioread32(state->base) & ~(PCFG_PORT_MASK(port)); 515 + pcfg |= (mode << (PCFG_PORT_BITWIDTH * port)) & PCFG_PORT_MASK(port); 516 + iowrite32(pcfg, state->base); 517 + } 518 + 519 + static inline unsigned int tb10x_pinctrl_get_config( 520 + struct tb10x_pinctrl *state, 521 + unsigned int port) 522 + { 523 + return (ioread32(state->base) & PCFG_PORT_MASK(port)) 524 + >> (PCFG_PORT_BITWIDTH * port); 525 + } 526 + 527 + static int tb10x_get_groups_count(struct pinctrl_dev *pctl) 528 + { 529 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 530 + return state->pinfuncgrpcnt; 531 + } 532 + 533 + static const char *tb10x_get_group_name(struct pinctrl_dev *pctl, unsigned n) 534 + { 535 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 536 + return state->pingroups[n].name; 537 + } 538 + 539 + static int tb10x_get_group_pins(struct pinctrl_dev *pctl, unsigned n, 540 + unsigned const **pins, 541 + unsigned * const num_pins) 542 + { 543 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 544 + 545 + *pins = state->pingroups[n].pins; 546 + *num_pins = state->pingroups[n].pincnt; 547 + 548 + return 0; 549 + } 550 + 551 + static int tb10x_dt_node_to_map(struct pinctrl_dev *pctl, 552 + struct device_node *np_config, 553 + struct pinctrl_map **map, unsigned *num_maps) 554 + { 555 + const char *string; 556 + unsigned reserved_maps = 0; 557 + int ret = 0; 558 + 559 + if (of_property_read_string(np_config, "abilis,function", &string)) { 560 + pr_err("%s: No abilis,function property in device tree.\n", 561 + np_config->full_name); 562 + return -EINVAL; 563 + } 564 + 565 + *map = NULL; 566 + *num_maps = 0; 567 + 568 + ret = pinctrl_utils_reserve_map(pctl, map, &reserved_maps, 569 + num_maps, 1); 570 + if (ret) 571 + goto out; 572 + 573 + ret = pinctrl_utils_add_map_mux(pctl, map, &reserved_maps, 574 + num_maps, string, np_config->name); 575 + 576 + out: 577 + return ret; 578 + } 579 + 580 + static struct pinctrl_ops tb10x_pinctrl_ops = { 581 + .get_groups_count = tb10x_get_groups_count, 582 + .get_group_name = tb10x_get_group_name, 583 + .get_group_pins = tb10x_get_group_pins, 584 + .dt_node_to_map = tb10x_dt_node_to_map, 585 + .dt_free_map = pinctrl_utils_dt_free_map, 586 + }; 587 + 588 + static int tb10x_get_functions_count(struct pinctrl_dev *pctl) 589 + { 590 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 591 + return state->pinfuncnt; 592 + } 593 + 594 + static const char *tb10x_get_function_name(struct pinctrl_dev *pctl, 595 + unsigned n) 596 + { 597 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 598 + return state->pinfuncs[n].name; 599 + } 600 + 601 + static int tb10x_get_function_groups(struct pinctrl_dev *pctl, 602 + unsigned n, const char * const **groups, 603 + unsigned * const num_groups) 604 + { 605 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 606 + 607 + *groups = &state->pinfuncs[n].group; 608 + *num_groups = 1; 609 + 610 + return 0; 611 + } 612 + 613 + static int tb10x_gpio_request_enable(struct pinctrl_dev *pctl, 614 + struct pinctrl_gpio_range *range, 615 + unsigned pin) 616 + { 617 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 618 + int muxport = -1; 619 + int muxmode = -1; 620 + int i; 621 + 622 + mutex_lock(&state->mutex); 623 + 624 + /* 625 + * Figure out to which port the requested GPIO belongs and how to 626 + * configure that port. 627 + * This loop also checks for pin conflicts between GPIOs and other 628 + * functions. 629 + */ 630 + for (i = 0; i < state->pinfuncgrpcnt; i++) { 631 + const struct tb10x_pinfuncgrp *pfg = &state->pingroups[i]; 632 + unsigned int port = pfg->port; 633 + unsigned int mode = pfg->mode; 634 + int j; 635 + 636 + /* 637 + * Skip pin groups which are always mapped and don't need 638 + * to be configured. 639 + */ 640 + if (port < 0) 641 + continue; 642 + 643 + for (j = 0; j < pfg->pincnt; j++) { 644 + if (pin == pfg->pins[j]) { 645 + if (pfg->isgpio) { 646 + /* 647 + * Remember the GPIO-only setting of 648 + * the port this pin belongs to. 649 + */ 650 + muxport = port; 651 + muxmode = mode; 652 + } else if (state->ports[port].count 653 + && (state->ports[port].mode == mode)) { 654 + /* 655 + * Error: The requested pin is already 656 + * used for something else. 657 + */ 658 + mutex_unlock(&state->mutex); 659 + return -EBUSY; 660 + } 661 + break; 662 + } 663 + } 664 + } 665 + 666 + /* 667 + * If we haven't returned an error at this point, the GPIO pin is not 668 + * used by another function and the GPIO request can be granted: 669 + * Register pin as being used as GPIO so we don't allocate it to 670 + * another function later. 671 + */ 672 + set_bit(pin, state->gpios); 673 + 674 + /* 675 + * Potential conflicts between GPIOs and pin functions were caught 676 + * earlier in this function and tb10x_pinctrl_set_config will do the 677 + * Right Thing, either configure the port in GPIO only mode or leave 678 + * another mode compatible with this GPIO request untouched. 679 + */ 680 + if (muxport >= 0) 681 + tb10x_pinctrl_set_config(state, muxport, muxmode); 682 + 683 + mutex_unlock(&state->mutex); 684 + 685 + return 0; 686 + } 687 + 688 + static void tb10x_gpio_disable_free(struct pinctrl_dev *pctl, 689 + struct pinctrl_gpio_range *range, 690 + unsigned pin) 691 + { 692 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 693 + 694 + mutex_lock(&state->mutex); 695 + 696 + clear_bit(pin, state->gpios); 697 + 698 + mutex_unlock(&state->mutex); 699 + } 700 + 701 + static int tb10x_pctl_enable(struct pinctrl_dev *pctl, 702 + unsigned func_selector, unsigned group_selector) 703 + { 704 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 705 + const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector]; 706 + int i; 707 + 708 + if (grp->port < 0) 709 + return 0; 710 + 711 + mutex_lock(&state->mutex); 712 + 713 + /* 714 + * Check if the requested function is compatible with previously 715 + * requested functions. 716 + */ 717 + if (state->ports[grp->port].count 718 + && (state->ports[grp->port].mode != grp->mode)) { 719 + mutex_unlock(&state->mutex); 720 + return -EBUSY; 721 + } 722 + 723 + /* 724 + * Check if the requested function is compatible with previously 725 + * requested GPIOs. 726 + */ 727 + for (i = 0; i < grp->pincnt; i++) 728 + if (test_bit(grp->pins[i], state->gpios)) { 729 + mutex_unlock(&state->mutex); 730 + return -EBUSY; 731 + } 732 + 733 + tb10x_pinctrl_set_config(state, grp->port, grp->mode); 734 + 735 + state->ports[grp->port].count++; 736 + 737 + mutex_unlock(&state->mutex); 738 + 739 + return 0; 740 + } 741 + 742 + static void tb10x_pctl_disable(struct pinctrl_dev *pctl, 743 + unsigned func_selector, unsigned group_selector) 744 + { 745 + struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl); 746 + const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector]; 747 + 748 + if (grp->port < 0) 749 + return; 750 + 751 + mutex_lock(&state->mutex); 752 + 753 + state->ports[grp->port].count--; 754 + 755 + mutex_unlock(&state->mutex); 756 + } 757 + 758 + static struct pinmux_ops tb10x_pinmux_ops = { 759 + .get_functions_count = tb10x_get_functions_count, 760 + .get_function_name = tb10x_get_function_name, 761 + .get_function_groups = tb10x_get_function_groups, 762 + .gpio_request_enable = tb10x_gpio_request_enable, 763 + .gpio_disable_free = tb10x_gpio_disable_free, 764 + .enable = tb10x_pctl_enable, 765 + .disable = tb10x_pctl_disable, 766 + }; 767 + 768 + static struct pinctrl_desc tb10x_pindesc = { 769 + .name = "TB10x", 770 + .pins = tb10x_pins, 771 + .npins = ARRAY_SIZE(tb10x_pins), 772 + .owner = THIS_MODULE, 773 + .pctlops = &tb10x_pinctrl_ops, 774 + .pmxops = &tb10x_pinmux_ops, 775 + }; 776 + 777 + static int tb10x_pinctrl_probe(struct platform_device *pdev) 778 + { 779 + int ret = -EINVAL; 780 + struct resource *mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 781 + struct device *dev = &pdev->dev; 782 + struct device_node *of_node = dev->of_node; 783 + struct device_node *child; 784 + struct tb10x_pinctrl *state; 785 + int i; 786 + 787 + if (!of_node) { 788 + dev_err(dev, "No device tree node found.\n"); 789 + return -EINVAL; 790 + } 791 + 792 + if (!mem) { 793 + dev_err(dev, "No memory resource defined.\n"); 794 + return -EINVAL; 795 + } 796 + 797 + state = devm_kzalloc(dev, sizeof(struct tb10x_pinctrl) + 798 + of_get_child_count(of_node) 799 + * sizeof(struct tb10x_of_pinfunc), 800 + GFP_KERNEL); 801 + if (!state) 802 + return -ENOMEM; 803 + 804 + platform_set_drvdata(pdev, state); 805 + state->pinfuncs = (struct tb10x_of_pinfunc *)(state + 1); 806 + mutex_init(&state->mutex); 807 + 808 + state->base = devm_ioremap_resource(dev, mem); 809 + if (IS_ERR(state->base)) { 810 + ret = PTR_ERR(state->base); 811 + goto fail; 812 + } 813 + 814 + state->pingroups = tb10x_pingroups; 815 + state->pinfuncgrpcnt = ARRAY_SIZE(tb10x_pingroups); 816 + 817 + for (i = 0; i < TB10X_PORTS; i++) 818 + state->ports[i].mode = tb10x_pinctrl_get_config(state, i); 819 + 820 + for_each_child_of_node(of_node, child) { 821 + const char *name; 822 + 823 + if (!of_property_read_string(child, "abilis,function", 824 + &name)) { 825 + state->pinfuncs[state->pinfuncnt].name = child->name; 826 + state->pinfuncs[state->pinfuncnt].group = name; 827 + state->pinfuncnt++; 828 + } 829 + } 830 + 831 + state->pctl = pinctrl_register(&tb10x_pindesc, dev, state); 832 + if (!state->pctl) { 833 + dev_err(dev, "could not register TB10x pin driver\n"); 834 + ret = -EINVAL; 835 + goto fail; 836 + } 837 + 838 + return 0; 839 + 840 + fail: 841 + mutex_destroy(&state->mutex); 842 + return ret; 843 + } 844 + 845 + static int tb10x_pinctrl_remove(struct platform_device *pdev) 846 + { 847 + struct tb10x_pinctrl *state = platform_get_drvdata(pdev); 848 + 849 + pinctrl_unregister(state->pctl); 850 + mutex_destroy(&state->mutex); 851 + 852 + return 0; 853 + } 854 + 855 + 856 + static const struct of_device_id tb10x_pinctrl_dt_ids[] = { 857 + { .compatible = "abilis,tb10x-iomux" }, 858 + { } 859 + }; 860 + MODULE_DEVICE_TABLE(of, tb10x_pinctrl_dt_ids); 861 + 862 + static struct platform_driver tb10x_pinctrl_pdrv = { 863 + .probe = tb10x_pinctrl_probe, 864 + .remove = tb10x_pinctrl_remove, 865 + .driver = { 866 + .name = "tb10x_pinctrl", 867 + .of_match_table = of_match_ptr(tb10x_pinctrl_dt_ids), 868 + .owner = THIS_MODULE 869 + } 870 + }; 871 + 872 + module_platform_driver(tb10x_pinctrl_pdrv); 873 + 874 + MODULE_AUTHOR("Christian Ruppert <christian.ruppert@abilis.com>"); 875 + MODULE_LICENSE("GPL");
+1 -1
drivers/pinctrl/pinctrl-vf610.c
··· 316 316 .driver = { 317 317 .name = "vf610-pinctrl", 318 318 .owner = THIS_MODULE, 319 - .of_match_table = of_match_ptr(vf610_pinctrl_of_match), 319 + .of_match_table = vf610_pinctrl_of_match, 320 320 }, 321 321 .probe = vf610_pinctrl_probe, 322 322 .remove = imx_pinctrl_remove,
+1 -3
drivers/pinctrl/pinmux.c
··· 505 505 pin_free(pctldev, pins[i], NULL); 506 506 } else { 507 507 const char *gname; 508 - const char *pname; 509 508 510 - pname = desc ? desc->name : "non-existing"; 511 509 gname = pctlops->get_group_name(pctldev, 512 510 setting->data.mux.group); 513 511 dev_warn(pctldev->dev, 514 512 "not freeing pin %d (%s) as part of " 515 513 "deactivating group %s - it is already " 516 514 "used for some other setting", 517 - pins[i], pname, gname); 515 + pins[i], desc->name, gname); 518 516 } 519 517 } 520 518
+5
drivers/pinctrl/sh-pfc/Kconfig
··· 45 45 depends on ARCH_R8A7790 46 46 select PINCTRL_SH_PFC 47 47 48 + config PINCTRL_PFC_R8A7791 49 + def_bool y 50 + depends on ARCH_R8A7791 51 + select PINCTRL_SH_PFC 52 + 48 53 config PINCTRL_PFC_SH7203 49 54 def_bool y 50 55 depends on CPU_SUBTYPE_SH7203
+1
drivers/pinctrl/sh-pfc/Makefile
··· 8 8 obj-$(CONFIG_PINCTRL_PFC_R8A7778) += pfc-r8a7778.o 9 9 obj-$(CONFIG_PINCTRL_PFC_R8A7779) += pfc-r8a7779.o 10 10 obj-$(CONFIG_PINCTRL_PFC_R8A7790) += pfc-r8a7790.o 11 + obj-$(CONFIG_PINCTRL_PFC_R8A7791) += pfc-r8a7791.o 11 12 obj-$(CONFIG_PINCTRL_PFC_SH7203) += pfc-sh7203.o 12 13 obj-$(CONFIG_PINCTRL_PFC_SH7264) += pfc-sh7264.o 13 14 obj-$(CONFIG_PINCTRL_PFC_SH7269) += pfc-sh7269.o
+9
drivers/pinctrl/sh-pfc/core.c
··· 431 431 .data = &r8a7790_pinmux_info, 432 432 }, 433 433 #endif 434 + #ifdef CONFIG_PINCTRL_PFC_R8A7791 435 + { 436 + .compatible = "renesas,pfc-r8a7791", 437 + .data = &r8a7791_pinmux_info, 438 + }, 439 + #endif 434 440 #ifdef CONFIG_PINCTRL_PFC_SH7372 435 441 { 436 442 .compatible = "renesas,pfc-sh7372", ··· 563 557 #endif 564 558 #ifdef CONFIG_PINCTRL_PFC_R8A7790 565 559 { "pfc-r8a7790", (kernel_ulong_t)&r8a7790_pinmux_info }, 560 + #endif 561 + #ifdef CONFIG_PINCTRL_PFC_R8A7791 562 + { "pfc-r8a7791", (kernel_ulong_t)&r8a7791_pinmux_info }, 566 563 #endif 567 564 #ifdef CONFIG_PINCTRL_PFC_SH7203 568 565 { "pfc-sh7203", (kernel_ulong_t)&sh7203_pinmux_info },
+1
drivers/pinctrl/sh-pfc/core.h
··· 69 69 extern const struct sh_pfc_soc_info r8a7778_pinmux_info; 70 70 extern const struct sh_pfc_soc_info r8a7779_pinmux_info; 71 71 extern const struct sh_pfc_soc_info r8a7790_pinmux_info; 72 + extern const struct sh_pfc_soc_info r8a7791_pinmux_info; 72 73 extern const struct sh_pfc_soc_info sh7203_pinmux_info; 73 74 extern const struct sh_pfc_soc_info sh7264_pinmux_info; 74 75 extern const struct sh_pfc_soc_info sh7269_pinmux_info;
+180
drivers/pinctrl/sh-pfc/pfc-r8a7778.c
··· 1288 1288 arg5##_MARK, arg6##_MARK, \ 1289 1289 arg7##_MARK, arg8##_MARK, } 1290 1290 1291 + /* - AUDIO macro -------------------------------------------------------------*/ 1292 + #define AUDIO_PFC_PIN(name, pin) SH_PFC_PINS(name, pin) 1293 + #define AUDIO_PFC_DAT(name, pin) SH_PFC_MUX1(name, pin) 1294 + 1295 + /* - AUDIO clock -------------------------------------------------------------*/ 1296 + AUDIO_PFC_PIN(audio_clk_a, RCAR_GP_PIN(2, 22)); 1297 + AUDIO_PFC_DAT(audio_clk_a, AUDIO_CLKA); 1298 + AUDIO_PFC_PIN(audio_clk_b, RCAR_GP_PIN(2, 23)); 1299 + AUDIO_PFC_DAT(audio_clk_b, AUDIO_CLKB); 1300 + AUDIO_PFC_PIN(audio_clk_c, RCAR_GP_PIN(2, 7)); 1301 + AUDIO_PFC_DAT(audio_clk_c, AUDIO_CLKC); 1302 + AUDIO_PFC_PIN(audio_clkout_a, RCAR_GP_PIN(2, 16)); 1303 + AUDIO_PFC_DAT(audio_clkout_a, AUDIO_CLKOUT_A); 1304 + AUDIO_PFC_PIN(audio_clkout_b, RCAR_GP_PIN(1, 16)); 1305 + AUDIO_PFC_DAT(audio_clkout_b, AUDIO_CLKOUT_B); 1306 + 1307 + /* - CAN macro --------_----------------------------------------------------- */ 1308 + #define CAN_PFC_PINS(name, args...) SH_PFC_PINS(name, args) 1309 + #define CAN_PFC_DATA(name, tx, rx) SH_PFC_MUX2(name, tx, rx) 1310 + #define CAN_PFC_CLK(name, clk) SH_PFC_MUX1(name, clk) 1311 + 1312 + /* - CAN0 ------------------------------------------------------------------- */ 1313 + CAN_PFC_PINS(can0_data_a, RCAR_GP_PIN(1, 30), RCAR_GP_PIN(1, 31)); 1314 + CAN_PFC_DATA(can0_data_a, CAN0_TX_A, CAN0_RX_A); 1315 + CAN_PFC_PINS(can0_data_b, RCAR_GP_PIN(2, 26), RCAR_GP_PIN(2, 27)); 1316 + CAN_PFC_DATA(can0_data_b, CAN0_TX_B, CAN0_RX_B); 1317 + 1318 + /* - CAN1 ------------------------------------------------------------------- */ 1319 + CAN_PFC_PINS(can1_data_a, RCAR_GP_PIN(4, 20), RCAR_GP_PIN(4, 19)); 1320 + CAN_PFC_DATA(can1_data_a, CAN1_TX_A, CAN1_RX_A); 1321 + CAN_PFC_PINS(can1_data_b, RCAR_GP_PIN(2, 28), RCAR_GP_PIN(2, 29)); 1322 + CAN_PFC_DATA(can1_data_b, CAN1_TX_B, CAN1_RX_B); 1323 + 1324 + /* - CAN_CLK --------------------------------------------------------------- */ 1325 + CAN_PFC_PINS(can_clk_a, RCAR_GP_PIN(3, 24)); 1326 + CAN_PFC_CLK(can_clk_a, CAN_CLK_A); 1327 + CAN_PFC_PINS(can_clk_b, RCAR_GP_PIN(1, 16)); 1328 + CAN_PFC_CLK(can_clk_b, CAN_CLK_B); 1329 + CAN_PFC_PINS(can_clk_c, RCAR_GP_PIN(4, 24)); 1330 + CAN_PFC_CLK(can_clk_c, CAN_CLK_C); 1331 + CAN_PFC_PINS(can_clk_d, RCAR_GP_PIN(2, 25)); 1332 + CAN_PFC_CLK(can_clk_d, CAN_CLK_D); 1333 + 1291 1334 /* - Ether ------------------------------------------------------------------ */ 1292 1335 SH_PFC_PINS(ether_rmii, RCAR_GP_PIN(4, 10), RCAR_GP_PIN(4, 11), 1293 1336 RCAR_GP_PIN(4, 13), RCAR_GP_PIN(4, 9), ··· 1620 1577 SDHI_PFC_PINS(sdhi2_wp_b, RCAR_GP_PIN(3, 28)); 1621 1578 SDHI_PFC_WPPN(sdhi2_wp_b, SD2_WP_B); 1622 1579 1580 + /* - SSI macro -------------------------------------------------------------- */ 1581 + #define SSI_PFC_PINS(name, args...) SH_PFC_PINS(name, args) 1582 + #define SSI_PFC_CTRL(name, sck, ws) SH_PFC_MUX2(name, sck, ws) 1583 + #define SSI_PFC_DATA(name, d) SH_PFC_MUX1(name, d) 1584 + 1585 + /* - SSI 0/1/2 -------------------------------------------------------------- */ 1586 + SSI_PFC_PINS(ssi012_ctrl, RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7)); 1587 + SSI_PFC_CTRL(ssi012_ctrl, SSI_SCK012, SSI_WS012); 1588 + SSI_PFC_PINS(ssi0_data, RCAR_GP_PIN(3, 10)); 1589 + SSI_PFC_DATA(ssi0_data, SSI_SDATA0); 1590 + SSI_PFC_PINS(ssi1_a_ctrl, RCAR_GP_PIN(2, 20), RCAR_GP_PIN(2, 21)); 1591 + SSI_PFC_CTRL(ssi1_a_ctrl, SSI_SCK1_A, SSI_WS1_A); 1592 + SSI_PFC_PINS(ssi1_b_ctrl, PIN_NUMBER(3, 20), RCAR_GP_PIN(1, 3)); 1593 + SSI_PFC_CTRL(ssi1_b_ctrl, SSI_SCK1_B, SSI_WS1_B); 1594 + SSI_PFC_PINS(ssi1_data, RCAR_GP_PIN(3, 9)); 1595 + SSI_PFC_DATA(ssi1_data, SSI_SDATA1); 1596 + SSI_PFC_PINS(ssi2_a_ctrl, RCAR_GP_PIN(2, 26), RCAR_GP_PIN(3, 4)); 1597 + SSI_PFC_CTRL(ssi2_a_ctrl, SSI_SCK2_A, SSI_WS2_A); 1598 + SSI_PFC_PINS(ssi2_b_ctrl, RCAR_GP_PIN(2, 6), RCAR_GP_PIN(2, 17)); 1599 + SSI_PFC_CTRL(ssi2_b_ctrl, SSI_SCK2_B, SSI_WS2_B); 1600 + SSI_PFC_PINS(ssi2_data, RCAR_GP_PIN(3, 8)); 1601 + SSI_PFC_DATA(ssi2_data, SSI_SDATA2); 1602 + 1603 + /* - SSI 3/4 ---------------------------------------------------------------- */ 1604 + SSI_PFC_PINS(ssi34_ctrl, RCAR_GP_PIN(3, 2), RCAR_GP_PIN(3, 3)); 1605 + SSI_PFC_CTRL(ssi34_ctrl, SSI_SCK34, SSI_WS34); 1606 + SSI_PFC_PINS(ssi3_data, RCAR_GP_PIN(3, 5)); 1607 + SSI_PFC_DATA(ssi3_data, SSI_SDATA3); 1608 + SSI_PFC_PINS(ssi4_ctrl, RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 23)); 1609 + SSI_PFC_CTRL(ssi4_ctrl, SSI_SCK4, SSI_WS4); 1610 + SSI_PFC_PINS(ssi4_data, RCAR_GP_PIN(3, 4)); 1611 + SSI_PFC_DATA(ssi4_data, SSI_SDATA4); 1612 + 1613 + /* - SSI 5 ------------------------------------------------------------------ */ 1614 + SSI_PFC_PINS(ssi5_ctrl, RCAR_GP_PIN(2, 31), RCAR_GP_PIN(3, 0)); 1615 + SSI_PFC_CTRL(ssi5_ctrl, SSI_SCK5, SSI_WS5); 1616 + SSI_PFC_PINS(ssi5_data, RCAR_GP_PIN(3, 1)); 1617 + SSI_PFC_DATA(ssi5_data, SSI_SDATA5); 1618 + 1619 + /* - SSI 6 ------------------------------------------------------------------ */ 1620 + SSI_PFC_PINS(ssi6_ctrl, RCAR_GP_PIN(2, 28), RCAR_GP_PIN(2, 29)); 1621 + SSI_PFC_CTRL(ssi6_ctrl, SSI_SCK6, SSI_WS6); 1622 + SSI_PFC_PINS(ssi6_data, RCAR_GP_PIN(2, 30)); 1623 + SSI_PFC_DATA(ssi6_data, SSI_SDATA6); 1624 + 1625 + /* - SSI 7/8 --------------------------------------------------------------- */ 1626 + SSI_PFC_PINS(ssi78_ctrl, RCAR_GP_PIN(2, 24), RCAR_GP_PIN(2, 25)); 1627 + SSI_PFC_CTRL(ssi78_ctrl, SSI_SCK78, SSI_WS78); 1628 + SSI_PFC_PINS(ssi7_data, RCAR_GP_PIN(2, 27)); 1629 + SSI_PFC_DATA(ssi7_data, SSI_SDATA7); 1630 + SSI_PFC_PINS(ssi8_data, RCAR_GP_PIN(2, 26)); 1631 + SSI_PFC_DATA(ssi8_data, SSI_SDATA8); 1632 + 1623 1633 /* - USB0 ------------------------------------------------------------------- */ 1624 1634 SH_PFC_PINS(usb0, RCAR_GP_PIN(0, 1)); 1625 1635 SH_PFC_MUX1(usb0, PENC0); ··· 1720 1624 VIN_PFC_SYNC(vin1_sync, VI1_HSYNC, VI1_VSYNC); 1721 1625 1722 1626 static const struct sh_pfc_pin_group pinmux_groups[] = { 1627 + SH_PFC_PIN_GROUP(audio_clk_a), 1628 + SH_PFC_PIN_GROUP(audio_clk_b), 1629 + SH_PFC_PIN_GROUP(audio_clk_c), 1630 + SH_PFC_PIN_GROUP(audio_clkout_a), 1631 + SH_PFC_PIN_GROUP(audio_clkout_b), 1632 + SH_PFC_PIN_GROUP(can0_data_a), 1633 + SH_PFC_PIN_GROUP(can0_data_b), 1634 + SH_PFC_PIN_GROUP(can1_data_a), 1635 + SH_PFC_PIN_GROUP(can1_data_b), 1636 + SH_PFC_PIN_GROUP(can_clk_a), 1637 + SH_PFC_PIN_GROUP(can_clk_b), 1638 + SH_PFC_PIN_GROUP(can_clk_c), 1639 + SH_PFC_PIN_GROUP(can_clk_d), 1723 1640 SH_PFC_PIN_GROUP(ether_rmii), 1724 1641 SH_PFC_PIN_GROUP(ether_link), 1725 1642 SH_PFC_PIN_GROUP(ether_magic), ··· 1822 1713 SH_PFC_PIN_GROUP(sdhi2_data4_b), 1823 1714 SH_PFC_PIN_GROUP(sdhi2_wp_a), 1824 1715 SH_PFC_PIN_GROUP(sdhi2_wp_b), 1716 + SH_PFC_PIN_GROUP(ssi012_ctrl), 1717 + SH_PFC_PIN_GROUP(ssi0_data), 1718 + SH_PFC_PIN_GROUP(ssi1_a_ctrl), 1719 + SH_PFC_PIN_GROUP(ssi1_b_ctrl), 1720 + SH_PFC_PIN_GROUP(ssi1_data), 1721 + SH_PFC_PIN_GROUP(ssi2_a_ctrl), 1722 + SH_PFC_PIN_GROUP(ssi2_b_ctrl), 1723 + SH_PFC_PIN_GROUP(ssi2_data), 1724 + SH_PFC_PIN_GROUP(ssi34_ctrl), 1725 + SH_PFC_PIN_GROUP(ssi3_data), 1726 + SH_PFC_PIN_GROUP(ssi4_ctrl), 1727 + SH_PFC_PIN_GROUP(ssi4_data), 1728 + SH_PFC_PIN_GROUP(ssi5_ctrl), 1729 + SH_PFC_PIN_GROUP(ssi5_data), 1730 + SH_PFC_PIN_GROUP(ssi6_ctrl), 1731 + SH_PFC_PIN_GROUP(ssi6_data), 1732 + SH_PFC_PIN_GROUP(ssi78_ctrl), 1733 + SH_PFC_PIN_GROUP(ssi7_data), 1734 + SH_PFC_PIN_GROUP(ssi8_data), 1825 1735 SH_PFC_PIN_GROUP(usb0), 1826 1736 SH_PFC_PIN_GROUP(usb0_ovc), 1827 1737 SH_PFC_PIN_GROUP(usb1), ··· 1851 1723 SH_PFC_PIN_GROUP(vin1_data8), 1852 1724 SH_PFC_PIN_GROUP(vin1_clk), 1853 1725 SH_PFC_PIN_GROUP(vin1_sync), 1726 + }; 1727 + 1728 + static const char * const audio_clk_groups[] = { 1729 + "audio_clk_a", 1730 + "audio_clk_b", 1731 + "audio_clk_c", 1732 + "audio_clkout_a", 1733 + "audio_clkout_b", 1734 + }; 1735 + 1736 + static const char * const can0_groups[] = { 1737 + "can0_data_a", 1738 + "can0_data_b", 1739 + "can_clk_a", 1740 + "can_clk_b", 1741 + "can_clk_c", 1742 + "can_clk_d", 1743 + }; 1744 + 1745 + static const char * const can1_groups[] = { 1746 + "can1_data_a", 1747 + "can1_data_b", 1748 + "can_clk_a", 1749 + "can_clk_b", 1750 + "can_clk_c", 1751 + "can_clk_d", 1854 1752 }; 1855 1753 1856 1754 static const char * const ether_groups[] = { ··· 2029 1875 "sdhi2_wp_b", 2030 1876 }; 2031 1877 1878 + static const char * const ssi_groups[] = { 1879 + "ssi012_ctrl", 1880 + "ssi0_data", 1881 + "ssi1_a_ctrl", 1882 + "ssi1_b_ctrl", 1883 + "ssi1_data", 1884 + "ssi2_a_ctrl", 1885 + "ssi2_b_ctrl", 1886 + "ssi2_data", 1887 + "ssi34_ctrl", 1888 + "ssi3_data", 1889 + "ssi4_ctrl", 1890 + "ssi4_data", 1891 + "ssi5_ctrl", 1892 + "ssi5_data", 1893 + "ssi6_ctrl", 1894 + "ssi6_data", 1895 + "ssi78_ctrl", 1896 + "ssi7_data", 1897 + "ssi8_data", 1898 + }; 1899 + 2032 1900 static const char * const usb0_groups[] = { 2033 1901 "usb0", 2034 1902 "usb0_ovc", ··· 2074 1898 }; 2075 1899 2076 1900 static const struct sh_pfc_function pinmux_functions[] = { 1901 + SH_PFC_FUNCTION(audio_clk), 1902 + SH_PFC_FUNCTION(can0), 1903 + SH_PFC_FUNCTION(can1), 2077 1904 SH_PFC_FUNCTION(ether), 2078 1905 SH_PFC_FUNCTION(hscif0), 2079 1906 SH_PFC_FUNCTION(hscif1), ··· 2097 1918 SH_PFC_FUNCTION(sdhi0), 2098 1919 SH_PFC_FUNCTION(sdhi1), 2099 1920 SH_PFC_FUNCTION(sdhi2), 1921 + SH_PFC_FUNCTION(ssi), 2100 1922 SH_PFC_FUNCTION(usb0), 2101 1923 SH_PFC_FUNCTION(usb1), 2102 1924 SH_PFC_FUNCTION(vin0),
+110
drivers/pinctrl/sh-pfc/pfc-r8a7790.c
··· 781 781 ADICS_SAMP_MARK, DU2_CDE_MARK, QPOLB_MARK, SCIFA2_RXD_B_MARK, 782 782 USB1_PWEN_MARK, AUDIO_CLKOUT_D_MARK, USB1_OVC_MARK, 783 783 TCLK1_B_MARK, 784 + 785 + I2C3_SCL_MARK, I2C3_SDA_MARK, 784 786 PINMUX_MARK_END, 785 787 }; 786 788 ··· 1721 1719 PINMUX_IPSR_DATA(IP16_6, AUDIO_CLKOUT_D), 1722 1720 PINMUX_IPSR_DATA(IP16_7, USB1_OVC), 1723 1721 PINMUX_IPSR_MODSEL_DATA(IP16_7, TCLK1_B, SEL_TMU1_1), 1722 + 1723 + PINMUX_DATA(I2C3_SCL_MARK, FN_SEL_IICDVFS_1), 1724 + PINMUX_DATA(I2C3_SDA_MARK, FN_SEL_IICDVFS_1), 1724 1725 }; 1726 + 1727 + /* R8A7790 has 6 banks with 32 GPIOs in each = 192 GPIOs */ 1728 + #define ROW_GROUP_A(r) ('Z' - 'A' + 1 + (r)) 1729 + #define PIN_NUMBER(r, c) (((r) - 'A') * 31 + (c) + 200) 1730 + #define PIN_A_NUMBER(r, c) PIN_NUMBER(ROW_GROUP_A(r), c) 1725 1731 1726 1732 static struct sh_pfc_pin pinmux_pins[] = { 1727 1733 PINMUX_GPIO_GP_ALL(), 1734 + 1735 + /* Pins not associated with a GPIO port */ 1736 + SH_PFC_PIN_NAMED(ROW_GROUP_A('J'), 15, AJ15), 1737 + SH_PFC_PIN_NAMED(ROW_GROUP_A('H'), 15, AH15), 1728 1738 }; 1729 1739 1730 1740 /* - DU RGB ----------------------------------------------------------------- */ ··· 2003 1989 }; 2004 1990 static const unsigned int hscif1_ctrl_b_mux[] = { 2005 1991 HRTS1_N_B_MARK, HCTS1_N_B_MARK, 1992 + }; 1993 + /* - I2C1 ------------------------------------------------------------------- */ 1994 + static const unsigned int i2c1_pins[] = { 1995 + /* SCL, SDA */ 1996 + RCAR_GP_PIN(1, 16), RCAR_GP_PIN(1, 17), 1997 + }; 1998 + static const unsigned int i2c1_mux[] = { 1999 + I2C1_SCL_MARK, I2C1_SDA_MARK, 2000 + }; 2001 + static const unsigned int i2c1_b_pins[] = { 2002 + /* SCL, SDA */ 2003 + RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 7), 2004 + }; 2005 + static const unsigned int i2c1_b_mux[] = { 2006 + I2C1_SCL_B_MARK, I2C1_SDA_B_MARK, 2007 + }; 2008 + static const unsigned int i2c1_c_pins[] = { 2009 + /* SCL, SDA */ 2010 + RCAR_GP_PIN(4, 30), RCAR_GP_PIN(4, 27), 2011 + }; 2012 + static const unsigned int i2c1_c_mux[] = { 2013 + I2C1_SCL_C_MARK, I2C1_SDA_C_MARK, 2014 + }; 2015 + /* - I2C2 ------------------------------------------------------------------- */ 2016 + static const unsigned int i2c2_pins[] = { 2017 + /* SCL, SDA */ 2018 + RCAR_GP_PIN(5, 5), RCAR_GP_PIN(5, 6), 2019 + }; 2020 + static const unsigned int i2c2_mux[] = { 2021 + I2C2_SCL_MARK, I2C2_SDA_MARK, 2022 + }; 2023 + static const unsigned int i2c2_b_pins[] = { 2024 + /* SCL, SDA */ 2025 + RCAR_GP_PIN(4, 0), RCAR_GP_PIN(4, 1), 2026 + }; 2027 + static const unsigned int i2c2_b_mux[] = { 2028 + I2C2_SCL_B_MARK, I2C2_SDA_B_MARK, 2029 + }; 2030 + static const unsigned int i2c2_c_pins[] = { 2031 + /* SCL, SDA */ 2032 + RCAR_GP_PIN(0, 6), RCAR_GP_PIN(0, 7), 2033 + }; 2034 + static const unsigned int i2c2_c_mux[] = { 2035 + I2C2_SCL_C_MARK, I2C2_SDA_C_MARK, 2036 + }; 2037 + static const unsigned int i2c2_d_pins[] = { 2038 + /* SCL, SDA */ 2039 + RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 15), 2040 + }; 2041 + static const unsigned int i2c2_d_mux[] = { 2042 + I2C2_SCL_D_MARK, I2C2_SDA_D_MARK, 2043 + }; 2044 + static const unsigned int i2c2_e_pins[] = { 2045 + /* SCL, SDA */ 2046 + RCAR_GP_PIN(2, 18), RCAR_GP_PIN(2, 19), 2047 + }; 2048 + static const unsigned int i2c2_e_mux[] = { 2049 + I2C2_SCL_E_MARK, I2C2_SDA_E_MARK, 2050 + }; 2051 + /* - I2C3 ------------------------------------------------------------------- */ 2052 + static const unsigned int i2c3_pins[] = { 2053 + /* SCL, SDA */ 2054 + PIN_A_NUMBER('J', 15), PIN_A_NUMBER('H', 15), 2055 + }; 2056 + static const unsigned int i2c3_mux[] = { 2057 + I2C3_SCL_MARK, I2C3_SDA_MARK, 2006 2058 }; 2007 2059 /* - INTC ------------------------------------------------------------------- */ 2008 2060 static const unsigned int intc_irq0_pins[] = { ··· 3127 3047 SH_PFC_PIN_GROUP(hscif1_data_b), 3128 3048 SH_PFC_PIN_GROUP(hscif1_clk_b), 3129 3049 SH_PFC_PIN_GROUP(hscif1_ctrl_b), 3050 + SH_PFC_PIN_GROUP(i2c1), 3051 + SH_PFC_PIN_GROUP(i2c1_b), 3052 + SH_PFC_PIN_GROUP(i2c1_c), 3053 + SH_PFC_PIN_GROUP(i2c2), 3054 + SH_PFC_PIN_GROUP(i2c2_b), 3055 + SH_PFC_PIN_GROUP(i2c2_c), 3056 + SH_PFC_PIN_GROUP(i2c2_d), 3057 + SH_PFC_PIN_GROUP(i2c2_e), 3058 + SH_PFC_PIN_GROUP(i2c3), 3130 3059 SH_PFC_PIN_GROUP(intc_irq0), 3131 3060 SH_PFC_PIN_GROUP(intc_irq1), 3132 3061 SH_PFC_PIN_GROUP(intc_irq2), ··· 3330 3241 "hscif1_data_b", 3331 3242 "hscif1_clk_b", 3332 3243 "hscif1_ctrl_b", 3244 + }; 3245 + 3246 + static const char * const i2c1_groups[] = { 3247 + "i2c1", 3248 + "i2c1_b", 3249 + "i2c1_c", 3250 + }; 3251 + 3252 + static const char * const i2c2_groups[] = { 3253 + "i2c2", 3254 + "i2c2_b", 3255 + "i2c2_c", 3256 + "i2c2_d", 3257 + "i2c2_e", 3258 + }; 3259 + 3260 + static const char * const i2c3_groups[] = { 3261 + "i2c3", 3333 3262 }; 3334 3263 3335 3264 static const char * const intc_groups[] = { ··· 3576 3469 SH_PFC_FUNCTION(eth), 3577 3470 SH_PFC_FUNCTION(hscif0), 3578 3471 SH_PFC_FUNCTION(hscif1), 3472 + SH_PFC_FUNCTION(i2c1), 3473 + SH_PFC_FUNCTION(i2c2), 3474 + SH_PFC_FUNCTION(i2c3), 3579 3475 SH_PFC_FUNCTION(intc), 3580 3476 SH_PFC_FUNCTION(mmc0), 3581 3477 SH_PFC_FUNCTION(mmc1),
+4214
drivers/pinctrl/sh-pfc/pfc-r8a7791.c
··· 1 + /* 2 + * r8a7791 processor support - PFC hardware block. 3 + * 4 + * Copyright (C) 2013 Renesas Electronics Corporation 5 + * 6 + * This program is free software; you can redistribute it and/or modify 7 + * it under the terms of the GNU General Public License version 2 8 + * as published by the Free Software Foundation. 9 + */ 10 + 11 + #include <linux/kernel.h> 12 + #include <linux/platform_data/gpio-rcar.h> 13 + 14 + #include "core.h" 15 + #include "sh_pfc.h" 16 + 17 + #define CPU_ALL_PORT(fn, sfx) \ 18 + PORT_GP_32(0, fn, sfx), \ 19 + PORT_GP_32(1, fn, sfx), \ 20 + PORT_GP_32(2, fn, sfx), \ 21 + PORT_GP_32(3, fn, sfx), \ 22 + PORT_GP_32(4, fn, sfx), \ 23 + PORT_GP_32(5, fn, sfx), \ 24 + PORT_GP_32(6, fn, sfx), \ 25 + PORT_GP_32(7, fn, sfx) 26 + 27 + enum { 28 + PINMUX_RESERVED = 0, 29 + 30 + PINMUX_DATA_BEGIN, 31 + GP_ALL(DATA), 32 + PINMUX_DATA_END, 33 + 34 + PINMUX_FUNCTION_BEGIN, 35 + GP_ALL(FN), 36 + 37 + /* GPSR0 */ 38 + FN_IP0_0, FN_IP0_1, FN_IP0_2, FN_IP0_3, FN_IP0_4, FN_IP0_5, 39 + FN_IP0_6, FN_IP0_7, FN_IP0_8, FN_IP0_9, FN_IP0_10, FN_IP0_11, 40 + FN_IP0_12, FN_IP0_13, FN_IP0_14, FN_IP0_15, FN_IP0_18_16, FN_IP0_20_19, 41 + FN_IP0_22_21, FN_IP0_24_23, FN_IP0_26_25, FN_IP0_28_27, FN_IP0_30_29, 42 + FN_IP1_1_0, FN_IP1_3_2, FN_IP1_5_4, FN_IP1_7_6, FN_IP1_10_8, 43 + FN_IP1_13_11, FN_IP1_16_14, FN_IP1_19_17, FN_IP1_22_20, 44 + 45 + /* GPSR1 */ 46 + FN_IP1_25_23, FN_IP1_28_26, FN_IP1_31_29, FN_IP2_2_0, FN_IP2_4_3, 47 + FN_IP2_6_5, FN_IP2_9_7, FN_IP2_12_10, FN_IP2_15_13, FN_IP2_18_16, 48 + FN_IP2_20_19, FN_IP2_22_21, FN_EX_CS0_N, FN_IP2_24_23, FN_IP2_26_25, 49 + FN_IP2_29_27, FN_IP3_2_0, FN_IP3_5_3, FN_IP3_8_6, FN_RD_N, 50 + FN_IP3_11_9, FN_IP3_13_12, FN_IP3_15_14 , FN_IP3_17_16 , FN_IP3_19_18, 51 + FN_IP3_21_20, 52 + 53 + /* GPSR2 */ 54 + FN_IP3_27_25, FN_IP3_30_28, FN_IP4_1_0, FN_IP4_4_2, FN_IP4_7_5, 55 + FN_IP4_9_8, FN_IP4_12_10, FN_IP4_15_13, FN_IP4_18_16, FN_IP4_19, 56 + FN_IP4_20, FN_IP4_21, FN_IP4_23_22, FN_IP4_25_24, FN_IP4_27_26, 57 + FN_IP4_30_28, FN_IP5_2_0, FN_IP5_5_3, FN_IP5_8_6, FN_IP5_11_9, 58 + FN_IP5_14_12, FN_IP5_16_15, FN_IP5_19_17, FN_IP5_21_20, FN_IP5_23_22, 59 + FN_IP5_25_24, FN_IP5_28_26, FN_IP5_31_29, FN_AUDIO_CLKA, FN_IP6_2_0, 60 + FN_IP6_5_3, FN_IP6_7_6, 61 + 62 + /* GPSR3 */ 63 + FN_IP7_5_3, FN_IP7_8_6, FN_IP7_10_9, FN_IP7_12_11, FN_IP7_14_13, 64 + FN_IP7_16_15, FN_IP7_18_17, FN_IP7_20_19, FN_IP7_23_21, FN_IP7_26_24, 65 + FN_IP7_29_27, FN_IP8_2_0, FN_IP8_5_3, FN_IP8_8_6, FN_IP8_11_9, 66 + FN_IP8_14_12, FN_IP8_17_15, FN_IP8_20_18, FN_IP8_23_21, FN_IP8_25_24, 67 + FN_IP8_27_26, FN_IP8_30_28, FN_IP9_2_0, FN_IP9_5_3, FN_IP9_6, FN_IP9_7, 68 + FN_IP9_10_8, FN_IP9_11, FN_IP9_12, FN_IP9_15_13, FN_IP9_16, 69 + FN_IP9_18_17, 70 + 71 + /* GPSR4 */ 72 + FN_VI0_CLK, FN_IP9_20_19, FN_IP9_22_21, FN_IP9_24_23, FN_IP9_26_25, 73 + FN_VI0_DATA0_VI0_B0, FN_VI0_DATA1_VI0_B1, FN_VI0_DATA2_VI0_B2, 74 + FN_IP9_28_27, FN_VI0_DATA4_VI0_B4, FN_VI0_DATA5_VI0_B5, 75 + FN_VI0_DATA6_VI0_B6, FN_VI0_DATA7_VI0_B7, FN_IP9_31_29, FN_IP10_2_0, 76 + FN_IP10_5_3, FN_IP10_8_6, FN_IP10_11_9, FN_IP10_14_12, FN_IP10_16_15, 77 + FN_IP10_18_17, FN_IP10_21_19, FN_IP10_24_22, FN_IP10_26_25, 78 + FN_IP10_28_27, FN_IP10_31_29, FN_IP11_2_0, FN_IP11_5_3, FN_IP11_8_6, 79 + FN_IP15_1_0, FN_IP15_3_2, FN_IP15_5_4, 80 + 81 + /* GPSR5 */ 82 + FN_IP11_11_9, FN_IP11_14_12, FN_IP11_16_15, FN_IP11_18_17, FN_IP11_19, 83 + FN_IP11_20, FN_IP11_21, FN_IP11_22, FN_IP11_23, FN_IP11_24, 84 + FN_IP11_25, FN_IP11_26, FN_IP11_27, FN_IP11_29_28, FN_IP11_31_30, 85 + FN_IP12_1_0, FN_IP12_3_2, FN_IP12_6_4, FN_IP12_9_7, FN_IP12_12_10, 86 + FN_IP12_15_13, FN_IP12_17_16, FN_IP12_19_18, FN_IP12_21_20, 87 + FN_IP12_23_22, FN_IP12_26_24, FN_IP12_29_27, FN_IP13_2_0, FN_IP13_4_3, 88 + FN_IP13_6_5, FN_IP13_9_7, FN_IP3_24_22, 89 + 90 + /* GPSR6 */ 91 + FN_IP13_10, FN_IP13_11, FN_IP13_12, FN_IP13_13, FN_IP13_14, 92 + FN_IP13_15, FN_IP13_18_16, FN_IP13_21_19, FN_IP13_22, FN_IP13_24_23, 93 + FN_IP13_25, FN_IP13_26, FN_IP13_27, FN_IP13_30_28, FN_IP14_1_0, 94 + FN_IP14_2, FN_IP14_3, FN_IP14_4, FN_IP14_5, FN_IP14_6, FN_IP14_7, 95 + FN_IP14_10_8, FN_IP14_13_11, FN_IP14_16_14, FN_IP14_19_17, 96 + FN_IP14_22_20, FN_IP14_25_23, FN_IP14_28_26, FN_IP14_31_29, 97 + FN_USB1_OVC, FN_DU0_DOTCLKIN, 98 + 99 + /* GPSR7 */ 100 + FN_IP15_17_15, FN_IP15_20_18, FN_IP15_23_21, FN_IP15_26_24, 101 + FN_IP15_29_27, FN_IP16_2_0, FN_IP16_5_3, FN_IP16_7_6, FN_IP16_9_8, 102 + FN_IP16_11_10, FN_IP6_9_8, FN_IP6_11_10, FN_IP6_13_12, FN_IP6_15_14, 103 + FN_IP6_18_16, FN_IP6_20_19, FN_IP6_23_21, FN_IP6_26_24, FN_IP6_29_27, 104 + FN_IP7_2_0, FN_IP15_8_6, FN_IP15_11_9, FN_IP15_14_12, 105 + FN_USB0_PWEN, FN_USB0_OVC, FN_USB1_PWEN, 106 + 107 + /* IPSR0 */ 108 + FN_D0, FN_D1, FN_D2, FN_D3, FN_D4, FN_D5, FN_D6, FN_D7, FN_D8, 109 + FN_D9, FN_D10, FN_D11, FN_D12, FN_D13, FN_D14, FN_D15, 110 + FN_A0, FN_ATAWR0_N_C, FN_MSIOF0_SCK_B, FN_SCL0_C, FN_PWM2_B, 111 + FN_A1, FN_MSIOF0_SYNC_B, FN_A2, FN_MSIOF0_SS1_B, 112 + FN_A3, FN_MSIOF0_SS2_B, FN_A4, FN_MSIOF0_TXD_B, 113 + FN_A5, FN_MSIOF0_RXD_B, FN_A6, FN_MSIOF1_SCK, 114 + 115 + /* IPSR1 */ 116 + FN_A7, FN_MSIOF1_SYNC, FN_A8, FN_MSIOF1_SS1, FN_SCL0, 117 + FN_A9, FN_MSIOF1_SS2, FN_SDA0, 118 + FN_A10, FN_MSIOF1_TXD, FN_MSIOF1_TXD_D, 119 + FN_A11, FN_MSIOF1_RXD, FN_SCL3_D, FN_MSIOF1_RXD_D, 120 + FN_A12, FN_FMCLK, FN_SDA3_D, FN_MSIOF1_SCK_D, 121 + FN_A13, FN_ATAG0_N_C, FN_BPFCLK, FN_MSIOF1_SS1_D, 122 + FN_A14, FN_ATADIR0_N_C, FN_FMIN, FN_FMIN_C, FN_MSIOF1_SYNC_D, 123 + FN_A15, FN_BPFCLK_C, 124 + FN_A16, FN_DREQ2_B, FN_FMCLK_C, FN_SCIFA1_SCK_B, 125 + FN_A17, FN_DACK2_B, FN_SDA0_C, 126 + FN_A18, FN_DREQ1, FN_SCIFA1_RXD_C, FN_SCIFB1_RXD_C, 127 + 128 + /* IPSR2 */ 129 + FN_A19, FN_DACK1, FN_SCIFA1_TXD_C, FN_SCIFB1_TXD_C, FN_SCIFB1_SCK_B, 130 + FN_A20, FN_SPCLK, 131 + FN_A21, FN_ATAWR0_N_B, FN_MOSI_IO0, 132 + FN_A22, FN_MISO_IO1, FN_FMCLK_B, FN_TX0, FN_SCIFA0_TXD, 133 + FN_A23, FN_IO2, FN_BPFCLK_B, FN_RX0, FN_SCIFA0_RXD, 134 + FN_A24, FN_DREQ2, FN_IO3, FN_TX1, FN_SCIFA1_TXD, 135 + FN_A25, FN_DACK2, FN_SSL, FN_DREQ1_C, FN_RX1, FN_SCIFA1_RXD, 136 + FN_CS0_N, FN_ATAG0_N_B, FN_SCL1, 137 + FN_CS1_N_A26, FN_ATADIR0_N_B, FN_SDA1, 138 + FN_EX_CS1_N, FN_MSIOF2_SCK, 139 + FN_EX_CS2_N, FN_ATAWR0_N, FN_MSIOF2_SYNC, 140 + FN_EX_CS3_N, FN_ATADIR0_N, FN_MSIOF2_TXD, FN_ATAG0_N, FN_EX_WAIT1, 141 + 142 + /* IPSR3 */ 143 + FN_EX_CS4_N, FN_ATARD0_N, FN_MSIOF2_RXD, FN_EX_WAIT2, 144 + FN_EX_CS5_N, FN_ATACS00_N, FN_MSIOF2_SS1, FN_HRX1_B, 145 + FN_SCIFB1_RXD_B, FN_PWM1, FN_TPU_TO1, 146 + FN_BS_N, FN_ATACS10_N, FN_MSIOF2_SS2, FN_HTX1_B, 147 + FN_SCIFB1_TXD_B, FN_PWM2, FN_TPU_TO2, 148 + FN_RD_WR_N, FN_HRX2_B, FN_FMIN_B, FN_SCIFB0_RXD_B, FN_DREQ1_D, 149 + FN_WE0_N, FN_HCTS2_N_B, FN_SCIFB0_TXD_B, 150 + FN_WE1_N, FN_ATARD0_N_B, FN_HTX2_B, FN_SCIFB0_RTS_N_B, 151 + FN_EX_WAIT0, FN_HRTS2_N_B, FN_SCIFB0_CTS_N_B, 152 + FN_DREQ0, FN_PWM3, FN_TPU_TO3, 153 + FN_DACK0, FN_DRACK0, FN_REMOCON, 154 + FN_SPEEDIN, FN_HSCK0_C, FN_HSCK2_C, FN_SCIFB0_SCK_B, 155 + FN_SCIFB2_SCK_B, FN_DREQ2_C, FN_HTX2_D, 156 + FN_SSI_SCK0129, FN_HRX0_C, FN_HRX2_C, FN_SCIFB0_RXD_C, FN_SCIFB2_RXD_C, 157 + FN_SSI_WS0129, FN_HTX0_C, FN_HTX2_C, FN_SCIFB0_TXD_C, FN_SCIFB2_TXD_C, 158 + 159 + /* IPSR4 */ 160 + FN_SSI_SDATA0, FN_SCL0_B, FN_SCL7_B, FN_MSIOF2_SCK_C, 161 + FN_SSI_SCK1, FN_SDA0_B, FN_SDA7_B, FN_MSIOF2_SYNC_C, FN_GLO_I0_D, 162 + FN_SSI_WS1, FN_SCL1_B, FN_SCL8_B, FN_MSIOF2_TXD_C, FN_GLO_I1_D, 163 + FN_SSI_SDATA1, FN_SDA1_B, FN_SDA8_B, FN_MSIOF2_RXD_C, 164 + FN_SSI_SCK2, FN_SCL2, FN_GPS_CLK_B, FN_GLO_Q0_D, FN_HSCK1_E, 165 + FN_SSI_WS2, FN_SDA2, FN_GPS_SIGN_B, FN_RX2_E, 166 + FN_GLO_Q1_D, FN_HCTS1_N_E, 167 + FN_SSI_SDATA2, FN_GPS_MAG_B, FN_TX2_E, FN_HRTS1_N_E, 168 + FN_SSI_SCK34, FN_SSI_WS34, FN_SSI_SDATA3, 169 + FN_SSI_SCK4, FN_GLO_SS_D, 170 + FN_SSI_WS4, FN_GLO_RFON_D, 171 + FN_SSI_SDATA4, FN_MSIOF2_SCK_D, 172 + FN_SSI_SCK5, FN_MSIOF1_SCK_C, FN_TS_SDATA0, FN_GLO_I0, 173 + FN_MSIOF2_SYNC_D, FN_VI1_R2_B, 174 + 175 + /* IPSR5 */ 176 + FN_SSI_WS5, FN_MSIOF1_SYNC_C, FN_TS_SCK0, FN_GLO_I1, 177 + FN_MSIOF2_TXD_D, FN_VI1_R3_B, 178 + FN_SSI_SDATA5, FN_MSIOF1_TXD_C, FN_TS_SDEN0, FN_GLO_Q0, 179 + FN_MSIOF2_SS1_D, FN_VI1_R4_B, 180 + FN_SSI_SCK6, FN_MSIOF1_RXD_C, FN_TS_SPSYNC0, FN_GLO_Q1, 181 + FN_MSIOF2_RXD_D, FN_VI1_R5_B, 182 + FN_SSI_WS6, FN_GLO_SCLK, FN_MSIOF2_SS2_D, FN_VI1_R6_B, 183 + FN_SSI_SDATA6, FN_STP_IVCXO27_0_B, FN_GLO_SDATA, FN_VI1_R7_B, 184 + FN_SSI_SCK78, FN_STP_ISCLK_0_B, FN_GLO_SS, 185 + FN_SSI_WS78, FN_TX0_D, FN_STP_ISD_0_B, FN_GLO_RFON, 186 + FN_SSI_SDATA7, FN_RX0_D, FN_STP_ISEN_0_B, 187 + FN_SSI_SDATA8, FN_TX1_D, FN_STP_ISSYNC_0_B, 188 + FN_SSI_SCK9, FN_RX1_D, FN_GLO_SCLK_D, 189 + FN_SSI_WS9, FN_TX3_D, FN_CAN0_TX_D, FN_GLO_SDATA_D, 190 + FN_SSI_SDATA9, FN_RX3_D, FN_CAN0_RX_D, 191 + 192 + /* IPSR6 */ 193 + FN_AUDIO_CLKB, FN_STP_OPWM_0_B, FN_MSIOF1_SCK_B, 194 + FN_SCIF_CLK, FN_BPFCLK_E, 195 + FN_AUDIO_CLKC, FN_SCIFB0_SCK_C, FN_MSIOF1_SYNC_B, FN_RX2, 196 + FN_SCIFA2_RXD, FN_FMIN_E, 197 + FN_AUDIO_CLKOUT, FN_MSIOF1_SS1_B, FN_TX2, FN_SCIFA2_TXD, 198 + FN_IRQ0, FN_SCIFB1_RXD_D, FN_INTC_IRQ0_N, 199 + FN_IRQ1, FN_SCIFB1_SCK_C, FN_INTC_IRQ1_N, 200 + FN_IRQ2, FN_SCIFB1_TXD_D, FN_INTC_IRQ2_N, 201 + FN_IRQ3, FN_SCL4_C, FN_MSIOF2_TXD_E, FN_INTC_IRQ3_N, 202 + FN_IRQ4, FN_HRX1_C, FN_SDA4_C, FN_MSIOF2_RXD_E, FN_INTC_IRQ4_N, 203 + FN_IRQ5, FN_HTX1_C, FN_SCL1_E, FN_MSIOF2_SCK_E, 204 + FN_IRQ6, FN_HSCK1_C, FN_MSIOF1_SS2_B, FN_SDA1_E, FN_MSIOF2_SYNC_E, 205 + FN_IRQ7, FN_HCTS1_N_C, FN_MSIOF1_TXD_B, FN_GPS_CLK_C, FN_GPS_CLK_D, 206 + FN_IRQ8, FN_HRTS1_N_C, FN_MSIOF1_RXD_B, FN_GPS_SIGN_C, FN_GPS_SIGN_D, 207 + 208 + /* IPSR7 */ 209 + FN_IRQ9, FN_DU1_DOTCLKIN_B, FN_CAN_CLK_D, FN_GPS_MAG_C, 210 + FN_SCIF_CLK_B, FN_GPS_MAG_D, 211 + FN_DU1_DR0, FN_LCDOUT0, FN_VI1_DATA0_B, FN_TX0_B, 212 + FN_SCIFA0_TXD_B, FN_MSIOF2_SCK_B, 213 + FN_DU1_DR1, FN_LCDOUT1, FN_VI1_DATA1_B, FN_RX0_B, 214 + FN_SCIFA0_RXD_B, FN_MSIOF2_SYNC_B, 215 + FN_DU1_DR2, FN_LCDOUT2, FN_SSI_SCK0129_B, 216 + FN_DU1_DR3, FN_LCDOUT3, FN_SSI_WS0129_B, 217 + FN_DU1_DR4, FN_LCDOUT4, FN_SSI_SDATA0_B, 218 + FN_DU1_DR5, FN_LCDOUT5, FN_SSI_SCK1_B, 219 + FN_DU1_DR6, FN_LCDOUT6, FN_SSI_WS1_B, 220 + FN_DU1_DR7, FN_LCDOUT7, FN_SSI_SDATA1_B, 221 + FN_DU1_DG0, FN_LCDOUT8, FN_VI1_DATA2_B, FN_TX1_B, 222 + FN_SCIFA1_TXD_B, FN_MSIOF2_SS1_B, 223 + FN_DU1_DG1, FN_LCDOUT9, FN_VI1_DATA3_B, FN_RX1_B, 224 + FN_SCIFA1_RXD_B, FN_MSIOF2_SS2_B, 225 + FN_DU1_DG2, FN_LCDOUT10, FN_VI1_DATA4_B, FN_SCIF1_SCK_B, 226 + FN_SCIFA1_SCK, FN_SSI_SCK78_B, 227 + 228 + /* IPSR8 */ 229 + FN_DU1_DG3, FN_LCDOUT11, FN_VI1_DATA5_B, FN_SSI_WS78_B, 230 + FN_DU1_DG4, FN_LCDOUT12, FN_VI1_DATA6_B, FN_HRX0_B, 231 + FN_SCIFB2_RXD_B, FN_SSI_SDATA7_B, 232 + FN_DU1_DG5, FN_LCDOUT13, FN_VI1_DATA7_B, FN_HCTS0_N_B, 233 + FN_SCIFB2_TXD_B, FN_SSI_SDATA8_B, 234 + FN_DU1_DG6, FN_LCDOUT14, FN_HRTS0_N_B, 235 + FN_SCIFB2_CTS_N_B, FN_SSI_SCK9_B, 236 + FN_DU1_DG7, FN_LCDOUT15, FN_HTX0_B, FN_SCIFB2_RTS_N_B, FN_SSI_WS9_B, 237 + FN_DU1_DB0, FN_LCDOUT16, FN_VI1_CLK_B, FN_TX2_B, 238 + FN_SCIFA2_TXD_B, FN_MSIOF2_TXD_B, 239 + FN_DU1_DB1, FN_LCDOUT17, FN_VI1_HSYNC_N_B, FN_RX2_B, 240 + FN_SCIFA2_RXD_B, FN_MSIOF2_RXD_B, 241 + FN_DU1_DB2, FN_LCDOUT18, FN_VI1_VSYNC_N_B, FN_SCIF2_SCK_B, 242 + FN_SCIFA2_SCK, FN_SSI_SDATA9_B, 243 + FN_DU1_DB3, FN_LCDOUT19, FN_VI1_CLKENB_B, 244 + FN_DU1_DB4, FN_LCDOUT20, FN_VI1_FIELD_B, FN_CAN1_RX, 245 + FN_DU1_DB5, FN_LCDOUT21, FN_TX3, FN_SCIFA3_TXD, FN_CAN1_TX, 246 + 247 + /* IPSR9 */ 248 + FN_DU1_DB6, FN_LCDOUT22, FN_SCL3_C, FN_RX3, FN_SCIFA3_RXD, 249 + FN_DU1_DB7, FN_LCDOUT23, FN_SDA3_C, FN_SCIF3_SCK, FN_SCIFA3_SCK, 250 + FN_DU1_DOTCLKIN, FN_QSTVA_QVS, 251 + FN_DU1_DOTCLKOUT0, FN_QCLK, 252 + FN_DU1_DOTCLKOUT1, FN_QSTVB_QVE, FN_CAN0_TX, 253 + FN_TX3_B, FN_SCL2_B, FN_PWM4, 254 + FN_DU1_EXHSYNC_DU1_HSYNC, FN_QSTH_QHS, 255 + FN_DU1_EXVSYNC_DU1_VSYNC, FN_QSTB_QHE, 256 + FN_DU1_EXODDF_DU1_ODDF_DISP_CDE, FN_QCPV_QDE, 257 + FN_CAN0_RX, FN_RX3_B, FN_SDA2_B, 258 + FN_DU1_DISP, FN_QPOLA, 259 + FN_DU1_CDE, FN_QPOLB, FN_PWM4_B, 260 + FN_VI0_CLKENB, FN_TX4, FN_SCIFA4_TXD, FN_TS_SDATA0_D, 261 + FN_VI0_FIELD, FN_RX4, FN_SCIFA4_RXD, FN_TS_SCK0_D, 262 + FN_VI0_HSYNC_N, FN_TX5, FN_SCIFA5_TXD, FN_TS_SDEN0_D, 263 + FN_VI0_VSYNC_N, FN_RX5, FN_SCIFA5_RXD, FN_TS_SPSYNC0_D, 264 + FN_VI0_DATA3_VI0_B3, FN_SCIF3_SCK_B, FN_SCIFA3_SCK_B, 265 + FN_VI0_G0, FN_SCL8, FN_STP_IVCXO27_0_C, FN_SCL4, 266 + FN_HCTS2_N, FN_SCIFB2_CTS_N, FN_ATAWR1_N, 267 + 268 + /* IPSR10 */ 269 + FN_VI0_G1, FN_SDA8, FN_STP_ISCLK_0_C, FN_SDA4, 270 + FN_HRTS2_N, FN_SCIFB2_RTS_N, FN_ATADIR1_N, 271 + FN_VI0_G2, FN_VI2_HSYNC_N, FN_STP_ISD_0_C, FN_SCL3_B, 272 + FN_HSCK2, FN_SCIFB2_SCK, FN_ATARD1_N, 273 + FN_VI0_G3, FN_VI2_VSYNC_N, FN_STP_ISEN_0_C, FN_SDA3_B, 274 + FN_HRX2, FN_SCIFB2_RXD, FN_ATACS01_N, 275 + FN_VI0_G4, FN_VI2_CLKENB, FN_STP_ISSYNC_0_C, 276 + FN_HTX2, FN_SCIFB2_TXD, FN_SCIFB0_SCK_D, 277 + FN_VI0_G5, FN_VI2_FIELD, FN_STP_OPWM_0_C, FN_FMCLK_D, 278 + FN_CAN0_TX_E, FN_HTX1_D, FN_SCIFB0_TXD_D, 279 + FN_VI0_G6, FN_VI2_CLK, FN_BPFCLK_D, 280 + FN_VI0_G7, FN_VI2_DATA0, FN_FMIN_D, 281 + FN_VI0_R0, FN_VI2_DATA1, FN_GLO_I0_B, 282 + FN_TS_SDATA0_C, FN_ATACS11_N, 283 + FN_VI0_R1, FN_VI2_DATA2, FN_GLO_I1_B, 284 + FN_TS_SCK0_C, FN_ATAG1_N, 285 + FN_VI0_R2, FN_VI2_DATA3, FN_GLO_Q0_B, FN_TS_SDEN0_C, 286 + FN_VI0_R3, FN_VI2_DATA4, FN_GLO_Q1_B, FN_TS_SPSYNC0_C, 287 + FN_VI0_R4, FN_VI2_DATA5, FN_GLO_SCLK_B, FN_TX0_C, FN_SCL1_D, 288 + 289 + /* IPSR11 */ 290 + FN_VI0_R5, FN_VI2_DATA6, FN_GLO_SDATA_B, FN_RX0_C, FN_SDA1_D, 291 + FN_VI0_R6, FN_VI2_DATA7, FN_GLO_SS_B, FN_TX1_C, FN_SCL4_B, 292 + FN_VI0_R7, FN_GLO_RFON_B, FN_RX1_C, FN_CAN0_RX_E, 293 + FN_SDA4_B, FN_HRX1_D, FN_SCIFB0_RXD_D, 294 + FN_VI1_HSYNC_N, FN_AVB_RXD0, FN_TS_SDATA0_B, FN_TX4_B, FN_SCIFA4_TXD_B, 295 + FN_VI1_VSYNC_N, FN_AVB_RXD1, FN_TS_SCK0_B, FN_RX4_B, FN_SCIFA4_RXD_B, 296 + FN_VI1_CLKENB, FN_AVB_RXD2, FN_TS_SDEN0_B, 297 + FN_VI1_FIELD, FN_AVB_RXD3, FN_TS_SPSYNC0_B, 298 + FN_VI1_CLK, FN_AVB_RXD4, FN_VI1_DATA0, FN_AVB_RXD5, 299 + FN_VI1_DATA1, FN_AVB_RXD6, FN_VI1_DATA2, FN_AVB_RXD7, 300 + FN_VI1_DATA3, FN_AVB_RX_ER, FN_VI1_DATA4, FN_AVB_MDIO, 301 + FN_VI1_DATA5, FN_AVB_RX_DV, FN_VI1_DATA6, FN_AVB_MAGIC, 302 + FN_VI1_DATA7, FN_AVB_MDC, 303 + FN_ETH_MDIO, FN_AVB_RX_CLK, FN_SCL2_C, 304 + FN_ETH_CRS_DV, FN_AVB_LINK, FN_SDA2_C, 305 + 306 + /* IPSR12 */ 307 + FN_ETH_RX_ER, FN_AVB_CRS, FN_SCL3, FN_SCL7, 308 + FN_ETH_RXD0, FN_AVB_PHY_INT, FN_SDA3, FN_SDA7, 309 + FN_ETH_RXD1, FN_AVB_GTXREFCLK, FN_CAN0_TX_C, 310 + FN_SCL2_D, FN_MSIOF1_RXD_E, 311 + FN_ETH_LINK, FN_AVB_TXD0, FN_CAN0_RX_C, FN_SDA2_D, FN_MSIOF1_SCK_E, 312 + FN_ETH_REFCLK, FN_AVB_TXD1, FN_SCIFA3_RXD_B, 313 + FN_CAN1_RX_C, FN_MSIOF1_SYNC_E, 314 + FN_ETH_TXD1, FN_AVB_TXD2, FN_SCIFA3_TXD_B, 315 + FN_CAN1_TX_C, FN_MSIOF1_TXD_E, 316 + FN_ETH_TX_EN, FN_AVB_TXD3, FN_TCLK1_B, FN_CAN_CLK_B, 317 + FN_ETH_MAGIC, FN_AVB_TXD4, FN_IETX_C, 318 + FN_ETH_TXD0, FN_AVB_TXD5, FN_IECLK_C, 319 + FN_ETH_MDC, FN_AVB_TXD6, FN_IERX_C, 320 + FN_STP_IVCXO27_0, FN_AVB_TXD7, FN_SCIFB2_TXD_D, 321 + FN_ADIDATA_B, FN_MSIOF0_SYNC_C, 322 + FN_STP_ISCLK_0, FN_AVB_TX_EN, FN_SCIFB2_RXD_D, 323 + FN_ADICS_SAMP_B, FN_MSIOF0_SCK_C, 324 + 325 + /* IPSR13 */ 326 + FN_STP_ISD_0, FN_AVB_TX_ER, FN_SCIFB2_SCK_C, 327 + FN_ADICLK_B, FN_MSIOF0_SS1_C, 328 + FN_STP_ISEN_0, FN_AVB_TX_CLK, FN_ADICHS0_B, FN_MSIOF0_SS2_C, 329 + FN_STP_ISSYNC_0, FN_AVB_COL, FN_ADICHS1_B, FN_MSIOF0_RXD_C, 330 + FN_STP_OPWM_0, FN_AVB_GTX_CLK, FN_PWM0_B, 331 + FN_ADICHS2_B, FN_MSIOF0_TXD_C, 332 + FN_SD0_CLK, FN_SPCLK_B, FN_SD0_CMD, FN_MOSI_IO0_B, 333 + FN_SD0_DATA0, FN_MISO_IO1_B, FN_SD0_DATA1, FN_IO2_B, 334 + FN_SD0_DATA2, FN_IO3_B, FN_SD0_DATA3, FN_SSL_B, 335 + FN_SD0_CD, FN_MMC_D6_B, FN_SIM0_RST_B, FN_CAN0_RX_F, 336 + FN_SCIFA5_TXD_B, FN_TX3_C, 337 + FN_SD0_WP, FN_MMC_D7_B, FN_SIM0_D_B, FN_CAN0_TX_F, 338 + FN_SCIFA5_RXD_B, FN_RX3_C, 339 + FN_SD1_CMD, FN_REMOCON_B, FN_SD1_DATA0, FN_SPEEDIN_B, 340 + FN_SD1_DATA1, FN_IETX_B, FN_SD1_DATA2, FN_IECLK_B, 341 + FN_SD1_DATA3, FN_IERX_B, 342 + FN_SD1_CD, FN_PWM0, FN_TPU_TO0, FN_SCL1_C, 343 + 344 + /* IPSR14 */ 345 + FN_SD1_WP, FN_PWM1_B, FN_SDA1_C, 346 + FN_SD2_CLK, FN_MMC_CLK, FN_SD2_CMD, FN_MMC_CMD, 347 + FN_SD2_DATA0, FN_MMC_D0, FN_SD2_DATA1, FN_MMC_D1, 348 + FN_SD2_DATA2, FN_MMC_D2, FN_SD2_DATA3, FN_MMC_D3, 349 + FN_SD2_CD, FN_MMC_D4, FN_SCL8_C, FN_TX5_B, FN_SCIFA5_TXD_C, 350 + FN_SD2_WP, FN_MMC_D5, FN_SDA8_C, FN_RX5_B, FN_SCIFA5_RXD_C, 351 + FN_MSIOF0_SCK, FN_RX2_C, FN_ADIDATA, FN_VI1_CLK_C, FN_VI1_G0_B, 352 + FN_MSIOF0_SYNC, FN_TX2_C, FN_ADICS_SAMP, FN_VI1_CLKENB_C, FN_VI1_G1_B, 353 + FN_MSIOF0_TXD, FN_ADICLK, FN_VI1_FIELD_C, FN_VI1_G2_B, 354 + FN_MSIOF0_RXD, FN_ADICHS0, FN_VI1_DATA0_C, FN_VI1_G3_B, 355 + FN_MSIOF0_SS1, FN_MMC_D6, FN_ADICHS1, FN_TX0_E, 356 + FN_VI1_HSYNC_N_C, FN_SCL7_C, FN_VI1_G4_B, 357 + FN_MSIOF0_SS2, FN_MMC_D7, FN_ADICHS2, FN_RX0_E, 358 + FN_VI1_VSYNC_N_C, FN_SDA7_C, FN_VI1_G5_B, 359 + 360 + /* IPSR15 */ 361 + FN_SIM0_RST, FN_IETX, FN_CAN1_TX_D, 362 + FN_SIM0_CLK, FN_IECLK, FN_CAN_CLK_C, 363 + FN_SIM0_D, FN_IERX, FN_CAN1_RX_D, 364 + FN_GPS_CLK, FN_DU1_DOTCLKIN_C, FN_AUDIO_CLKB_B, 365 + FN_PWM5_B, FN_SCIFA3_TXD_C, 366 + FN_GPS_SIGN, FN_TX4_C, FN_SCIFA4_TXD_C, FN_PWM5, 367 + FN_VI1_G6_B, FN_SCIFA3_RXD_C, 368 + FN_GPS_MAG, FN_RX4_C, FN_SCIFA4_RXD_C, FN_PWM6, 369 + FN_VI1_G7_B, FN_SCIFA3_SCK_C, 370 + FN_HCTS0_N, FN_SCIFB0_CTS_N, FN_GLO_I0_C, FN_TCLK1, FN_VI1_DATA1_C, 371 + FN_HRTS0_N, FN_SCIFB0_RTS_N, FN_GLO_I1_C, FN_VI1_DATA2_C, 372 + FN_HSCK0, FN_SCIFB0_SCK, FN_GLO_Q0_C, FN_CAN_CLK, 373 + FN_TCLK2, FN_VI1_DATA3_C, 374 + FN_HRX0, FN_SCIFB0_RXD, FN_GLO_Q1_C, FN_CAN0_RX_B, FN_VI1_DATA4_C, 375 + FN_HTX0, FN_SCIFB0_TXD, FN_GLO_SCLK_C, FN_CAN0_TX_B, FN_VI1_DATA5_C, 376 + 377 + /* IPSR16 */ 378 + FN_HRX1, FN_SCIFB1_RXD, FN_VI1_R0_B, FN_GLO_SDATA_C, FN_VI1_DATA6_C, 379 + FN_HTX1, FN_SCIFB1_TXD, FN_VI1_R1_B, FN_GLO_SS_C, FN_VI1_DATA7_C, 380 + FN_HSCK1, FN_SCIFB1_SCK, FN_MLB_CK, FN_GLO_RFON_C, 381 + FN_HCTS1_N, FN_SCIFB1_CTS_N, FN_MLB_SIG, FN_CAN1_TX_B, 382 + FN_HRTS1_N, FN_SCIFB1_RTS_N, FN_MLB_DAT, FN_CAN1_RX_B, 383 + 384 + /* MOD_SEL */ 385 + FN_SEL_SCIF1_0, FN_SEL_SCIF1_1, FN_SEL_SCIF1_2, FN_SEL_SCIF1_3, 386 + FN_SEL_SCIFB_0, FN_SEL_SCIFB_1, FN_SEL_SCIFB_2, FN_SEL_SCIFB_3, 387 + FN_SEL_SCIFB2_0, FN_SEL_SCIFB2_1, FN_SEL_SCIFB2_2, FN_SEL_SCIFB2_3, 388 + FN_SEL_SCIFB1_0, FN_SEL_SCIFB1_1, FN_SEL_SCIFB1_2, FN_SEL_SCIFB1_3, 389 + FN_SEL_SCIFA1_0, FN_SEL_SCIFA1_1, FN_SEL_SCIFA1_2, 390 + FN_SEL_SSI9_0, FN_SEL_SSI9_1, 391 + FN_SEL_SCFA_0, FN_SEL_SCFA_1, 392 + FN_SEL_QSP_0, FN_SEL_QSP_1, 393 + FN_SEL_SSI7_0, FN_SEL_SSI7_1, 394 + FN_SEL_HSCIF1_0, FN_SEL_HSCIF1_1, FN_SEL_HSCIF1_2, FN_SEL_HSCIF1_3, 395 + FN_SEL_HSCIF1_4, 396 + FN_SEL_VI1_0, FN_SEL_VI1_1, FN_SEL_VI1_2, 397 + FN_SEL_TMU1_0, FN_SEL_TMU1_1, 398 + FN_SEL_LBS_0, FN_SEL_LBS_1, FN_SEL_LBS_2, FN_SEL_LBS_3, 399 + FN_SEL_TSIF0_0, FN_SEL_TSIF0_1, FN_SEL_TSIF0_2, FN_SEL_TSIF0_3, 400 + FN_SEL_SOF0_0, FN_SEL_SOF0_1, FN_SEL_SOF0_2, 401 + 402 + /* MOD_SEL2 */ 403 + FN_SEL_SCIF0_0, FN_SEL_SCIF0_1, FN_SEL_SCIF0_2, FN_SEL_SCIF0_3, 404 + FN_SEL_SCIF0_4, 405 + FN_SEL_SCIF_0, FN_SEL_SCIF_1, 406 + FN_SEL_CAN0_0, FN_SEL_CAN0_1, FN_SEL_CAN0_2, FN_SEL_CAN0_3, 407 + FN_SEL_CAN0_4, FN_SEL_CAN0_5, 408 + FN_SEL_CAN1_0, FN_SEL_CAN1_1, FN_SEL_CAN1_2, FN_SEL_CAN1_3, 409 + FN_SEL_SCIFA2_0, FN_SEL_SCIFA2_1, 410 + FN_SEL_SCIF4_0, FN_SEL_SCIF4_1, FN_SEL_SCIF4_2, 411 + FN_SEL_ADG_0, FN_SEL_ADG_1, 412 + FN_SEL_FM_0, FN_SEL_FM_1, FN_SEL_FM_2, FN_SEL_FM_3, FN_SEL_FM_4, 413 + FN_SEL_SCIFA5_0, FN_SEL_SCIFA5_1, FN_SEL_SCIFA5_2, 414 + FN_SEL_GPS_0, FN_SEL_GPS_1, FN_SEL_GPS_2, FN_SEL_GPS_3, 415 + FN_SEL_SCIFA4_0, FN_SEL_SCIFA4_1, FN_SEL_SCIFA4_2, 416 + FN_SEL_SCIFA3_0, FN_SEL_SCIFA3_1, FN_SEL_SCIFA3_2, 417 + FN_SEL_SIM_0, FN_SEL_SIM_1, 418 + FN_SEL_SSI8_0, FN_SEL_SSI8_1, 419 + 420 + /* MOD_SEL3 */ 421 + FN_SEL_HSCIF2_0, FN_SEL_HSCIF2_1, FN_SEL_HSCIF2_2, FN_SEL_HSCIF2_3, 422 + FN_SEL_CANCLK_0, FN_SEL_CANCLK_1, FN_SEL_CANCLK_2, FN_SEL_CANCLK_3, 423 + FN_SEL_IIC8_0, FN_SEL_IIC8_1, FN_SEL_IIC8_2, 424 + FN_SEL_IIC7_0, FN_SEL_IIC7_1, FN_SEL_IIC7_2, 425 + FN_SEL_IIC4_0, FN_SEL_IIC4_1, FN_SEL_IIC4_2, 426 + FN_SEL_IIC3_0, FN_SEL_IIC3_1, FN_SEL_IIC3_2, FN_SEL_IIC3_3, 427 + FN_SEL_SCIF3_0, FN_SEL_SCIF3_1, FN_SEL_SCIF3_2, FN_SEL_SCIF3_3, 428 + FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, 429 + FN_SEL_MMC_0, FN_SEL_MMC_1, 430 + FN_SEL_SCIF5_0, FN_SEL_SCIF5_1, 431 + FN_SEL_IIC2_0, FN_SEL_IIC2_1, FN_SEL_IIC2_2, FN_SEL_IIC2_3, 432 + FN_SEL_IIC1_0, FN_SEL_IIC1_1, FN_SEL_IIC1_2, FN_SEL_IIC1_3, 433 + FN_SEL_IIC1_4, 434 + FN_SEL_IIC0_0, FN_SEL_IIC0_1, FN_SEL_IIC0_2, 435 + 436 + /* MOD_SEL4 */ 437 + FN_SEL_SOF1_0, FN_SEL_SOF1_1, FN_SEL_SOF1_2, FN_SEL_SOF1_3, 438 + FN_SEL_SOF1_4, 439 + FN_SEL_HSCIF0_0, FN_SEL_HSCIF0_1, FN_SEL_HSCIF0_2, 440 + FN_SEL_DIS_0, FN_SEL_DIS_1, FN_SEL_DIS_2, 441 + FN_SEL_RAD_0, FN_SEL_RAD_1, 442 + FN_SEL_RCN_0, FN_SEL_RCN_1, 443 + FN_SEL_RSP_0, FN_SEL_RSP_1, 444 + FN_SEL_SCIF2_0, FN_SEL_SCIF2_1, FN_SEL_SCIF2_2, FN_SEL_SCIF2_3, 445 + FN_SEL_SCIF2_4, 446 + FN_SEL_SOF2_0, FN_SEL_SOF2_1, FN_SEL_SOF2_2, FN_SEL_SOF2_3, 447 + FN_SEL_SOF2_4, 448 + FN_SEL_SSI1_0, FN_SEL_SSI1_1, 449 + FN_SEL_SSI0_0, FN_SEL_SSI0_1, 450 + FN_SEL_SSP_0, FN_SEL_SSP_1, FN_SEL_SSP_2, 451 + PINMUX_FUNCTION_END, 452 + 453 + PINMUX_MARK_BEGIN, 454 + 455 + EX_CS0_N_MARK, RD_N_MARK, 456 + 457 + AUDIO_CLKA_MARK, 458 + 459 + VI0_CLK_MARK, VI0_DATA0_VI0_B0_MARK, VI0_DATA1_VI0_B1_MARK, 460 + VI0_DATA2_VI0_B2_MARK, VI0_DATA4_VI0_B4_MARK, VI0_DATA5_VI0_B5_MARK, 461 + VI0_DATA6_VI0_B6_MARK, VI0_DATA7_VI0_B7_MARK, 462 + 463 + SD1_CLK_MARK, 464 + 465 + USB0_PWEN_MARK, USB0_OVC_MARK, USB1_PWEN_MARK, USB1_OVC_MARK, 466 + DU0_DOTCLKIN_MARK, 467 + 468 + /* IPSR0 */ 469 + D0_MARK, D1_MARK, D2_MARK, D3_MARK, D4_MARK, D5_MARK, 470 + D6_MARK, D7_MARK, D8_MARK, 471 + D9_MARK, D10_MARK, D11_MARK, D12_MARK, D13_MARK, D14_MARK, D15_MARK, 472 + A0_MARK, ATAWR0_N_C_MARK, MSIOF0_SCK_B_MARK, SCL0_C_MARK, PWM2_B_MARK, 473 + A1_MARK, MSIOF0_SYNC_B_MARK, A2_MARK, MSIOF0_SS1_B_MARK, 474 + A3_MARK, MSIOF0_SS2_B_MARK, A4_MARK, MSIOF0_TXD_B_MARK, 475 + A5_MARK, MSIOF0_RXD_B_MARK, A6_MARK, MSIOF1_SCK_MARK, 476 + 477 + /* IPSR1 */ 478 + A7_MARK, MSIOF1_SYNC_MARK, A8_MARK, MSIOF1_SS1_MARK, SCL0_MARK, 479 + A9_MARK, MSIOF1_SS2_MARK, SDA0_MARK, 480 + A10_MARK, MSIOF1_TXD_MARK, MSIOF1_TXD_D_MARK, 481 + A11_MARK, MSIOF1_RXD_MARK, SCL3_D_MARK, MSIOF1_RXD_D_MARK, 482 + A12_MARK, FMCLK_MARK, SDA3_D_MARK, MSIOF1_SCK_D_MARK, 483 + A13_MARK, ATAG0_N_C_MARK, BPFCLK_MARK, MSIOF1_SS1_D_MARK, 484 + A14_MARK, ATADIR0_N_C_MARK, FMIN_MARK, FMIN_C_MARK, MSIOF1_SYNC_D_MARK, 485 + A15_MARK, BPFCLK_C_MARK, 486 + A16_MARK, DREQ2_B_MARK, FMCLK_C_MARK, SCIFA1_SCK_B_MARK, 487 + A17_MARK, DACK2_B_MARK, SDA0_C_MARK, 488 + A18_MARK, DREQ1_MARK, SCIFA1_RXD_C_MARK, SCIFB1_RXD_C_MARK, 489 + 490 + /* IPSR2 */ 491 + A19_MARK, DACK1_MARK, SCIFA1_TXD_C_MARK, 492 + SCIFB1_TXD_C_MARK, SCIFB1_SCK_B_MARK, 493 + A20_MARK, SPCLK_MARK, 494 + A21_MARK, ATAWR0_N_B_MARK, MOSI_IO0_MARK, 495 + A22_MARK, MISO_IO1_MARK, FMCLK_B_MARK, TX0_MARK, SCIFA0_TXD_MARK, 496 + A23_MARK, IO2_MARK, BPFCLK_B_MARK, RX0_MARK, SCIFA0_RXD_MARK, 497 + A24_MARK, DREQ2_MARK, IO3_MARK, TX1_MARK, SCIFA1_TXD_MARK, 498 + A25_MARK, DACK2_MARK, SSL_MARK, DREQ1_C_MARK, 499 + RX1_MARK, SCIFA1_RXD_MARK, 500 + CS0_N_MARK, ATAG0_N_B_MARK, SCL1_MARK, 501 + CS1_N_A26_MARK, ATADIR0_N_B_MARK, SDA1_MARK, 502 + EX_CS1_N_MARK, MSIOF2_SCK_MARK, 503 + EX_CS2_N_MARK, ATAWR0_N_MARK, MSIOF2_SYNC_MARK, 504 + EX_CS3_N_MARK, ATADIR0_N_MARK, MSIOF2_TXD_MARK, 505 + ATAG0_N_MARK, EX_WAIT1_MARK, 506 + 507 + /* IPSR3 */ 508 + EX_CS4_N_MARK, ATARD0_N_MARK, MSIOF2_RXD_MARK, EX_WAIT2_MARK, 509 + EX_CS5_N_MARK, ATACS00_N_MARK, MSIOF2_SS1_MARK, HRX1_B_MARK, 510 + SCIFB1_RXD_B_MARK, PWM1_MARK, TPU_TO1_MARK, 511 + BS_N_MARK, ATACS10_N_MARK, MSIOF2_SS2_MARK, HTX1_B_MARK, 512 + SCIFB1_TXD_B_MARK, PWM2_MARK, TPU_TO2_MARK, 513 + RD_WR_N_MARK, HRX2_B_MARK, FMIN_B_MARK, 514 + SCIFB0_RXD_B_MARK, DREQ1_D_MARK, 515 + WE0_N_MARK, HCTS2_N_B_MARK, SCIFB0_TXD_B_MARK, 516 + WE1_N_MARK, ATARD0_N_B_MARK, HTX2_B_MARK, SCIFB0_RTS_N_B_MARK, 517 + EX_WAIT0_MARK, HRTS2_N_B_MARK, SCIFB0_CTS_N_B_MARK, 518 + DREQ0_MARK, PWM3_MARK, TPU_TO3_MARK, 519 + DACK0_MARK, DRACK0_MARK, REMOCON_MARK, 520 + SPEEDIN_MARK, HSCK0_C_MARK, HSCK2_C_MARK, SCIFB0_SCK_B_MARK, 521 + SCIFB2_SCK_B_MARK, DREQ2_C_MARK, HTX2_D_MARK, 522 + SSI_SCK0129_MARK, HRX0_C_MARK, HRX2_C_MARK, 523 + SCIFB0_RXD_C_MARK, SCIFB2_RXD_C_MARK, 524 + SSI_WS0129_MARK, HTX0_C_MARK, HTX2_C_MARK, 525 + SCIFB0_TXD_C_MARK, SCIFB2_TXD_C_MARK, 526 + 527 + /* IPSR4 */ 528 + SSI_SDATA0_MARK, SCL0_B_MARK, SCL7_B_MARK, MSIOF2_SCK_C_MARK, 529 + SSI_SCK1_MARK, SDA0_B_MARK, SDA7_B_MARK, 530 + MSIOF2_SYNC_C_MARK, GLO_I0_D_MARK, 531 + SSI_WS1_MARK, SCL1_B_MARK, SCL8_B_MARK, 532 + MSIOF2_TXD_C_MARK, GLO_I1_D_MARK, 533 + SSI_SDATA1_MARK, SDA1_B_MARK, SDA8_B_MARK, MSIOF2_RXD_C_MARK, 534 + SSI_SCK2_MARK, SCL2_MARK, GPS_CLK_B_MARK, GLO_Q0_D_MARK, HSCK1_E_MARK, 535 + SSI_WS2_MARK, SDA2_MARK, GPS_SIGN_B_MARK, RX2_E_MARK, 536 + GLO_Q1_D_MARK, HCTS1_N_E_MARK, 537 + SSI_SDATA2_MARK, GPS_MAG_B_MARK, TX2_E_MARK, HRTS1_N_E_MARK, 538 + SSI_SCK34_MARK, SSI_WS34_MARK, SSI_SDATA3_MARK, 539 + SSI_SCK4_MARK, GLO_SS_D_MARK, 540 + SSI_WS4_MARK, GLO_RFON_D_MARK, 541 + SSI_SDATA4_MARK, MSIOF2_SCK_D_MARK, 542 + SSI_SCK5_MARK, MSIOF1_SCK_C_MARK, TS_SDATA0_MARK, GLO_I0_MARK, 543 + MSIOF2_SYNC_D_MARK, VI1_R2_B_MARK, 544 + 545 + /* IPSR5 */ 546 + SSI_WS5_MARK, MSIOF1_SYNC_C_MARK, TS_SCK0_MARK, GLO_I1_MARK, 547 + MSIOF2_TXD_D_MARK, VI1_R3_B_MARK, 548 + SSI_SDATA5_MARK, MSIOF1_TXD_C_MARK, TS_SDEN0_MARK, GLO_Q0_MARK, 549 + MSIOF2_SS1_D_MARK, VI1_R4_B_MARK, 550 + SSI_SCK6_MARK, MSIOF1_RXD_C_MARK, TS_SPSYNC0_MARK, GLO_Q1_MARK, 551 + MSIOF2_RXD_D_MARK, VI1_R5_B_MARK, 552 + SSI_WS6_MARK, GLO_SCLK_MARK, MSIOF2_SS2_D_MARK, VI1_R6_B_MARK, 553 + SSI_SDATA6_MARK, STP_IVCXO27_0_B_MARK, GLO_SDATA_MARK, VI1_R7_B_MARK, 554 + SSI_SCK78_MARK, STP_ISCLK_0_B_MARK, GLO_SS_MARK, 555 + SSI_WS78_MARK, TX0_D_MARK, STP_ISD_0_B_MARK, GLO_RFON_MARK, 556 + SSI_SDATA7_MARK, RX0_D_MARK, STP_ISEN_0_B_MARK, 557 + SSI_SDATA8_MARK, TX1_D_MARK, STP_ISSYNC_0_B_MARK, 558 + SSI_SCK9_MARK, RX1_D_MARK, GLO_SCLK_D_MARK, 559 + SSI_WS9_MARK, TX3_D_MARK, CAN0_TX_D_MARK, GLO_SDATA_D_MARK, 560 + SSI_SDATA9_MARK, RX3_D_MARK, CAN0_RX_D_MARK, 561 + 562 + /* IPSR6 */ 563 + AUDIO_CLKB_MARK, STP_OPWM_0_B_MARK, MSIOF1_SCK_B_MARK, 564 + SCIF_CLK_MARK, BPFCLK_E_MARK, 565 + AUDIO_CLKC_MARK, SCIFB0_SCK_C_MARK, MSIOF1_SYNC_B_MARK, RX2_MARK, 566 + SCIFA2_RXD_MARK, FMIN_E_MARK, 567 + AUDIO_CLKOUT_MARK, MSIOF1_SS1_B_MARK, TX2_MARK, SCIFA2_TXD_MARK, 568 + IRQ0_MARK, SCIFB1_RXD_D_MARK, INTC_IRQ0_N_MARK, 569 + IRQ1_MARK, SCIFB1_SCK_C_MARK, INTC_IRQ1_N_MARK, 570 + IRQ2_MARK, SCIFB1_TXD_D_MARK, INTC_IRQ2_N_MARK, 571 + IRQ3_MARK, SCL4_C_MARK, MSIOF2_TXD_E_MARK, INTC_IRQ3_N_MARK, 572 + IRQ4_MARK, HRX1_C_MARK, SDA4_C_MARK, 573 + MSIOF2_RXD_E_MARK, INTC_IRQ4_N_MARK, 574 + IRQ5_MARK, HTX1_C_MARK, SCL1_E_MARK, MSIOF2_SCK_E_MARK, 575 + IRQ6_MARK, HSCK1_C_MARK, MSIOF1_SS2_B_MARK, 576 + SDA1_E_MARK, MSIOF2_SYNC_E_MARK, 577 + IRQ7_MARK, HCTS1_N_C_MARK, MSIOF1_TXD_B_MARK, 578 + GPS_CLK_C_MARK, GPS_CLK_D_MARK, 579 + IRQ8_MARK, HRTS1_N_C_MARK, MSIOF1_RXD_B_MARK, 580 + GPS_SIGN_C_MARK, GPS_SIGN_D_MARK, 581 + 582 + /* IPSR7 */ 583 + IRQ9_MARK, DU1_DOTCLKIN_B_MARK, CAN_CLK_D_MARK, GPS_MAG_C_MARK, 584 + SCIF_CLK_B_MARK, GPS_MAG_D_MARK, 585 + DU1_DR0_MARK, LCDOUT0_MARK, VI1_DATA0_B_MARK, TX0_B_MARK, 586 + SCIFA0_TXD_B_MARK, MSIOF2_SCK_B_MARK, 587 + DU1_DR1_MARK, LCDOUT1_MARK, VI1_DATA1_B_MARK, RX0_B_MARK, 588 + SCIFA0_RXD_B_MARK, MSIOF2_SYNC_B_MARK, 589 + DU1_DR2_MARK, LCDOUT2_MARK, SSI_SCK0129_B_MARK, 590 + DU1_DR3_MARK, LCDOUT3_MARK, SSI_WS0129_B_MARK, 591 + DU1_DR4_MARK, LCDOUT4_MARK, SSI_SDATA0_B_MARK, 592 + DU1_DR5_MARK, LCDOUT5_MARK, SSI_SCK1_B_MARK, 593 + DU1_DR6_MARK, LCDOUT6_MARK, SSI_WS1_B_MARK, 594 + DU1_DR7_MARK, LCDOUT7_MARK, SSI_SDATA1_B_MARK, 595 + DU1_DG0_MARK, LCDOUT8_MARK, VI1_DATA2_B_MARK, TX1_B_MARK, 596 + SCIFA1_TXD_B_MARK, MSIOF2_SS1_B_MARK, 597 + DU1_DG1_MARK, LCDOUT9_MARK, VI1_DATA3_B_MARK, RX1_B_MARK, 598 + SCIFA1_RXD_B_MARK, MSIOF2_SS2_B_MARK, 599 + DU1_DG2_MARK, LCDOUT10_MARK, VI1_DATA4_B_MARK, SCIF1_SCK_B_MARK, 600 + SCIFA1_SCK_MARK, SSI_SCK78_B_MARK, 601 + 602 + /* IPSR8 */ 603 + DU1_DG3_MARK, LCDOUT11_MARK, VI1_DATA5_B_MARK, SSI_WS78_B_MARK, 604 + DU1_DG4_MARK, LCDOUT12_MARK, VI1_DATA6_B_MARK, HRX0_B_MARK, 605 + SCIFB2_RXD_B_MARK, SSI_SDATA7_B_MARK, 606 + DU1_DG5_MARK, LCDOUT13_MARK, VI1_DATA7_B_MARK, HCTS0_N_B_MARK, 607 + SCIFB2_TXD_B_MARK, SSI_SDATA8_B_MARK, 608 + DU1_DG6_MARK, LCDOUT14_MARK, HRTS0_N_B_MARK, 609 + SCIFB2_CTS_N_B_MARK, SSI_SCK9_B_MARK, 610 + DU1_DG7_MARK, LCDOUT15_MARK, HTX0_B_MARK, 611 + SCIFB2_RTS_N_B_MARK, SSI_WS9_B_MARK, 612 + DU1_DB0_MARK, LCDOUT16_MARK, VI1_CLK_B_MARK, TX2_B_MARK, 613 + SCIFA2_TXD_B_MARK, MSIOF2_TXD_B_MARK, 614 + DU1_DB1_MARK, LCDOUT17_MARK, VI1_HSYNC_N_B_MARK, RX2_B_MARK, 615 + SCIFA2_RXD_B_MARK, MSIOF2_RXD_B_MARK, 616 + DU1_DB2_MARK, LCDOUT18_MARK, VI1_VSYNC_N_B_MARK, SCIF2_SCK_B_MARK, 617 + SCIFA2_SCK_MARK, SSI_SDATA9_B_MARK, 618 + DU1_DB3_MARK, LCDOUT19_MARK, VI1_CLKENB_B_MARK, 619 + DU1_DB4_MARK, LCDOUT20_MARK, VI1_FIELD_B_MARK, CAN1_RX_MARK, 620 + DU1_DB5_MARK, LCDOUT21_MARK, TX3_MARK, SCIFA3_TXD_MARK, CAN1_TX_MARK, 621 + 622 + /* IPSR9 */ 623 + DU1_DB6_MARK, LCDOUT22_MARK, SCL3_C_MARK, RX3_MARK, SCIFA3_RXD_MARK, 624 + DU1_DB7_MARK, LCDOUT23_MARK, SDA3_C_MARK, 625 + SCIF3_SCK_MARK, SCIFA3_SCK_MARK, 626 + DU1_DOTCLKIN_MARK, QSTVA_QVS_MARK, 627 + DU1_DOTCLKOUT0_MARK, QCLK_MARK, 628 + DU1_DOTCLKOUT1_MARK, QSTVB_QVE_MARK, CAN0_TX_MARK, 629 + TX3_B_MARK, SCL2_B_MARK, PWM4_MARK, 630 + DU1_EXHSYNC_DU1_HSYNC_MARK, QSTH_QHS_MARK, 631 + DU1_EXVSYNC_DU1_VSYNC_MARK, QSTB_QHE_MARK, 632 + DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK, QCPV_QDE_MARK, 633 + CAN0_RX_MARK, RX3_B_MARK, SDA2_B_MARK, 634 + DU1_DISP_MARK, QPOLA_MARK, 635 + DU1_CDE_MARK, QPOLB_MARK, PWM4_B_MARK, 636 + VI0_CLKENB_MARK, TX4_MARK, SCIFA4_TXD_MARK, TS_SDATA0_D_MARK, 637 + VI0_FIELD_MARK, RX4_MARK, SCIFA4_RXD_MARK, TS_SCK0_D_MARK, 638 + VI0_HSYNC_N_MARK, TX5_MARK, SCIFA5_TXD_MARK, TS_SDEN0_D_MARK, 639 + VI0_VSYNC_N_MARK, RX5_MARK, SCIFA5_RXD_MARK, TS_SPSYNC0_D_MARK, 640 + VI0_DATA3_VI0_B3_MARK, SCIF3_SCK_B_MARK, SCIFA3_SCK_B_MARK, 641 + VI0_G0_MARK, SCL8_MARK, STP_IVCXO27_0_C_MARK, SCL4_MARK, 642 + HCTS2_N_MARK, SCIFB2_CTS_N_MARK, ATAWR1_N_MARK, 643 + 644 + /* IPSR10 */ 645 + VI0_G1_MARK, SDA8_MARK, STP_ISCLK_0_C_MARK, SDA4_MARK, 646 + HRTS2_N_MARK, SCIFB2_RTS_N_MARK, ATADIR1_N_MARK, 647 + VI0_G2_MARK, VI2_HSYNC_N_MARK, STP_ISD_0_C_MARK, SCL3_B_MARK, 648 + HSCK2_MARK, SCIFB2_SCK_MARK, ATARD1_N_MARK, 649 + VI0_G3_MARK, VI2_VSYNC_N_MARK, STP_ISEN_0_C_MARK, SDA3_B_MARK, 650 + HRX2_MARK, SCIFB2_RXD_MARK, ATACS01_N_MARK, 651 + VI0_G4_MARK, VI2_CLKENB_MARK, STP_ISSYNC_0_C_MARK, 652 + HTX2_MARK, SCIFB2_TXD_MARK, SCIFB0_SCK_D_MARK, 653 + VI0_G5_MARK, VI2_FIELD_MARK, STP_OPWM_0_C_MARK, FMCLK_D_MARK, 654 + CAN0_TX_E_MARK, HTX1_D_MARK, SCIFB0_TXD_D_MARK, 655 + VI0_G6_MARK, VI2_CLK_MARK, BPFCLK_D_MARK, 656 + VI0_G7_MARK, VI2_DATA0_MARK, FMIN_D_MARK, 657 + VI0_R0_MARK, VI2_DATA1_MARK, GLO_I0_B_MARK, 658 + TS_SDATA0_C_MARK, ATACS11_N_MARK, 659 + VI0_R1_MARK, VI2_DATA2_MARK, GLO_I1_B_MARK, 660 + TS_SCK0_C_MARK, ATAG1_N_MARK, 661 + VI0_R2_MARK, VI2_DATA3_MARK, GLO_Q0_B_MARK, TS_SDEN0_C_MARK, 662 + VI0_R3_MARK, VI2_DATA4_MARK, GLO_Q1_B_MARK, TS_SPSYNC0_C_MARK, 663 + VI0_R4_MARK, VI2_DATA5_MARK, GLO_SCLK_B_MARK, TX0_C_MARK, SCL1_D_MARK, 664 + 665 + /* IPSR11 */ 666 + VI0_R5_MARK, VI2_DATA6_MARK, GLO_SDATA_B_MARK, RX0_C_MARK, SDA1_D_MARK, 667 + VI0_R6_MARK, VI2_DATA7_MARK, GLO_SS_B_MARK, TX1_C_MARK, SCL4_B_MARK, 668 + VI0_R7_MARK, GLO_RFON_B_MARK, RX1_C_MARK, CAN0_RX_E_MARK, 669 + SDA4_B_MARK, HRX1_D_MARK, SCIFB0_RXD_D_MARK, 670 + VI1_HSYNC_N_MARK, AVB_RXD0_MARK, TS_SDATA0_B_MARK, 671 + TX4_B_MARK, SCIFA4_TXD_B_MARK, 672 + VI1_VSYNC_N_MARK, AVB_RXD1_MARK, TS_SCK0_B_MARK, 673 + RX4_B_MARK, SCIFA4_RXD_B_MARK, 674 + VI1_CLKENB_MARK, AVB_RXD2_MARK, TS_SDEN0_B_MARK, 675 + VI1_FIELD_MARK, AVB_RXD3_MARK, TS_SPSYNC0_B_MARK, 676 + VI1_CLK_MARK, AVB_RXD4_MARK, VI1_DATA0_MARK, AVB_RXD5_MARK, 677 + VI1_DATA1_MARK, AVB_RXD6_MARK, VI1_DATA2_MARK, AVB_RXD7_MARK, 678 + VI1_DATA3_MARK, AVB_RX_ER_MARK, VI1_DATA4_MARK, AVB_MDIO_MARK, 679 + VI1_DATA5_MARK, AVB_RX_DV_MARK, VI1_DATA6_MARK, AVB_MAGIC_MARK, 680 + VI1_DATA7_MARK, AVB_MDC_MARK, 681 + ETH_MDIO_MARK, AVB_RX_CLK_MARK, SCL2_C_MARK, 682 + ETH_CRS_DV_MARK, AVB_LINK_MARK, SDA2_C_MARK, 683 + 684 + /* IPSR12 */ 685 + ETH_RX_ER_MARK, AVB_CRS_MARK, SCL3_MARK, SCL7_MARK, 686 + ETH_RXD0_MARK, AVB_PHY_INT_MARK, SDA3_MARK, SDA7_MARK, 687 + ETH_RXD1_MARK, AVB_GTXREFCLK_MARK, CAN0_TX_C_MARK, 688 + SCL2_D_MARK, MSIOF1_RXD_E_MARK, 689 + ETH_LINK_MARK, AVB_TXD0_MARK, CAN0_RX_C_MARK, 690 + SDA2_D_MARK, MSIOF1_SCK_E_MARK, 691 + ETH_REFCLK_MARK, AVB_TXD1_MARK, SCIFA3_RXD_B_MARK, 692 + CAN1_RX_C_MARK, MSIOF1_SYNC_E_MARK, 693 + ETH_TXD1_MARK, AVB_TXD2_MARK, SCIFA3_TXD_B_MARK, 694 + CAN1_TX_C_MARK, MSIOF1_TXD_E_MARK, 695 + ETH_TX_EN_MARK, AVB_TXD3_MARK, TCLK1_B_MARK, CAN_CLK_B_MARK, 696 + ETH_MAGIC_MARK, AVB_TXD4_MARK, IETX_C_MARK, 697 + ETH_TXD0_MARK, AVB_TXD5_MARK, IECLK_C_MARK, 698 + ETH_MDC_MARK, AVB_TXD6_MARK, IERX_C_MARK, 699 + STP_IVCXO27_0_MARK, AVB_TXD7_MARK, SCIFB2_TXD_D_MARK, 700 + ADIDATA_B_MARK, MSIOF0_SYNC_C_MARK, 701 + STP_ISCLK_0_MARK, AVB_TX_EN_MARK, SCIFB2_RXD_D_MARK, 702 + ADICS_SAMP_B_MARK, MSIOF0_SCK_C_MARK, 703 + 704 + /* IPSR13 */ 705 + STP_ISD_0_MARK, AVB_TX_ER_MARK, SCIFB2_SCK_C_MARK, 706 + ADICLK_B_MARK, MSIOF0_SS1_C_MARK, 707 + STP_ISEN_0_MARK, AVB_TX_CLK_MARK, ADICHS0_B_MARK, MSIOF0_SS2_C_MARK, 708 + STP_ISSYNC_0_MARK, AVB_COL_MARK, ADICHS1_B_MARK, MSIOF0_RXD_C_MARK, 709 + STP_OPWM_0_MARK, AVB_GTX_CLK_MARK, PWM0_B_MARK, 710 + ADICHS2_B_MARK, MSIOF0_TXD_C_MARK, 711 + SD0_CLK_MARK, SPCLK_B_MARK, SD0_CMD_MARK, MOSI_IO0_B_MARK, 712 + SD0_DATA0_MARK, MISO_IO1_B_MARK, SD0_DATA1_MARK, IO2_B_MARK, 713 + SD0_DATA2_MARK, IO3_B_MARK, SD0_DATA3_MARK, SSL_B_MARK, 714 + SD0_CD_MARK, MMC_D6_B_MARK, SIM0_RST_B_MARK, CAN0_RX_F_MARK, 715 + SCIFA5_TXD_B_MARK, TX3_C_MARK, 716 + SD0_WP_MARK, MMC_D7_B_MARK, SIM0_D_B_MARK, CAN0_TX_F_MARK, 717 + SCIFA5_RXD_B_MARK, RX3_C_MARK, 718 + SD1_CMD_MARK, REMOCON_B_MARK, SD1_DATA0_MARK, SPEEDIN_B_MARK, 719 + SD1_DATA1_MARK, IETX_B_MARK, SD1_DATA2_MARK, IECLK_B_MARK, 720 + SD1_DATA3_MARK, IERX_B_MARK, 721 + SD1_CD_MARK, PWM0_MARK, TPU_TO0_MARK, SCL1_C_MARK, 722 + 723 + /* IPSR14 */ 724 + SD1_WP_MARK, PWM1_B_MARK, SDA1_C_MARK, 725 + SD2_CLK_MARK, MMC_CLK_MARK, SD2_CMD_MARK, MMC_CMD_MARK, 726 + SD2_DATA0_MARK, MMC_D0_MARK, SD2_DATA1_MARK, MMC_D1_MARK, 727 + SD2_DATA2_MARK, MMC_D2_MARK, SD2_DATA3_MARK, MMC_D3_MARK, 728 + SD2_CD_MARK, MMC_D4_MARK, SCL8_C_MARK, TX5_B_MARK, SCIFA5_TXD_C_MARK, 729 + SD2_WP_MARK, MMC_D5_MARK, SDA8_C_MARK, RX5_B_MARK, SCIFA5_RXD_C_MARK, 730 + MSIOF0_SCK_MARK, RX2_C_MARK, ADIDATA_MARK, 731 + VI1_CLK_C_MARK, VI1_G0_B_MARK, 732 + MSIOF0_SYNC_MARK, TX2_C_MARK, ADICS_SAMP_MARK, 733 + VI1_CLKENB_C_MARK, VI1_G1_B_MARK, 734 + MSIOF0_TXD_MARK, ADICLK_MARK, VI1_FIELD_C_MARK, VI1_G2_B_MARK, 735 + MSIOF0_RXD_MARK, ADICHS0_MARK, VI1_DATA0_C_MARK, VI1_G3_B_MARK, 736 + MSIOF0_SS1_MARK, MMC_D6_MARK, ADICHS1_MARK, TX0_E_MARK, 737 + VI1_HSYNC_N_C_MARK, SCL7_C_MARK, VI1_G4_B_MARK, 738 + MSIOF0_SS2_MARK, MMC_D7_MARK, ADICHS2_MARK, RX0_E_MARK, 739 + VI1_VSYNC_N_C_MARK, SDA7_C_MARK, VI1_G5_B_MARK, 740 + 741 + /* IPSR15 */ 742 + SIM0_RST_MARK, IETX_MARK, CAN1_TX_D_MARK, 743 + SIM0_CLK_MARK, IECLK_MARK, CAN_CLK_C_MARK, 744 + SIM0_D_MARK, IERX_MARK, CAN1_RX_D_MARK, 745 + GPS_CLK_MARK, DU1_DOTCLKIN_C_MARK, AUDIO_CLKB_B_MARK, 746 + PWM5_B_MARK, SCIFA3_TXD_C_MARK, 747 + GPS_SIGN_MARK, TX4_C_MARK, SCIFA4_TXD_C_MARK, PWM5_MARK, 748 + VI1_G6_B_MARK, SCIFA3_RXD_C_MARK, 749 + GPS_MAG_MARK, RX4_C_MARK, SCIFA4_RXD_C_MARK, PWM6_MARK, 750 + VI1_G7_B_MARK, SCIFA3_SCK_C_MARK, 751 + HCTS0_N_MARK, SCIFB0_CTS_N_MARK, GLO_I0_C_MARK, 752 + TCLK1_MARK, VI1_DATA1_C_MARK, 753 + HRTS0_N_MARK, SCIFB0_RTS_N_MARK, GLO_I1_C_MARK, VI1_DATA2_C_MARK, 754 + HSCK0_MARK, SCIFB0_SCK_MARK, GLO_Q0_C_MARK, CAN_CLK_MARK, 755 + TCLK2_MARK, VI1_DATA3_C_MARK, 756 + HRX0_MARK, SCIFB0_RXD_MARK, GLO_Q1_C_MARK, 757 + CAN0_RX_B_MARK, VI1_DATA4_C_MARK, 758 + HTX0_MARK, SCIFB0_TXD_MARK, GLO_SCLK_C_MARK, 759 + CAN0_TX_B_MARK, VI1_DATA5_C_MARK, 760 + 761 + /* IPSR16 */ 762 + HRX1_MARK, SCIFB1_RXD_MARK, VI1_R0_B_MARK, 763 + GLO_SDATA_C_MARK, VI1_DATA6_C_MARK, 764 + HTX1_MARK, SCIFB1_TXD_MARK, VI1_R1_B_MARK, 765 + GLO_SS_C_MARK, VI1_DATA7_C_MARK, 766 + HSCK1_MARK, SCIFB1_SCK_MARK, MLB_CK_MARK, GLO_RFON_C_MARK, 767 + HCTS1_N_MARK, SCIFB1_CTS_N_MARK, MLB_SIG_MARK, CAN1_TX_B_MARK, 768 + HRTS1_N_MARK, SCIFB1_RTS_N_MARK, MLB_DAT_MARK, CAN1_RX_B_MARK, 769 + PINMUX_MARK_END, 770 + }; 771 + 772 + static const u16 pinmux_data[] = { 773 + PINMUX_DATA_GP_ALL(), /* PINMUX_DATA(GP_M_N_DATA, GP_M_N_FN...), */ 774 + 775 + PINMUX_DATA(EX_CS0_N_MARK, FN_EX_CS0_N), 776 + PINMUX_DATA(RD_N_MARK, FN_RD_N), 777 + PINMUX_DATA(AUDIO_CLKA_MARK, FN_AUDIO_CLKA), 778 + PINMUX_DATA(VI0_CLK_MARK, FN_VI0_CLK), 779 + PINMUX_DATA(VI0_DATA0_VI0_B0_MARK, FN_VI0_DATA0_VI0_B0), 780 + PINMUX_DATA(VI0_DATA1_VI0_B1_MARK, FN_VI0_DATA1_VI0_B1), 781 + PINMUX_DATA(VI0_DATA2_VI0_B2_MARK, FN_VI0_DATA2_VI0_B2), 782 + PINMUX_DATA(VI0_DATA4_VI0_B4_MARK, FN_VI0_DATA4_VI0_B4), 783 + PINMUX_DATA(VI0_DATA5_VI0_B5_MARK, FN_VI0_DATA5_VI0_B5), 784 + PINMUX_DATA(VI0_DATA6_VI0_B6_MARK, FN_VI0_DATA6_VI0_B6), 785 + PINMUX_DATA(VI0_DATA7_VI0_B7_MARK, FN_VI0_DATA7_VI0_B7), 786 + PINMUX_DATA(USB0_PWEN_MARK, FN_USB0_PWEN), 787 + PINMUX_DATA(USB0_OVC_MARK, FN_USB0_OVC), 788 + PINMUX_DATA(USB1_PWEN_MARK, FN_USB1_PWEN), 789 + PINMUX_DATA(USB1_OVC_MARK, FN_USB1_OVC), 790 + PINMUX_DATA(DU0_DOTCLKIN_MARK, FN_DU0_DOTCLKIN), 791 + 792 + /* IPSR0 */ 793 + PINMUX_IPSR_DATA(IP0_0, D0), 794 + PINMUX_IPSR_DATA(IP0_1, D1), 795 + PINMUX_IPSR_DATA(IP0_2, D2), 796 + PINMUX_IPSR_DATA(IP0_3, D3), 797 + PINMUX_IPSR_DATA(IP0_4, D4), 798 + PINMUX_IPSR_DATA(IP0_5, D5), 799 + PINMUX_IPSR_DATA(IP0_6, D6), 800 + PINMUX_IPSR_DATA(IP0_7, D7), 801 + PINMUX_IPSR_DATA(IP0_8, D8), 802 + PINMUX_IPSR_DATA(IP0_9, D9), 803 + PINMUX_IPSR_DATA(IP0_10, D10), 804 + PINMUX_IPSR_DATA(IP0_11, D11), 805 + PINMUX_IPSR_DATA(IP0_12, D12), 806 + PINMUX_IPSR_DATA(IP0_13, D13), 807 + PINMUX_IPSR_DATA(IP0_14, D14), 808 + PINMUX_IPSR_DATA(IP0_15, D15), 809 + PINMUX_IPSR_DATA(IP0_18_16, A0), 810 + PINMUX_IPSR_MODSEL_DATA(IP0_18_16, ATAWR0_N_C, SEL_LBS_2), 811 + PINMUX_IPSR_MODSEL_DATA(IP0_18_16, MSIOF0_SCK_B, SEL_SOF0_1), 812 + PINMUX_IPSR_MODSEL_DATA(IP0_18_16, SCL0_C, SEL_IIC0_2), 813 + PINMUX_IPSR_DATA(IP0_18_16, PWM2_B), 814 + PINMUX_IPSR_DATA(IP0_20_19, A1), 815 + PINMUX_IPSR_MODSEL_DATA(IP0_20_19, MSIOF0_SYNC_B, SEL_SOF0_1), 816 + PINMUX_IPSR_DATA(IP0_22_21, A2), 817 + PINMUX_IPSR_MODSEL_DATA(IP0_22_21, MSIOF0_SS1_B, SEL_SOF0_1), 818 + PINMUX_IPSR_DATA(IP0_24_23, A3), 819 + PINMUX_IPSR_MODSEL_DATA(IP0_24_23, MSIOF0_SS2_B, SEL_SOF0_1), 820 + PINMUX_IPSR_DATA(IP0_26_25, A4), 821 + PINMUX_IPSR_MODSEL_DATA(IP0_26_25, MSIOF0_TXD_B, SEL_SOF0_1), 822 + PINMUX_IPSR_DATA(IP0_28_27, A5), 823 + PINMUX_IPSR_MODSEL_DATA(IP0_28_27, MSIOF0_RXD_B, SEL_SOF0_1), 824 + PINMUX_IPSR_DATA(IP0_30_29, A6), 825 + PINMUX_IPSR_MODSEL_DATA(IP0_30_29, MSIOF1_SCK, SEL_SOF1_0), 826 + 827 + /* IPSR1 */ 828 + PINMUX_IPSR_DATA(IP1_1_0, A7), 829 + PINMUX_IPSR_MODSEL_DATA(IP1_1_0, MSIOF1_SYNC, SEL_SOF1_0), 830 + PINMUX_IPSR_DATA(IP1_3_2, A8), 831 + PINMUX_IPSR_MODSEL_DATA(IP1_3_2, MSIOF1_SS1, SEL_SOF1_0), 832 + PINMUX_IPSR_MODSEL_DATA(IP1_3_2, SCL0, SEL_IIC0_0), 833 + PINMUX_IPSR_DATA(IP1_5_4, A9), 834 + PINMUX_IPSR_MODSEL_DATA(IP1_5_4, MSIOF1_SS2, SEL_SOF1_0), 835 + PINMUX_IPSR_MODSEL_DATA(IP1_5_4, SDA0, SEL_IIC0_0), 836 + PINMUX_IPSR_DATA(IP1_7_6, A10), 837 + PINMUX_IPSR_MODSEL_DATA(IP1_7_6, MSIOF1_TXD, SEL_SOF1_0), 838 + PINMUX_IPSR_MODSEL_DATA(IP1_7_6, MSIOF1_TXD_D, SEL_SOF1_3), 839 + PINMUX_IPSR_DATA(IP1_10_8, A11), 840 + PINMUX_IPSR_MODSEL_DATA(IP1_10_8, MSIOF1_RXD, SEL_SOF1_0), 841 + PINMUX_IPSR_MODSEL_DATA(IP1_10_8, SCL3_D, SEL_IIC3_3), 842 + PINMUX_IPSR_MODSEL_DATA(IP1_10_8, MSIOF1_RXD_D, SEL_SOF1_3), 843 + PINMUX_IPSR_DATA(IP1_13_11, A12), 844 + PINMUX_IPSR_MODSEL_DATA(IP1_13_11, FMCLK, SEL_FM_0), 845 + PINMUX_IPSR_MODSEL_DATA(IP1_13_11, SDA3_D, SEL_IIC3_3), 846 + PINMUX_IPSR_MODSEL_DATA(IP1_13_11, MSIOF1_SCK_D, SEL_SOF1_3), 847 + PINMUX_IPSR_DATA(IP1_16_14, A13), 848 + PINMUX_IPSR_MODSEL_DATA(IP1_16_14, ATAG0_N_C, SEL_LBS_2), 849 + PINMUX_IPSR_MODSEL_DATA(IP1_16_14, BPFCLK, SEL_FM_0), 850 + PINMUX_IPSR_MODSEL_DATA(IP1_16_14, MSIOF1_SS1_D, SEL_SOF1_3), 851 + PINMUX_IPSR_DATA(IP1_19_17, A14), 852 + PINMUX_IPSR_MODSEL_DATA(IP1_19_17, ATADIR0_N_C, SEL_LBS_2), 853 + PINMUX_IPSR_MODSEL_DATA(IP1_19_17, FMIN, SEL_FM_0), 854 + PINMUX_IPSR_MODSEL_DATA(IP1_19_17, FMIN_C, SEL_FM_2), 855 + PINMUX_IPSR_MODSEL_DATA(IP1_19_17, MSIOF1_SYNC_D, SEL_SOF1_3), 856 + PINMUX_IPSR_DATA(IP1_22_20, A15), 857 + PINMUX_IPSR_MODSEL_DATA(IP1_22_20, BPFCLK_C, SEL_FM_2), 858 + PINMUX_IPSR_DATA(IP1_25_23, A16), 859 + PINMUX_IPSR_MODSEL_DATA(IP1_25_23, DREQ2_B, SEL_LBS_1), 860 + PINMUX_IPSR_MODSEL_DATA(IP1_25_23, FMCLK_C, SEL_FM_2), 861 + PINMUX_IPSR_MODSEL_DATA(IP1_25_23, SCIFA1_SCK_B, SEL_SCIFA1_1), 862 + PINMUX_IPSR_DATA(IP1_28_26, A17), 863 + PINMUX_IPSR_MODSEL_DATA(IP1_28_26, DACK2_B, SEL_LBS_1), 864 + PINMUX_IPSR_MODSEL_DATA(IP1_28_26, SDA0_C, SEL_IIC0_2), 865 + PINMUX_IPSR_DATA(IP1_31_29, A18), 866 + PINMUX_IPSR_MODSEL_DATA(IP1_31_29, DREQ1, SEL_LBS_0), 867 + PINMUX_IPSR_MODSEL_DATA(IP1_31_29, SCIFA1_RXD_C, SEL_SCIFA1_2), 868 + PINMUX_IPSR_MODSEL_DATA(IP1_31_29, SCIFB1_RXD_C, SEL_SCIFB1_2), 869 + 870 + /* IPSR2 */ 871 + PINMUX_IPSR_DATA(IP2_2_0, A19), 872 + PINMUX_IPSR_DATA(IP2_2_0, DACK1), 873 + PINMUX_IPSR_MODSEL_DATA(IP2_2_0, SCIFA1_TXD_C, SEL_SCIFA1_2), 874 + PINMUX_IPSR_MODSEL_DATA(IP2_2_0, SCIFB1_TXD_C, SEL_SCIFB1_2), 875 + PINMUX_IPSR_MODSEL_DATA(IP2_2_0, SCIFB1_SCK_B, SEL_SCIFB1_0), 876 + PINMUX_IPSR_DATA(IP2_2_0, A20), 877 + PINMUX_IPSR_MODSEL_DATA(IP2_4_3, SPCLK, SEL_QSP_0), 878 + PINMUX_IPSR_DATA(IP2_6_5, A21), 879 + PINMUX_IPSR_MODSEL_DATA(IP2_6_5, ATAWR0_N_B, SEL_LBS_1), 880 + PINMUX_IPSR_MODSEL_DATA(IP2_6_5, MOSI_IO0, SEL_QSP_0), 881 + PINMUX_IPSR_DATA(IP2_9_7, A22), 882 + PINMUX_IPSR_MODSEL_DATA(IP2_9_7, MISO_IO1, SEL_QSP_0), 883 + PINMUX_IPSR_MODSEL_DATA(IP2_9_7, FMCLK_B, SEL_FM_1), 884 + PINMUX_IPSR_MODSEL_DATA(IP2_9_7, TX0, SEL_SCIF0_0), 885 + PINMUX_IPSR_MODSEL_DATA(IP2_9_7, SCIFA0_TXD, SEL_SCFA_0), 886 + PINMUX_IPSR_DATA(IP2_12_10, A23), 887 + PINMUX_IPSR_MODSEL_DATA(IP2_12_10, IO2, SEL_QSP_0), 888 + PINMUX_IPSR_MODSEL_DATA(IP2_12_10, BPFCLK_B, SEL_FM_1), 889 + PINMUX_IPSR_MODSEL_DATA(IP2_12_10, RX0, SEL_SCIF0_0), 890 + PINMUX_IPSR_MODSEL_DATA(IP2_12_10, SCIFA0_RXD, SEL_SCFA_0), 891 + PINMUX_IPSR_DATA(IP2_15_13, A24), 892 + PINMUX_IPSR_MODSEL_DATA(IP2_15_13, DREQ2, SEL_LBS_0), 893 + PINMUX_IPSR_MODSEL_DATA(IP2_15_13, IO3, SEL_QSP_0), 894 + PINMUX_IPSR_MODSEL_DATA(IP2_15_13, TX1, SEL_SCIF1_0), 895 + PINMUX_IPSR_MODSEL_DATA(IP2_15_13, SCIFA1_TXD, SEL_SCIFA1_0), 896 + PINMUX_IPSR_DATA(IP2_18_16, A25), 897 + PINMUX_IPSR_MODSEL_DATA(IP2_18_16, DACK2, SEL_LBS_0), 898 + PINMUX_IPSR_MODSEL_DATA(IP2_18_16, SSL, SEL_QSP_0), 899 + PINMUX_IPSR_MODSEL_DATA(IP2_18_16, DREQ1_C, SEL_LBS_2), 900 + PINMUX_IPSR_MODSEL_DATA(IP2_18_16, RX1, SEL_SCIF1_0), 901 + PINMUX_IPSR_MODSEL_DATA(IP2_18_16, SCIFA1_RXD, SEL_SCIFA1_0), 902 + PINMUX_IPSR_DATA(IP2_20_19, CS0_N), 903 + PINMUX_IPSR_MODSEL_DATA(IP2_20_19, ATAG0_N_B, SEL_LBS_1), 904 + PINMUX_IPSR_MODSEL_DATA(IP2_20_19, SCL1, SEL_IIC1_0), 905 + PINMUX_IPSR_DATA(IP2_22_21, CS1_N_A26), 906 + PINMUX_IPSR_MODSEL_DATA(IP2_22_21, ATADIR0_N_B, SEL_LBS_1), 907 + PINMUX_IPSR_MODSEL_DATA(IP2_22_21, SDA1, SEL_IIC1_0), 908 + PINMUX_IPSR_DATA(IP2_24_23, EX_CS1_N), 909 + PINMUX_IPSR_MODSEL_DATA(IP2_24_23, MSIOF2_SCK, SEL_SOF2_0), 910 + PINMUX_IPSR_DATA(IP2_26_25, EX_CS2_N), 911 + PINMUX_IPSR_MODSEL_DATA(IP2_26_25, ATAWR0_N, SEL_LBS_0), 912 + PINMUX_IPSR_MODSEL_DATA(IP2_26_25, MSIOF2_SYNC, SEL_SOF2_0), 913 + PINMUX_IPSR_DATA(IP2_29_27, EX_CS3_N), 914 + PINMUX_IPSR_MODSEL_DATA(IP2_29_27, ATADIR0_N, SEL_LBS_0), 915 + PINMUX_IPSR_MODSEL_DATA(IP2_29_27, MSIOF2_TXD, SEL_SOF2_0), 916 + PINMUX_IPSR_MODSEL_DATA(IP2_29_27, ATAG0_N, SEL_LBS_0), 917 + PINMUX_IPSR_DATA(IP2_29_27, EX_WAIT1), 918 + 919 + /* IPSR3 */ 920 + PINMUX_IPSR_DATA(IP3_2_0, EX_CS4_N), 921 + PINMUX_IPSR_MODSEL_DATA(IP3_2_0, ATARD0_N, SEL_LBS_0), 922 + PINMUX_IPSR_MODSEL_DATA(IP3_2_0, MSIOF2_RXD, SEL_SOF2_0), 923 + PINMUX_IPSR_DATA(IP3_2_0, EX_WAIT2), 924 + PINMUX_IPSR_DATA(IP3_5_3, EX_CS5_N), 925 + PINMUX_IPSR_DATA(IP3_5_3, ATACS00_N), 926 + PINMUX_IPSR_MODSEL_DATA(IP3_5_3, MSIOF2_SS1, SEL_SOF2_0), 927 + PINMUX_IPSR_MODSEL_DATA(IP3_5_3, HRX1_B, SEL_HSCIF1_1), 928 + PINMUX_IPSR_MODSEL_DATA(IP3_5_3, SCIFB1_RXD_B, SEL_SCIFB1_1), 929 + PINMUX_IPSR_DATA(IP3_5_3, PWM1), 930 + PINMUX_IPSR_DATA(IP3_5_3, TPU_TO1), 931 + PINMUX_IPSR_DATA(IP3_8_6, BS_N), 932 + PINMUX_IPSR_DATA(IP3_8_6, ATACS10_N), 933 + PINMUX_IPSR_MODSEL_DATA(IP3_8_6, MSIOF2_SS2, SEL_SOF2_0), 934 + PINMUX_IPSR_MODSEL_DATA(IP3_8_6, HTX1_B, SEL_HSCIF1_1), 935 + PINMUX_IPSR_MODSEL_DATA(IP3_8_6, SCIFB1_TXD_B, SEL_SCIFB1_1), 936 + PINMUX_IPSR_DATA(IP3_8_6, PWM2), 937 + PINMUX_IPSR_DATA(IP3_8_6, TPU_TO2), 938 + PINMUX_IPSR_DATA(IP3_11_9, RD_WR_N), 939 + PINMUX_IPSR_MODSEL_DATA(IP3_11_9, HRX2_B, SEL_HSCIF2_1), 940 + PINMUX_IPSR_MODSEL_DATA(IP3_11_9, FMIN_B, SEL_FM_1), 941 + PINMUX_IPSR_MODSEL_DATA(IP3_11_9, SCIFB0_RXD_B, SEL_SCIFB_1), 942 + PINMUX_IPSR_MODSEL_DATA(IP3_11_9, DREQ1_D, SEL_LBS_1), 943 + PINMUX_IPSR_DATA(IP3_13_12, WE0_N), 944 + PINMUX_IPSR_MODSEL_DATA(IP3_13_12, HCTS2_N_B, SEL_HSCIF2_1), 945 + PINMUX_IPSR_MODSEL_DATA(IP3_13_12, SCIFB0_TXD_B, SEL_SCIFB_1), 946 + PINMUX_IPSR_DATA(IP3_15_14, WE1_N), 947 + PINMUX_IPSR_MODSEL_DATA(IP3_15_14, ATARD0_N_B, SEL_LBS_1), 948 + PINMUX_IPSR_MODSEL_DATA(IP3_15_14, HTX2_B, SEL_HSCIF2_1), 949 + PINMUX_IPSR_MODSEL_DATA(IP3_15_14, SCIFB0_RTS_N_B, SEL_SCIFB_1), 950 + PINMUX_IPSR_DATA(IP3_17_16, EX_WAIT0), 951 + PINMUX_IPSR_MODSEL_DATA(IP3_17_16, HRTS2_N_B, SEL_HSCIF2_1), 952 + PINMUX_IPSR_MODSEL_DATA(IP3_17_16, SCIFB0_CTS_N_B, SEL_SCIFB_1), 953 + PINMUX_IPSR_DATA(IP3_19_18, DREQ0), 954 + PINMUX_IPSR_DATA(IP3_19_18, PWM3), 955 + PINMUX_IPSR_DATA(IP3_19_18, TPU_TO3), 956 + PINMUX_IPSR_DATA(IP3_21_20, DACK0), 957 + PINMUX_IPSR_DATA(IP3_21_20, DRACK0), 958 + PINMUX_IPSR_MODSEL_DATA(IP3_21_20, REMOCON, SEL_RCN_0), 959 + PINMUX_IPSR_MODSEL_DATA(IP3_24_22, SPEEDIN, SEL_RSP_0), 960 + PINMUX_IPSR_MODSEL_DATA(IP3_24_22, HSCK0_C, SEL_HSCIF0_2), 961 + PINMUX_IPSR_MODSEL_DATA(IP3_24_22, HSCK2_C, SEL_HSCIF2_2), 962 + PINMUX_IPSR_MODSEL_DATA(IP3_24_22, SCIFB0_SCK_B, SEL_SCIFB_1), 963 + PINMUX_IPSR_MODSEL_DATA(IP3_24_22, SCIFB2_SCK_B, SEL_SCIFB2_1), 964 + PINMUX_IPSR_MODSEL_DATA(IP3_24_22, DREQ2_C, SEL_LBS_2), 965 + PINMUX_IPSR_MODSEL_DATA(IP3_30_28, HTX2_C, SEL_HSCIF2_2), 966 + PINMUX_IPSR_MODSEL_DATA(IP3_27_25, SSI_SCK0129, SEL_SSI0_0), 967 + PINMUX_IPSR_MODSEL_DATA(IP3_27_25, HRX0_C, SEL_HSCIF0_2), 968 + PINMUX_IPSR_MODSEL_DATA(IP3_27_25, HRX2_C, SEL_HSCIF2_2), 969 + PINMUX_IPSR_MODSEL_DATA(IP3_27_25, SCIFB0_RXD_C, SEL_SCIFB_2), 970 + PINMUX_IPSR_MODSEL_DATA(IP3_27_25, SCIFB2_RXD_C, SEL_SCIFB2_2), 971 + PINMUX_IPSR_MODSEL_DATA(IP3_30_28, SSI_WS0129, SEL_SSI0_0), 972 + PINMUX_IPSR_MODSEL_DATA(IP3_30_28, HTX0_C, SEL_HSCIF0_2), 973 + PINMUX_IPSR_MODSEL_DATA(IP3_30_28, HTX2_C, SEL_HSCIF2_2), 974 + PINMUX_IPSR_MODSEL_DATA(IP3_30_28, SCIFB0_TXD_C, SEL_SCIFB_2), 975 + PINMUX_IPSR_MODSEL_DATA(IP3_30_28, SCIFB2_TXD_C, SEL_SCIFB2_2), 976 + 977 + /* IPSR4 */ 978 + PINMUX_IPSR_MODSEL_DATA(IP4_1_0, SSI_SDATA0, SEL_SSI0_0), 979 + PINMUX_IPSR_MODSEL_DATA(IP4_1_0, SCL0_B, SEL_IIC0_1), 980 + PINMUX_IPSR_MODSEL_DATA(IP4_1_0, SCL7_B, SEL_IIC7_1), 981 + PINMUX_IPSR_MODSEL_DATA(IP4_1_0, MSIOF2_SCK_C, SEL_SOF2_2), 982 + PINMUX_IPSR_MODSEL_DATA(IP4_4_2, SSI_SCK1, SEL_SSI1_0), 983 + PINMUX_IPSR_MODSEL_DATA(IP4_4_2, SDA0_B, SEL_IIC0_1), 984 + PINMUX_IPSR_MODSEL_DATA(IP4_4_2, SDA7_B, SEL_IIC7_1), 985 + PINMUX_IPSR_MODSEL_DATA(IP4_4_2, MSIOF2_SYNC_C, SEL_SOF2_2), 986 + PINMUX_IPSR_MODSEL_DATA(IP4_4_2, GLO_I0_D, SEL_GPS_3), 987 + PINMUX_IPSR_MODSEL_DATA(IP4_7_5, SSI_WS1, SEL_SSI1_0), 988 + PINMUX_IPSR_MODSEL_DATA(IP4_7_5, SCL1_B, SEL_IIC1_1), 989 + PINMUX_IPSR_MODSEL_DATA(IP4_7_5, SCL8_B, SEL_IIC8_1), 990 + PINMUX_IPSR_MODSEL_DATA(IP4_7_5, MSIOF2_TXD_C, SEL_SOF2_2), 991 + PINMUX_IPSR_MODSEL_DATA(IP4_7_5, GLO_I1_D, SEL_GPS_3), 992 + PINMUX_IPSR_MODSEL_DATA(IP4_9_8, SSI_SDATA1, SEL_SSI1_0), 993 + PINMUX_IPSR_MODSEL_DATA(IP4_9_8, SDA1_B, SEL_IIC1_1), 994 + PINMUX_IPSR_MODSEL_DATA(IP4_9_8, SDA8_B, SEL_IIC8_1), 995 + PINMUX_IPSR_MODSEL_DATA(IP4_9_8, MSIOF2_RXD_C, SEL_SOF2_2), 996 + PINMUX_IPSR_DATA(IP4_12_10, SSI_SCK2), 997 + PINMUX_IPSR_MODSEL_DATA(IP4_12_10, SCL2, SEL_IIC2_0), 998 + PINMUX_IPSR_MODSEL_DATA(IP4_12_10, GPS_CLK_B, SEL_GPS_1), 999 + PINMUX_IPSR_MODSEL_DATA(IP4_12_10, GLO_Q0_D, SEL_GPS_3), 1000 + PINMUX_IPSR_DATA(IP4_15_13, SSI_WS2), 1001 + PINMUX_IPSR_MODSEL_DATA(IP4_15_13, SDA2, SEL_IIC2_0), 1002 + PINMUX_IPSR_MODSEL_DATA(IP4_15_13, GPS_SIGN_B, SEL_GPS_1), 1003 + PINMUX_IPSR_MODSEL_DATA(IP4_15_13, RX2_E, SEL_SCIF2_4), 1004 + PINMUX_IPSR_MODSEL_DATA(IP4_15_13, GLO_Q1_D, SEL_GPS_3), 1005 + PINMUX_IPSR_DATA(IP4_18_16, SSI_SDATA2), 1006 + PINMUX_IPSR_MODSEL_DATA(IP4_18_16, GPS_MAG_B, SEL_GPS_1), 1007 + PINMUX_IPSR_MODSEL_DATA(IP4_18_16, TX2_E, SEL_SCIF2_4), 1008 + PINMUX_IPSR_DATA(IP4_19, SSI_SCK34), 1009 + PINMUX_IPSR_DATA(IP4_20, SSI_WS34), 1010 + PINMUX_IPSR_DATA(IP4_21, SSI_SDATA3), 1011 + PINMUX_IPSR_DATA(IP4_23_22, SSI_SCK4), 1012 + PINMUX_IPSR_MODSEL_DATA(IP4_23_22, GLO_SS_D, SEL_GPS_3), 1013 + PINMUX_IPSR_DATA(IP4_25_24, SSI_WS4), 1014 + PINMUX_IPSR_MODSEL_DATA(IP4_25_24, GLO_RFON_D, SEL_GPS_3), 1015 + PINMUX_IPSR_DATA(IP4_27_26, SSI_SDATA4), 1016 + PINMUX_IPSR_MODSEL_DATA(IP4_27_26, MSIOF2_SCK_D, SEL_SOF2_3), 1017 + PINMUX_IPSR_DATA(IP4_30_28, SSI_SCK5), 1018 + PINMUX_IPSR_MODSEL_DATA(IP4_30_28, MSIOF1_SCK_C, SEL_SOF1_2), 1019 + PINMUX_IPSR_MODSEL_DATA(IP4_30_28, TS_SDATA0, SEL_TSIF0_0), 1020 + PINMUX_IPSR_MODSEL_DATA(IP4_30_28, GLO_I0, SEL_GPS_0), 1021 + PINMUX_IPSR_MODSEL_DATA(IP4_30_28, MSIOF2_SYNC_D, SEL_SOF2_3), 1022 + PINMUX_IPSR_DATA(IP4_30_28, VI1_R2_B), 1023 + 1024 + /* IPSR5 */ 1025 + PINMUX_IPSR_DATA(IP5_2_0, SSI_WS5), 1026 + PINMUX_IPSR_MODSEL_DATA(IP5_2_0, MSIOF1_SYNC_C, SEL_SOF1_2), 1027 + PINMUX_IPSR_MODSEL_DATA(IP5_2_0, TS_SCK0, SEL_TSIF0_0), 1028 + PINMUX_IPSR_MODSEL_DATA(IP5_2_0, GLO_I1, SEL_GPS_0), 1029 + PINMUX_IPSR_MODSEL_DATA(IP5_2_0, MSIOF2_TXD_D, SEL_SOF2_3), 1030 + PINMUX_IPSR_DATA(IP5_2_0, VI1_R3_B), 1031 + PINMUX_IPSR_DATA(IP5_5_3, SSI_SDATA5), 1032 + PINMUX_IPSR_MODSEL_DATA(IP5_5_3, MSIOF1_TXD_C, SEL_SOF1_2), 1033 + PINMUX_IPSR_MODSEL_DATA(IP5_5_3, TS_SDEN0, SEL_TSIF0_0), 1034 + PINMUX_IPSR_MODSEL_DATA(IP5_5_3, GLO_Q0, SEL_GPS_0), 1035 + PINMUX_IPSR_MODSEL_DATA(IP5_5_3, MSIOF2_SS1_D, SEL_SOF2_3), 1036 + PINMUX_IPSR_DATA(IP5_5_3, VI1_R4_B), 1037 + PINMUX_IPSR_DATA(IP5_8_6, SSI_SCK6), 1038 + PINMUX_IPSR_MODSEL_DATA(IP5_8_6, MSIOF1_RXD_C, SEL_SOF1_2), 1039 + PINMUX_IPSR_MODSEL_DATA(IP5_8_6, TS_SPSYNC0, SEL_TSIF0_0), 1040 + PINMUX_IPSR_MODSEL_DATA(IP5_8_6, GLO_Q1, SEL_GPS_0), 1041 + PINMUX_IPSR_MODSEL_DATA(IP5_8_6, MSIOF2_RXD_D, SEL_SOF2_3), 1042 + PINMUX_IPSR_DATA(IP5_8_6, VI1_R5_B), 1043 + PINMUX_IPSR_DATA(IP5_11_9, SSI_WS6), 1044 + PINMUX_IPSR_MODSEL_DATA(IP5_11_9, GLO_SCLK, SEL_GPS_0), 1045 + PINMUX_IPSR_MODSEL_DATA(IP5_11_9, MSIOF2_SS2_D, SEL_SOF2_3), 1046 + PINMUX_IPSR_DATA(IP5_11_9, VI1_R6_B), 1047 + PINMUX_IPSR_DATA(IP5_14_12, SSI_SDATA6), 1048 + PINMUX_IPSR_MODSEL_DATA(IP5_14_12, STP_IVCXO27_0_B, SEL_SSP_1), 1049 + PINMUX_IPSR_MODSEL_DATA(IP5_14_12, GLO_SDATA, SEL_GPS_0), 1050 + PINMUX_IPSR_DATA(IP5_14_12, VI1_R7_B), 1051 + PINMUX_IPSR_MODSEL_DATA(IP5_16_15, SSI_SCK78, SEL_SSI7_0), 1052 + PINMUX_IPSR_MODSEL_DATA(IP5_16_15, STP_ISCLK_0_B, SEL_SSP_1), 1053 + PINMUX_IPSR_MODSEL_DATA(IP5_16_15, GLO_SS, SEL_GPS_0), 1054 + PINMUX_IPSR_MODSEL_DATA(IP5_19_17, SSI_WS78, SEL_SSI7_0), 1055 + PINMUX_IPSR_MODSEL_DATA(IP5_19_17, TX0_D, SEL_SCIF0_3), 1056 + PINMUX_IPSR_MODSEL_DATA(IP5_19_17, STP_ISD_0_B, SEL_SSP_1), 1057 + PINMUX_IPSR_MODSEL_DATA(IP5_19_17, GLO_RFON, SEL_GPS_0), 1058 + PINMUX_IPSR_MODSEL_DATA(IP5_21_20, SSI_SDATA7, SEL_SSI7_0), 1059 + PINMUX_IPSR_MODSEL_DATA(IP5_21_20, RX0_D, SEL_SCIF0_3), 1060 + PINMUX_IPSR_MODSEL_DATA(IP5_21_20, STP_ISEN_0_B, SEL_SSP_1), 1061 + PINMUX_IPSR_MODSEL_DATA(IP5_23_22, SSI_SDATA8, SEL_SSI8_0), 1062 + PINMUX_IPSR_MODSEL_DATA(IP5_23_22, TX1_D, SEL_SCIF1_3), 1063 + PINMUX_IPSR_MODSEL_DATA(IP5_23_22, STP_ISSYNC_0_B, SEL_SSP_1), 1064 + PINMUX_IPSR_MODSEL_DATA(IP5_25_24, SSI_SCK9, SEL_SSI9_0), 1065 + PINMUX_IPSR_MODSEL_DATA(IP5_25_24, RX1_D, SEL_SCIF1_3), 1066 + PINMUX_IPSR_MODSEL_DATA(IP5_25_24, GLO_SCLK_D, SEL_GPS_3), 1067 + PINMUX_IPSR_MODSEL_DATA(IP5_28_26, SSI_WS9, SEL_SSI9_0), 1068 + PINMUX_IPSR_MODSEL_DATA(IP5_28_26, TX3_D, SEL_SCIF3_3), 1069 + PINMUX_IPSR_MODSEL_DATA(IP5_28_26, CAN0_TX_D, SEL_CAN0_3), 1070 + PINMUX_IPSR_MODSEL_DATA(IP5_28_26, GLO_SDATA_D, SEL_GPS_3), 1071 + PINMUX_IPSR_MODSEL_DATA(IP5_31_29, SSI_SDATA9, SEL_SSI9_0), 1072 + PINMUX_IPSR_MODSEL_DATA(IP5_31_29, RX3_D, SEL_SCIF3_3), 1073 + PINMUX_IPSR_MODSEL_DATA(IP5_31_29, CAN0_RX_D, SEL_CAN0_3), 1074 + 1075 + /* IPSR6 */ 1076 + PINMUX_IPSR_MODSEL_DATA(IP6_2_0, AUDIO_CLKB, SEL_ADG_0), 1077 + PINMUX_IPSR_MODSEL_DATA(IP6_2_0, STP_OPWM_0_B, SEL_SSP_1), 1078 + PINMUX_IPSR_MODSEL_DATA(IP6_2_0, MSIOF1_SCK_B, SEL_SOF1_1), 1079 + PINMUX_IPSR_MODSEL_DATA(IP6_2_0, SCIF_CLK, SEL_SCIF_0), 1080 + PINMUX_IPSR_MODSEL_DATA(IP6_2_0, BPFCLK_E, SEL_FM_4), 1081 + PINMUX_IPSR_DATA(IP6_5_3, AUDIO_CLKC), 1082 + PINMUX_IPSR_MODSEL_DATA(IP6_5_3, SCIFB0_SCK_C, SEL_SCIFB_2), 1083 + PINMUX_IPSR_MODSEL_DATA(IP6_5_3, MSIOF1_SYNC_B, SEL_SOF1_1), 1084 + PINMUX_IPSR_MODSEL_DATA(IP6_5_3, RX2, SEL_SCIF2_0), 1085 + PINMUX_IPSR_MODSEL_DATA(IP6_5_3, SCIFA2_RXD, SEL_SCIFA2_0), 1086 + PINMUX_IPSR_MODSEL_DATA(IP6_5_3, FMIN_E, SEL_FM_4), 1087 + PINMUX_IPSR_DATA(IP6_7_6, AUDIO_CLKOUT), 1088 + PINMUX_IPSR_MODSEL_DATA(IP6_7_6, MSIOF1_SS1_B, SEL_SOF1_1), 1089 + PINMUX_IPSR_MODSEL_DATA(IP6_5_3, TX2, SEL_SCIF2_0), 1090 + PINMUX_IPSR_MODSEL_DATA(IP6_7_6, SCIFA2_TXD, SEL_SCIFA2_0), 1091 + PINMUX_IPSR_DATA(IP6_9_8, IRQ0), 1092 + PINMUX_IPSR_MODSEL_DATA(IP6_9_8, SCIFB1_RXD_D, SEL_SCIFB1_3), 1093 + PINMUX_IPSR_DATA(IP6_9_8, INTC_IRQ0_N), 1094 + PINMUX_IPSR_DATA(IP6_11_10, IRQ1), 1095 + PINMUX_IPSR_MODSEL_DATA(IP6_11_10, SCIFB1_SCK_C, SEL_SCIFB1_2), 1096 + PINMUX_IPSR_DATA(IP6_11_10, INTC_IRQ1_N), 1097 + PINMUX_IPSR_DATA(IP6_13_12, IRQ2), 1098 + PINMUX_IPSR_MODSEL_DATA(IP6_13_12, SCIFB1_TXD_D, SEL_SCIFB1_3), 1099 + PINMUX_IPSR_DATA(IP6_13_12, INTC_IRQ2_N), 1100 + PINMUX_IPSR_DATA(IP6_15_14, IRQ3), 1101 + PINMUX_IPSR_MODSEL_DATA(IP6_15_14, SCL4_C, SEL_IIC4_2), 1102 + PINMUX_IPSR_MODSEL_DATA(IP6_15_14, MSIOF2_TXD_E, SEL_SOF2_4), 1103 + PINMUX_IPSR_DATA(IP6_15_14, INTC_IRQ4_N), 1104 + PINMUX_IPSR_DATA(IP6_18_16, IRQ4), 1105 + PINMUX_IPSR_MODSEL_DATA(IP6_18_16, HRX1_C, SEL_HSCIF1_2), 1106 + PINMUX_IPSR_MODSEL_DATA(IP6_18_16, SDA4_C, SEL_IIC4_2), 1107 + PINMUX_IPSR_MODSEL_DATA(IP6_18_16, MSIOF2_RXD_E, SEL_SOF2_4), 1108 + PINMUX_IPSR_DATA(IP6_18_16, INTC_IRQ4_N), 1109 + PINMUX_IPSR_DATA(IP6_20_19, IRQ5), 1110 + PINMUX_IPSR_MODSEL_DATA(IP6_20_19, HTX1_C, SEL_HSCIF1_2), 1111 + PINMUX_IPSR_MODSEL_DATA(IP6_20_19, SCL1_E, SEL_IIC1_4), 1112 + PINMUX_IPSR_MODSEL_DATA(IP6_20_19, MSIOF2_SCK_E, SEL_SOF2_4), 1113 + PINMUX_IPSR_DATA(IP6_23_21, IRQ6), 1114 + PINMUX_IPSR_MODSEL_DATA(IP6_23_21, HSCK1_C, SEL_HSCIF1_2), 1115 + PINMUX_IPSR_MODSEL_DATA(IP6_23_21, MSIOF1_SS2_B, SEL_SOF1_1), 1116 + PINMUX_IPSR_MODSEL_DATA(IP6_23_21, SDA1_E, SEL_IIC1_4), 1117 + PINMUX_IPSR_MODSEL_DATA(IP6_23_21, MSIOF2_SYNC_E, SEL_SOF2_4), 1118 + PINMUX_IPSR_DATA(IP6_26_24, IRQ7), 1119 + PINMUX_IPSR_MODSEL_DATA(IP6_26_24, HCTS1_N_C, SEL_HSCIF1_2), 1120 + PINMUX_IPSR_MODSEL_DATA(IP6_26_24, MSIOF1_TXD_B, SEL_SOF1_1), 1121 + PINMUX_IPSR_MODSEL_DATA(IP6_26_24, GPS_CLK_C, SEL_GPS_2), 1122 + PINMUX_IPSR_MODSEL_DATA(IP6_26_24, GPS_CLK_D, SEL_GPS_3), 1123 + PINMUX_IPSR_DATA(IP6_29_27, IRQ8), 1124 + PINMUX_IPSR_MODSEL_DATA(IP6_29_27, HRTS1_N_C, SEL_HSCIF1_2), 1125 + PINMUX_IPSR_MODSEL_DATA(IP6_29_27, MSIOF1_RXD_B, SEL_SOF1_1), 1126 + PINMUX_IPSR_MODSEL_DATA(IP6_29_27, GPS_SIGN_C, SEL_GPS_2), 1127 + PINMUX_IPSR_MODSEL_DATA(IP6_29_27, GPS_SIGN_D, SEL_GPS_3), 1128 + 1129 + /* IPSR7 */ 1130 + PINMUX_IPSR_DATA(IP7_2_0, IRQ9), 1131 + PINMUX_IPSR_MODSEL_DATA(IP7_2_0, DU1_DOTCLKIN_B, SEL_DIS_1), 1132 + PINMUX_IPSR_MODSEL_DATA(IP7_2_0, CAN_CLK_D, SEL_CANCLK_3), 1133 + PINMUX_IPSR_MODSEL_DATA(IP7_2_0, GPS_MAG_C, SEL_GPS_2), 1134 + PINMUX_IPSR_MODSEL_DATA(IP7_2_0, SCIF_CLK_B, SEL_SCIF_1), 1135 + PINMUX_IPSR_MODSEL_DATA(IP7_2_0, GPS_MAG_D, SEL_GPS_3), 1136 + PINMUX_IPSR_DATA(IP7_5_3, DU1_DR0), 1137 + PINMUX_IPSR_DATA(IP7_5_3, LCDOUT0), 1138 + PINMUX_IPSR_MODSEL_DATA(IP7_5_3, VI1_DATA0_B, SEL_VI1_1), 1139 + PINMUX_IPSR_MODSEL_DATA(IP7_5_3, TX0_B, SEL_SCIF0_1), 1140 + PINMUX_IPSR_MODSEL_DATA(IP7_5_3, SCIFA0_TXD_B, SEL_SCFA_1), 1141 + PINMUX_IPSR_MODSEL_DATA(IP7_5_3, MSIOF2_SCK_B, SEL_SOF2_1), 1142 + PINMUX_IPSR_DATA(IP7_8_6, DU1_DR1), 1143 + PINMUX_IPSR_DATA(IP7_8_6, LCDOUT1), 1144 + PINMUX_IPSR_MODSEL_DATA(IP7_8_6, VI1_DATA1_B, SEL_VI1_1), 1145 + PINMUX_IPSR_MODSEL_DATA(IP7_8_6, RX0_B, SEL_SCIF0_1), 1146 + PINMUX_IPSR_MODSEL_DATA(IP7_8_6, SCIFA0_RXD_B, SEL_SCFA_1), 1147 + PINMUX_IPSR_MODSEL_DATA(IP7_8_6, MSIOF2_SYNC_B, SEL_SOF2_1), 1148 + PINMUX_IPSR_DATA(IP7_10_9, DU1_DR2), 1149 + PINMUX_IPSR_DATA(IP7_10_9, LCDOUT2), 1150 + PINMUX_IPSR_MODSEL_DATA(IP7_10_9, SSI_SCK0129_B, SEL_SSI0_1), 1151 + PINMUX_IPSR_DATA(IP7_12_11, DU1_DR3), 1152 + PINMUX_IPSR_DATA(IP7_12_11, LCDOUT3), 1153 + PINMUX_IPSR_MODSEL_DATA(IP7_12_11, SSI_WS0129_B, SEL_SSI0_1), 1154 + PINMUX_IPSR_DATA(IP7_14_13, DU1_DR4), 1155 + PINMUX_IPSR_DATA(IP7_14_13, LCDOUT4), 1156 + PINMUX_IPSR_MODSEL_DATA(IP7_14_13, SSI_SDATA0_B, SEL_SSI0_1), 1157 + PINMUX_IPSR_DATA(IP7_16_15, DU1_DR5), 1158 + PINMUX_IPSR_DATA(IP7_16_15, LCDOUT5), 1159 + PINMUX_IPSR_MODSEL_DATA(IP7_16_15, SSI_SCK1_B, SEL_SSI1_1), 1160 + PINMUX_IPSR_DATA(IP7_18_17, DU1_DR6), 1161 + PINMUX_IPSR_DATA(IP7_18_17, LCDOUT6), 1162 + PINMUX_IPSR_MODSEL_DATA(IP7_18_17, SSI_WS1_B, SEL_SSI1_1), 1163 + PINMUX_IPSR_DATA(IP7_20_19, DU1_DR7), 1164 + PINMUX_IPSR_DATA(IP7_20_19, LCDOUT7), 1165 + PINMUX_IPSR_MODSEL_DATA(IP7_20_19, SSI_SDATA1_B, SEL_SSI1_1), 1166 + PINMUX_IPSR_DATA(IP7_23_21, DU1_DG0), 1167 + PINMUX_IPSR_DATA(IP7_23_21, LCDOUT8), 1168 + PINMUX_IPSR_MODSEL_DATA(IP7_23_21, VI1_DATA2_B, SEL_VI1_1), 1169 + PINMUX_IPSR_MODSEL_DATA(IP7_23_21, TX1_B, SEL_SCIF1_1), 1170 + PINMUX_IPSR_MODSEL_DATA(IP7_23_21, SCIFA1_TXD_B, SEL_SCIFA1_1), 1171 + PINMUX_IPSR_MODSEL_DATA(IP7_23_21, MSIOF2_SS1_B, SEL_SOF2_1), 1172 + PINMUX_IPSR_DATA(IP7_26_24, DU1_DG1), 1173 + PINMUX_IPSR_DATA(IP7_26_24, LCDOUT9), 1174 + PINMUX_IPSR_MODSEL_DATA(IP7_26_24, VI1_DATA3_B, SEL_VI1_1), 1175 + PINMUX_IPSR_MODSEL_DATA(IP7_26_24, RX1_B, SEL_SCIF1_1), 1176 + PINMUX_IPSR_MODSEL_DATA(IP7_26_24, SCIFA1_RXD_B, SEL_SCIFA1_1), 1177 + PINMUX_IPSR_MODSEL_DATA(IP7_26_24, MSIOF2_SS2_B, SEL_SOF2_1), 1178 + PINMUX_IPSR_DATA(IP7_29_27, DU1_DG2), 1179 + PINMUX_IPSR_DATA(IP7_29_27, LCDOUT10), 1180 + PINMUX_IPSR_MODSEL_DATA(IP7_29_27, VI1_DATA4_B, SEL_VI1_1), 1181 + PINMUX_IPSR_DATA(IP7_29_27, SCIF1_SCK_B), 1182 + PINMUX_IPSR_MODSEL_DATA(IP7_29_27, SCIFA1_SCK, SEL_SCIFA1_0), 1183 + PINMUX_IPSR_MODSEL_DATA(IP7_29_27, SSI_SCK78_B, SEL_SSI7_1), 1184 + 1185 + /* IPSR8 */ 1186 + PINMUX_IPSR_DATA(IP8_2_0, DU1_DG3), 1187 + PINMUX_IPSR_DATA(IP8_2_0, LCDOUT11), 1188 + PINMUX_IPSR_MODSEL_DATA(IP8_2_0, VI1_DATA5_B, SEL_VI1_1), 1189 + PINMUX_IPSR_MODSEL_DATA(IP8_2_0, SSI_WS78_B, SEL_SSI7_1), 1190 + PINMUX_IPSR_DATA(IP8_5_3, DU1_DG4), 1191 + PINMUX_IPSR_DATA(IP8_5_3, LCDOUT12), 1192 + PINMUX_IPSR_MODSEL_DATA(IP8_5_3, VI1_DATA6_B, SEL_VI1_1), 1193 + PINMUX_IPSR_MODSEL_DATA(IP8_5_3, HRX0_B, SEL_HSCIF0_1), 1194 + PINMUX_IPSR_MODSEL_DATA(IP8_5_3, SCIFB2_RXD_B, SEL_SCIFB2_1), 1195 + PINMUX_IPSR_MODSEL_DATA(IP8_5_3, SSI_SDATA7_B, SEL_SSI7_1), 1196 + PINMUX_IPSR_DATA(IP8_8_6, DU1_DG5), 1197 + PINMUX_IPSR_DATA(IP8_8_6, LCDOUT13), 1198 + PINMUX_IPSR_MODSEL_DATA(IP8_8_6, VI1_DATA7_B, SEL_VI1_1), 1199 + PINMUX_IPSR_MODSEL_DATA(IP8_8_6, HCTS0_N_B, SEL_HSCIF0_1), 1200 + PINMUX_IPSR_MODSEL_DATA(IP8_8_6, SCIFB2_TXD_B, SEL_SCIFB2_1), 1201 + PINMUX_IPSR_MODSEL_DATA(IP8_8_6, SSI_SDATA8_B, SEL_SSI8_1), 1202 + PINMUX_IPSR_DATA(IP8_11_9, DU1_DG6), 1203 + PINMUX_IPSR_DATA(IP8_11_9, LCDOUT14), 1204 + PINMUX_IPSR_MODSEL_DATA(IP8_11_9, HRTS0_N_B, SEL_HSCIF0_1), 1205 + PINMUX_IPSR_MODSEL_DATA(IP8_11_9, SCIFB2_CTS_N_B, SEL_SCIFB2_1), 1206 + PINMUX_IPSR_MODSEL_DATA(IP8_11_9, SSI_SCK9_B, SEL_SSI9_1), 1207 + PINMUX_IPSR_DATA(IP8_14_12, DU1_DG7), 1208 + PINMUX_IPSR_DATA(IP8_14_12, LCDOUT15), 1209 + PINMUX_IPSR_MODSEL_DATA(IP8_14_12, HTX0_B, SEL_HSCIF0_1), 1210 + PINMUX_IPSR_MODSEL_DATA(IP8_14_12, SCIFB2_RTS_N_B, SEL_SCIFB2_1), 1211 + PINMUX_IPSR_MODSEL_DATA(IP8_14_12, SSI_WS9_B, SEL_SSI9_1), 1212 + PINMUX_IPSR_DATA(IP8_17_15, DU1_DB0), 1213 + PINMUX_IPSR_DATA(IP8_17_15, LCDOUT16), 1214 + PINMUX_IPSR_MODSEL_DATA(IP8_17_15, VI1_CLK_B, SEL_VI1_1), 1215 + PINMUX_IPSR_MODSEL_DATA(IP8_17_15, TX2_B, SEL_SCIF2_1), 1216 + PINMUX_IPSR_MODSEL_DATA(IP8_17_15, SCIFA2_TXD_B, SEL_SCIFA2_1), 1217 + PINMUX_IPSR_MODSEL_DATA(IP8_17_15, MSIOF2_TXD_B, SEL_SOF2_1), 1218 + PINMUX_IPSR_DATA(IP8_20_18, DU1_DB1), 1219 + PINMUX_IPSR_DATA(IP8_20_18, LCDOUT17), 1220 + PINMUX_IPSR_MODSEL_DATA(IP8_20_18, VI1_HSYNC_N_B, SEL_VI1_1), 1221 + PINMUX_IPSR_MODSEL_DATA(IP8_20_18, RX2_B, SEL_SCIF2_1), 1222 + PINMUX_IPSR_MODSEL_DATA(IP8_20_18, SCIFA2_RXD_B, SEL_SCIFA2_1), 1223 + PINMUX_IPSR_MODSEL_DATA(IP8_20_18, MSIOF2_RXD_B, SEL_SOF2_1), 1224 + PINMUX_IPSR_DATA(IP8_23_21, DU1_DB2), 1225 + PINMUX_IPSR_DATA(IP8_23_21, LCDOUT18), 1226 + PINMUX_IPSR_MODSEL_DATA(IP8_23_21, VI1_VSYNC_N_B, SEL_VI1_1), 1227 + PINMUX_IPSR_DATA(IP8_23_21, SCIF2_SCK_B), 1228 + PINMUX_IPSR_MODSEL_DATA(IP8_23_21, SCIFA2_SCK, SEL_SCIFA2_1), 1229 + PINMUX_IPSR_MODSEL_DATA(IP8_23_21, SSI_SDATA9_B, SEL_SSI9_1), 1230 + PINMUX_IPSR_DATA(IP8_25_24, DU1_DB3), 1231 + PINMUX_IPSR_DATA(IP8_25_24, LCDOUT19), 1232 + PINMUX_IPSR_MODSEL_DATA(IP8_25_24, VI1_CLKENB_B, SEL_VI1_1), 1233 + PINMUX_IPSR_DATA(IP8_27_26, DU1_DB4), 1234 + PINMUX_IPSR_DATA(IP8_27_26, LCDOUT20), 1235 + PINMUX_IPSR_MODSEL_DATA(IP8_27_26, VI1_FIELD_B, SEL_VI1_1), 1236 + PINMUX_IPSR_MODSEL_DATA(IP8_27_26, CAN1_RX, SEL_CAN1_0), 1237 + PINMUX_IPSR_DATA(IP8_30_28, DU1_DB5), 1238 + PINMUX_IPSR_DATA(IP8_30_28, LCDOUT21), 1239 + PINMUX_IPSR_MODSEL_DATA(IP8_30_28, TX3, SEL_SCIF3_0), 1240 + PINMUX_IPSR_MODSEL_DATA(IP8_30_28, SCIFA3_TXD, SEL_SCIFA3_0), 1241 + PINMUX_IPSR_MODSEL_DATA(IP8_30_28, CAN1_TX, SEL_CAN1_0), 1242 + 1243 + /* IPSR9 */ 1244 + PINMUX_IPSR_DATA(IP9_2_0, DU1_DB6), 1245 + PINMUX_IPSR_DATA(IP9_2_0, LCDOUT22), 1246 + PINMUX_IPSR_MODSEL_DATA(IP9_2_0, SCL3_C, SEL_IIC3_2), 1247 + PINMUX_IPSR_MODSEL_DATA(IP9_2_0, RX3, SEL_SCIF3_0), 1248 + PINMUX_IPSR_MODSEL_DATA(IP9_2_0, SCIFA3_RXD, SEL_SCIFA3_0), 1249 + PINMUX_IPSR_DATA(IP9_5_3, DU1_DB7), 1250 + PINMUX_IPSR_DATA(IP9_5_3, LCDOUT23), 1251 + PINMUX_IPSR_MODSEL_DATA(IP9_5_3, SDA3_C, SEL_IIC3_2), 1252 + PINMUX_IPSR_MODSEL_DATA(IP9_5_3, SCIF3_SCK, SEL_SCIF3_0), 1253 + PINMUX_IPSR_MODSEL_DATA(IP9_5_3, SCIFA3_SCK, SEL_SCIFA3_0), 1254 + PINMUX_IPSR_MODSEL_DATA(IP9_6, DU1_DOTCLKIN, SEL_DIS_0), 1255 + PINMUX_IPSR_DATA(IP9_6, QSTVA_QVS), 1256 + PINMUX_IPSR_DATA(IP9_7, DU1_DOTCLKOUT0), 1257 + PINMUX_IPSR_DATA(IP9_7, QCLK), 1258 + PINMUX_IPSR_DATA(IP9_10_8, DU1_DOTCLKOUT1), 1259 + PINMUX_IPSR_DATA(IP9_10_8, QSTVB_QVE), 1260 + PINMUX_IPSR_MODSEL_DATA(IP9_10_8, CAN0_TX, SEL_CAN0_0), 1261 + PINMUX_IPSR_MODSEL_DATA(IP9_10_8, TX3_B, SEL_SCIF3_1), 1262 + PINMUX_IPSR_MODSEL_DATA(IP9_10_8, SCL2_B, SEL_IIC2_1), 1263 + PINMUX_IPSR_DATA(IP9_10_8, PWM4), 1264 + PINMUX_IPSR_DATA(IP9_11, DU1_EXHSYNC_DU1_HSYNC), 1265 + PINMUX_IPSR_DATA(IP9_11, QSTH_QHS), 1266 + PINMUX_IPSR_DATA(IP9_12, DU1_EXVSYNC_DU1_VSYNC), 1267 + PINMUX_IPSR_DATA(IP9_12, QSTB_QHE), 1268 + PINMUX_IPSR_DATA(IP9_15_13, DU1_EXODDF_DU1_ODDF_DISP_CDE), 1269 + PINMUX_IPSR_DATA(IP9_15_13, QCPV_QDE), 1270 + PINMUX_IPSR_MODSEL_DATA(IP9_15_13, CAN0_RX, SEL_CAN0_0), 1271 + PINMUX_IPSR_MODSEL_DATA(IP9_15_13, RX3_B, SEL_SCIF3_1), 1272 + PINMUX_IPSR_MODSEL_DATA(IP9_15_13, SDA2_B, SEL_IIC2_1), 1273 + PINMUX_IPSR_DATA(IP9_16, DU1_DISP), 1274 + PINMUX_IPSR_DATA(IP9_16, QPOLA), 1275 + PINMUX_IPSR_DATA(IP9_18_17, DU1_CDE), 1276 + PINMUX_IPSR_DATA(IP9_18_17, QPOLB), 1277 + PINMUX_IPSR_DATA(IP9_18_17, PWM4_B), 1278 + PINMUX_IPSR_DATA(IP9_20_19, VI0_CLKENB), 1279 + PINMUX_IPSR_MODSEL_DATA(IP9_20_19, TX4, SEL_SCIF4_0), 1280 + PINMUX_IPSR_MODSEL_DATA(IP9_20_19, SCIFA4_TXD, SEL_SCIFA4_0), 1281 + PINMUX_IPSR_MODSEL_DATA(IP9_20_19, TS_SDATA0_D, SEL_TSIF0_3), 1282 + PINMUX_IPSR_DATA(IP9_22_21, VI0_FIELD), 1283 + PINMUX_IPSR_MODSEL_DATA(IP9_22_21, RX4, SEL_SCIF4_0), 1284 + PINMUX_IPSR_MODSEL_DATA(IP9_22_21, SCIFA4_RXD, SEL_SCIFA4_0), 1285 + PINMUX_IPSR_MODSEL_DATA(IP9_22_21, TS_SCK0_D, SEL_TSIF0_3), 1286 + PINMUX_IPSR_DATA(IP9_24_23, VI0_HSYNC_N), 1287 + PINMUX_IPSR_MODSEL_DATA(IP9_24_23, TX5, SEL_SCIF5_0), 1288 + PINMUX_IPSR_MODSEL_DATA(IP9_24_23, SCIFA5_TXD, SEL_SCIFA5_0), 1289 + PINMUX_IPSR_MODSEL_DATA(IP9_24_23, TS_SDEN0_D, SEL_TSIF0_3), 1290 + PINMUX_IPSR_DATA(IP9_26_25, VI0_VSYNC_N), 1291 + PINMUX_IPSR_MODSEL_DATA(IP9_26_25, RX5, SEL_SCIF5_0), 1292 + PINMUX_IPSR_MODSEL_DATA(IP9_26_25, SCIFA5_RXD, SEL_SCIFA5_0), 1293 + PINMUX_IPSR_MODSEL_DATA(IP9_26_25, TS_SPSYNC0_D, SEL_TSIF0_3), 1294 + PINMUX_IPSR_DATA(IP9_28_27, VI0_DATA3_VI0_B3), 1295 + PINMUX_IPSR_MODSEL_DATA(IP9_28_27, SCIF3_SCK_B, SEL_SCIF3_1), 1296 + PINMUX_IPSR_MODSEL_DATA(IP9_28_27, SCIFA3_SCK_B, SEL_SCIFA3_1), 1297 + PINMUX_IPSR_DATA(IP9_31_29, VI0_G0), 1298 + PINMUX_IPSR_MODSEL_DATA(IP9_31_29, SCL8, SEL_IIC8_0), 1299 + PINMUX_IPSR_MODSEL_DATA(IP9_31_29, STP_IVCXO27_0_C, SEL_SSP_2), 1300 + PINMUX_IPSR_MODSEL_DATA(IP9_31_29, SCL4, SEL_IIC4_0), 1301 + PINMUX_IPSR_MODSEL_DATA(IP9_31_29, HCTS2_N, SEL_HSCIF2_0), 1302 + PINMUX_IPSR_MODSEL_DATA(IP9_31_29, SCIFB2_CTS_N, SEL_SCIFB2_0), 1303 + PINMUX_IPSR_DATA(IP9_31_29, ATAWR1_N), 1304 + 1305 + /* IPSR10 */ 1306 + PINMUX_IPSR_DATA(IP10_2_0, VI0_G1), 1307 + PINMUX_IPSR_MODSEL_DATA(IP10_2_0, SDA8, SEL_IIC8_0), 1308 + PINMUX_IPSR_MODSEL_DATA(IP10_2_0, STP_ISCLK_0_C, SEL_SSP_2), 1309 + PINMUX_IPSR_MODSEL_DATA(IP10_2_0, SDA4, SEL_IIC4_0), 1310 + PINMUX_IPSR_MODSEL_DATA(IP10_2_0, HRTS2_N, SEL_HSCIF2_0), 1311 + PINMUX_IPSR_MODSEL_DATA(IP10_2_0, SCIFB2_RTS_N, SEL_SCIFB2_0), 1312 + PINMUX_IPSR_DATA(IP10_2_0, ATADIR1_N), 1313 + PINMUX_IPSR_DATA(IP10_5_3, VI0_G2), 1314 + PINMUX_IPSR_DATA(IP10_5_3, VI2_HSYNC_N), 1315 + PINMUX_IPSR_MODSEL_DATA(IP10_5_3, STP_ISD_0_C, SEL_SSP_2), 1316 + PINMUX_IPSR_MODSEL_DATA(IP10_5_3, SCL3_B, SEL_IIC3_1), 1317 + PINMUX_IPSR_MODSEL_DATA(IP10_5_3, HSCK2, SEL_HSCIF2_0), 1318 + PINMUX_IPSR_MODSEL_DATA(IP10_5_3, SCIFB2_SCK, SEL_SCIFB2_0), 1319 + PINMUX_IPSR_DATA(IP10_5_3, ATARD1_N), 1320 + PINMUX_IPSR_DATA(IP10_8_6, VI0_G3), 1321 + PINMUX_IPSR_DATA(IP10_8_6, VI2_VSYNC_N), 1322 + PINMUX_IPSR_MODSEL_DATA(IP10_8_6, STP_ISEN_0_C, SEL_SSP_2), 1323 + PINMUX_IPSR_MODSEL_DATA(IP10_8_6, SDA3_B, SEL_IIC3_1), 1324 + PINMUX_IPSR_MODSEL_DATA(IP10_8_6, HRX2, SEL_HSCIF2_0), 1325 + PINMUX_IPSR_MODSEL_DATA(IP10_8_6, SCIFB2_RXD, SEL_SCIFB2_0), 1326 + PINMUX_IPSR_DATA(IP10_8_6, ATACS01_N), 1327 + PINMUX_IPSR_DATA(IP10_11_9, VI0_G4), 1328 + PINMUX_IPSR_DATA(IP10_11_9, VI2_CLKENB), 1329 + PINMUX_IPSR_MODSEL_DATA(IP10_11_9, STP_ISSYNC_0_C, SEL_SSP_2), 1330 + PINMUX_IPSR_MODSEL_DATA(IP10_11_9, HTX2, SEL_HSCIF2_0), 1331 + PINMUX_IPSR_MODSEL_DATA(IP10_11_9, SCIFB2_TXD, SEL_SCIFB2_0), 1332 + PINMUX_IPSR_MODSEL_DATA(IP10_11_9, SCIFB0_SCK_D, SEL_SCIFB_3), 1333 + PINMUX_IPSR_DATA(IP10_14_12, VI0_G5), 1334 + PINMUX_IPSR_DATA(IP10_14_12, VI2_FIELD), 1335 + PINMUX_IPSR_MODSEL_DATA(IP10_14_12, STP_OPWM_0_C, SEL_SSP_2), 1336 + PINMUX_IPSR_MODSEL_DATA(IP10_14_12, FMCLK_D, SEL_FM_3), 1337 + PINMUX_IPSR_MODSEL_DATA(IP10_14_12, CAN0_TX_E, SEL_CAN0_4), 1338 + PINMUX_IPSR_MODSEL_DATA(IP10_14_12, HTX1_D, SEL_HSCIF1_3), 1339 + PINMUX_IPSR_MODSEL_DATA(IP10_14_12, SCIFB0_TXD_D, SEL_SCIFB_3), 1340 + PINMUX_IPSR_DATA(IP10_16_15, VI0_G6), 1341 + PINMUX_IPSR_DATA(IP10_16_15, VI2_CLK), 1342 + PINMUX_IPSR_MODSEL_DATA(IP10_16_15, BPFCLK_D, SEL_FM_3), 1343 + PINMUX_IPSR_DATA(IP10_18_17, VI0_G7), 1344 + PINMUX_IPSR_DATA(IP10_18_17, VI2_DATA0), 1345 + PINMUX_IPSR_MODSEL_DATA(IP10_18_17, FMIN_D, SEL_FM_3), 1346 + PINMUX_IPSR_DATA(IP10_21_19, VI0_R0), 1347 + PINMUX_IPSR_DATA(IP10_21_19, VI2_DATA1), 1348 + PINMUX_IPSR_MODSEL_DATA(IP10_21_19, GLO_I0_B, SEL_GPS_1), 1349 + PINMUX_IPSR_MODSEL_DATA(IP10_21_19, TS_SDATA0_C, SEL_TSIF0_2), 1350 + PINMUX_IPSR_DATA(IP10_21_19, ATACS11_N), 1351 + PINMUX_IPSR_DATA(IP10_24_22, VI0_R1), 1352 + PINMUX_IPSR_DATA(IP10_24_22, VI2_DATA2), 1353 + PINMUX_IPSR_MODSEL_DATA(IP10_24_22, GLO_I1_B, SEL_GPS_1), 1354 + PINMUX_IPSR_MODSEL_DATA(IP10_24_22, TS_SCK0_C, SEL_TSIF0_2), 1355 + PINMUX_IPSR_DATA(IP10_24_22, ATAG1_N), 1356 + PINMUX_IPSR_DATA(IP10_26_25, VI0_R2), 1357 + PINMUX_IPSR_DATA(IP10_26_25, VI2_DATA3), 1358 + PINMUX_IPSR_MODSEL_DATA(IP10_26_25, GLO_Q0_B, SEL_GPS_1), 1359 + PINMUX_IPSR_MODSEL_DATA(IP10_26_25, TS_SDEN0_C, SEL_TSIF0_2), 1360 + PINMUX_IPSR_DATA(IP10_28_27, VI0_R3), 1361 + PINMUX_IPSR_DATA(IP10_28_27, VI2_DATA4), 1362 + PINMUX_IPSR_MODSEL_DATA(IP10_28_27, GLO_Q1_B, SEL_GPS_1), 1363 + PINMUX_IPSR_MODSEL_DATA(IP10_28_27, TS_SPSYNC0_C, SEL_TSIF0_2), 1364 + PINMUX_IPSR_DATA(IP10_31_29, VI0_R4), 1365 + PINMUX_IPSR_DATA(IP10_31_29, VI2_DATA5), 1366 + PINMUX_IPSR_MODSEL_DATA(IP10_31_29, GLO_SCLK_B, SEL_GPS_1), 1367 + PINMUX_IPSR_MODSEL_DATA(IP10_31_29, TX0_C, SEL_SCIF0_2), 1368 + PINMUX_IPSR_MODSEL_DATA(IP10_31_29, SCL1_D, SEL_IIC1_3), 1369 + 1370 + /* IPSR11 */ 1371 + PINMUX_IPSR_DATA(IP11_2_0, VI0_R5), 1372 + PINMUX_IPSR_DATA(IP11_2_0, VI2_DATA6), 1373 + PINMUX_IPSR_MODSEL_DATA(IP11_2_0, GLO_SDATA_B, SEL_GPS_1), 1374 + PINMUX_IPSR_MODSEL_DATA(IP11_2_0, RX0_C, SEL_SCIF0_2), 1375 + PINMUX_IPSR_MODSEL_DATA(IP11_2_0, SDA1_D, SEL_IIC1_3), 1376 + PINMUX_IPSR_DATA(IP11_5_3, VI0_R6), 1377 + PINMUX_IPSR_DATA(IP11_5_3, VI2_DATA7), 1378 + PINMUX_IPSR_MODSEL_DATA(IP11_5_3, GLO_SS_B, SEL_GPS_1), 1379 + PINMUX_IPSR_MODSEL_DATA(IP11_5_3, TX1_C, SEL_SCIF1_2), 1380 + PINMUX_IPSR_MODSEL_DATA(IP11_5_3, SCL4_B, SEL_IIC4_1), 1381 + PINMUX_IPSR_DATA(IP11_8_6, VI0_R7), 1382 + PINMUX_IPSR_MODSEL_DATA(IP11_8_6, GLO_RFON_B, SEL_GPS_1), 1383 + PINMUX_IPSR_MODSEL_DATA(IP11_8_6, RX1_C, SEL_SCIF1_2), 1384 + PINMUX_IPSR_MODSEL_DATA(IP11_8_6, CAN0_RX_E, SEL_CAN0_4), 1385 + PINMUX_IPSR_MODSEL_DATA(IP11_8_6, SDA4_B, SEL_IIC4_1), 1386 + PINMUX_IPSR_MODSEL_DATA(IP11_8_6, HRX1_D, SEL_HSCIF1_3), 1387 + PINMUX_IPSR_MODSEL_DATA(IP11_8_6, SCIFB0_RXD_D, SEL_SCIFB_3), 1388 + PINMUX_IPSR_MODSEL_DATA(IP11_11_9, VI1_HSYNC_N, SEL_VI1_0), 1389 + PINMUX_IPSR_DATA(IP11_11_9, AVB_RXD0), 1390 + PINMUX_IPSR_MODSEL_DATA(IP11_11_9, TS_SDATA0_B, SEL_TSIF0_1), 1391 + PINMUX_IPSR_MODSEL_DATA(IP11_11_9, TX4_B, SEL_SCIF4_1), 1392 + PINMUX_IPSR_MODSEL_DATA(IP11_11_9, SCIFA4_TXD_B, SEL_SCIFA4_1), 1393 + PINMUX_IPSR_MODSEL_DATA(IP11_14_12, VI1_VSYNC_N, SEL_VI1_0), 1394 + PINMUX_IPSR_DATA(IP11_14_12, AVB_RXD1), 1395 + PINMUX_IPSR_MODSEL_DATA(IP11_14_12, TS_SCK0_B, SEL_TSIF0_1), 1396 + PINMUX_IPSR_MODSEL_DATA(IP11_14_12, RX4_B, SEL_SCIF4_1), 1397 + PINMUX_IPSR_MODSEL_DATA(IP11_14_12, SCIFA4_RXD_B, SEL_SCIFA4_1), 1398 + PINMUX_IPSR_MODSEL_DATA(IP11_16_15, VI1_CLKENB, SEL_VI1_0), 1399 + PINMUX_IPSR_DATA(IP11_16_15, AVB_RXD2), 1400 + PINMUX_IPSR_MODSEL_DATA(IP11_16_15, TS_SDEN0_B, SEL_TSIF0_1), 1401 + PINMUX_IPSR_MODSEL_DATA(IP11_18_17, VI1_FIELD, SEL_VI1_0), 1402 + PINMUX_IPSR_DATA(IP11_18_17, AVB_RXD3), 1403 + PINMUX_IPSR_MODSEL_DATA(IP11_18_17, TS_SPSYNC0_B, SEL_TSIF0_1), 1404 + PINMUX_IPSR_MODSEL_DATA(IP11_19, VI1_CLK, SEL_VI1_0), 1405 + PINMUX_IPSR_DATA(IP11_19, AVB_RXD4), 1406 + PINMUX_IPSR_MODSEL_DATA(IP11_20, VI1_DATA0, SEL_VI1_0), 1407 + PINMUX_IPSR_DATA(IP11_20, AVB_RXD5), 1408 + PINMUX_IPSR_MODSEL_DATA(IP11_21, VI1_DATA1, SEL_VI1_0), 1409 + PINMUX_IPSR_DATA(IP11_21, AVB_RXD6), 1410 + PINMUX_IPSR_MODSEL_DATA(IP11_22, VI1_DATA2, SEL_VI1_0), 1411 + PINMUX_IPSR_DATA(IP11_22, AVB_RXD7), 1412 + PINMUX_IPSR_MODSEL_DATA(IP11_23, VI1_DATA3, SEL_VI1_0), 1413 + PINMUX_IPSR_DATA(IP11_23, AVB_RX_ER), 1414 + PINMUX_IPSR_MODSEL_DATA(IP11_24, VI1_DATA4, SEL_VI1_0), 1415 + PINMUX_IPSR_DATA(IP11_24, AVB_MDIO), 1416 + PINMUX_IPSR_MODSEL_DATA(IP11_25, VI1_DATA5, SEL_VI1_0), 1417 + PINMUX_IPSR_DATA(IP11_25, AVB_RX_DV), 1418 + PINMUX_IPSR_MODSEL_DATA(IP11_26, VI1_DATA6, SEL_VI1_0), 1419 + PINMUX_IPSR_DATA(IP11_26, AVB_MAGIC), 1420 + PINMUX_IPSR_MODSEL_DATA(IP11_27, VI1_DATA7, SEL_VI1_0), 1421 + PINMUX_IPSR_DATA(IP11_27, AVB_MDC), 1422 + PINMUX_IPSR_DATA(IP11_29_28, ETH_MDIO), 1423 + PINMUX_IPSR_DATA(IP11_29_28, AVB_RX_CLK), 1424 + PINMUX_IPSR_MODSEL_DATA(IP11_29_28, SCL2_C, SEL_IIC2_2), 1425 + PINMUX_IPSR_DATA(IP11_31_30, ETH_CRS_DV), 1426 + PINMUX_IPSR_DATA(IP11_31_30, AVB_LINK), 1427 + PINMUX_IPSR_MODSEL_DATA(IP11_31_30, SDA2_C, SEL_IIC2_2), 1428 + 1429 + /* IPSR12 */ 1430 + PINMUX_IPSR_DATA(IP12_1_0, ETH_RX_ER), 1431 + PINMUX_IPSR_DATA(IP12_1_0, AVB_CRS), 1432 + PINMUX_IPSR_MODSEL_DATA(IP12_1_0, SCL3, SEL_IIC3_0), 1433 + PINMUX_IPSR_MODSEL_DATA(IP12_1_0, SCL7, SEL_IIC7_0), 1434 + PINMUX_IPSR_DATA(IP12_3_2, ETH_RXD0), 1435 + PINMUX_IPSR_DATA(IP12_3_2, AVB_PHY_INT), 1436 + PINMUX_IPSR_MODSEL_DATA(IP12_3_2, SDA3, SEL_IIC3_0), 1437 + PINMUX_IPSR_MODSEL_DATA(IP12_3_2, SDA7, SEL_IIC7_0), 1438 + PINMUX_IPSR_DATA(IP12_6_4, ETH_RXD1), 1439 + PINMUX_IPSR_DATA(IP12_6_4, AVB_GTXREFCLK), 1440 + PINMUX_IPSR_MODSEL_DATA(IP12_6_4, CAN0_TX_C, SEL_CAN0_2), 1441 + PINMUX_IPSR_MODSEL_DATA(IP12_6_4, SCL2_D, SEL_IIC2_3), 1442 + PINMUX_IPSR_MODSEL_DATA(IP12_6_4, MSIOF1_RXD_E, SEL_SOF1_4), 1443 + PINMUX_IPSR_DATA(IP12_9_7, ETH_LINK), 1444 + PINMUX_IPSR_DATA(IP12_9_7, AVB_TXD0), 1445 + PINMUX_IPSR_MODSEL_DATA(IP12_9_7, CAN0_RX_C, SEL_CAN0_2), 1446 + PINMUX_IPSR_MODSEL_DATA(IP12_9_7, SDA2_D, SEL_IIC2_3), 1447 + PINMUX_IPSR_MODSEL_DATA(IP12_9_7, MSIOF1_SCK_E, SEL_SOF1_4), 1448 + PINMUX_IPSR_DATA(IP12_12_10, ETH_REFCLK), 1449 + PINMUX_IPSR_DATA(IP12_12_10, AVB_TXD1), 1450 + PINMUX_IPSR_MODSEL_DATA(IP12_12_10, SCIFA3_RXD_B, SEL_SCIFA3_1), 1451 + PINMUX_IPSR_MODSEL_DATA(IP12_12_10, CAN1_RX_C, SEL_CAN1_2), 1452 + PINMUX_IPSR_MODSEL_DATA(IP12_12_10, MSIOF1_SYNC_E, SEL_SOF1_4), 1453 + PINMUX_IPSR_DATA(IP12_15_13, ETH_TXD1), 1454 + PINMUX_IPSR_DATA(IP12_15_13, AVB_TXD2), 1455 + PINMUX_IPSR_MODSEL_DATA(IP12_15_13, SCIFA3_TXD_B, SEL_SCIFA3_1), 1456 + PINMUX_IPSR_MODSEL_DATA(IP12_15_13, CAN1_TX_C, SEL_CAN1_2), 1457 + PINMUX_IPSR_MODSEL_DATA(IP12_15_13, MSIOF1_TXD_E, SEL_SOF1_4), 1458 + PINMUX_IPSR_DATA(IP12_17_16, ETH_TX_EN), 1459 + PINMUX_IPSR_DATA(IP12_17_16, AVB_TXD3), 1460 + PINMUX_IPSR_MODSEL_DATA(IP12_17_16, TCLK1_B, SEL_TMU1_0), 1461 + PINMUX_IPSR_MODSEL_DATA(IP12_17_16, CAN_CLK_B, SEL_CANCLK_1), 1462 + PINMUX_IPSR_DATA(IP12_19_18, ETH_MAGIC), 1463 + PINMUX_IPSR_DATA(IP12_19_18, AVB_TXD4), 1464 + PINMUX_IPSR_MODSEL_DATA(IP12_19_18, IETX_C, SEL_IEB_2), 1465 + PINMUX_IPSR_DATA(IP12_21_20, ETH_TXD0), 1466 + PINMUX_IPSR_DATA(IP12_21_20, AVB_TXD5), 1467 + PINMUX_IPSR_MODSEL_DATA(IP12_21_20, IECLK_C, SEL_IEB_2), 1468 + PINMUX_IPSR_DATA(IP12_23_22, ETH_MDC), 1469 + PINMUX_IPSR_DATA(IP12_23_22, AVB_TXD6), 1470 + PINMUX_IPSR_MODSEL_DATA(IP12_23_22, IERX_C, SEL_IEB_2), 1471 + PINMUX_IPSR_MODSEL_DATA(IP12_26_24, STP_IVCXO27_0, SEL_SSP_0), 1472 + PINMUX_IPSR_DATA(IP12_26_24, AVB_TXD7), 1473 + PINMUX_IPSR_MODSEL_DATA(IP12_26_24, SCIFB2_TXD_D, SEL_SCIFB2_3), 1474 + PINMUX_IPSR_MODSEL_DATA(IP12_26_24, ADIDATA_B, SEL_RAD_1), 1475 + PINMUX_IPSR_MODSEL_DATA(IP12_26_24, MSIOF0_SYNC_C, SEL_SOF0_2), 1476 + PINMUX_IPSR_MODSEL_DATA(IP12_29_27, STP_ISCLK_0, SEL_SSP_0), 1477 + PINMUX_IPSR_DATA(IP12_29_27, AVB_TX_EN), 1478 + PINMUX_IPSR_MODSEL_DATA(IP12_29_27, SCIFB2_RXD_D, SEL_SCIFB2_3), 1479 + PINMUX_IPSR_MODSEL_DATA(IP12_29_27, ADICS_SAMP_B, SEL_RAD_1), 1480 + PINMUX_IPSR_MODSEL_DATA(IP12_29_27, MSIOF0_SCK_C, SEL_SOF0_2), 1481 + 1482 + /* IPSR13 */ 1483 + PINMUX_IPSR_MODSEL_DATA(IP13_2_0, STP_ISD_0, SEL_SSP_0), 1484 + PINMUX_IPSR_DATA(IP13_2_0, AVB_TX_ER), 1485 + PINMUX_IPSR_MODSEL_DATA(IP13_2_0, SCIFB2_SCK_C, SEL_SCIFB2_2), 1486 + PINMUX_IPSR_MODSEL_DATA(IP13_2_0, ADICLK_B, SEL_RAD_1), 1487 + PINMUX_IPSR_MODSEL_DATA(IP13_2_0, MSIOF0_SS1_C, SEL_SOF0_2), 1488 + PINMUX_IPSR_MODSEL_DATA(IP13_4_3, STP_ISEN_0, SEL_SSP_0), 1489 + PINMUX_IPSR_DATA(IP13_4_3, AVB_TX_CLK), 1490 + PINMUX_IPSR_MODSEL_DATA(IP13_4_3, ADICHS0_B, SEL_RAD_1), 1491 + PINMUX_IPSR_MODSEL_DATA(IP13_4_3, MSIOF0_SS2_C, SEL_SOF0_2), 1492 + PINMUX_IPSR_MODSEL_DATA(IP13_6_5, STP_ISSYNC_0, SEL_SSP_0), 1493 + PINMUX_IPSR_DATA(IP13_6_5, AVB_COL), 1494 + PINMUX_IPSR_MODSEL_DATA(IP13_6_5, ADICHS1_B, SEL_RAD_1), 1495 + PINMUX_IPSR_MODSEL_DATA(IP13_6_5, MSIOF0_RXD_C, SEL_SOF0_2), 1496 + PINMUX_IPSR_MODSEL_DATA(IP13_9_7, STP_OPWM_0, SEL_SSP_0), 1497 + PINMUX_IPSR_DATA(IP13_9_7, AVB_GTX_CLK), 1498 + PINMUX_IPSR_DATA(IP13_9_7, PWM0_B), 1499 + PINMUX_IPSR_MODSEL_DATA(IP13_9_7, ADICHS2_B, SEL_RAD_1), 1500 + PINMUX_IPSR_MODSEL_DATA(IP13_9_7, MSIOF0_TXD_C, SEL_SOF0_2), 1501 + PINMUX_IPSR_DATA(IP13_10, SD0_CLK), 1502 + PINMUX_IPSR_MODSEL_DATA(IP13_10, SPCLK_B, SEL_QSP_1), 1503 + PINMUX_IPSR_DATA(IP13_11, SD0_CMD), 1504 + PINMUX_IPSR_MODSEL_DATA(IP13_11, MOSI_IO0_B, SEL_QSP_1), 1505 + PINMUX_IPSR_DATA(IP13_12, SD0_DATA0), 1506 + PINMUX_IPSR_MODSEL_DATA(IP13_12, MISO_IO1_B, SEL_QSP_1), 1507 + PINMUX_IPSR_DATA(IP13_13, SD0_DATA1), 1508 + PINMUX_IPSR_MODSEL_DATA(IP13_13, IO2_B, SEL_QSP_1), 1509 + PINMUX_IPSR_DATA(IP13_14, SD0_DATA2), 1510 + PINMUX_IPSR_MODSEL_DATA(IP13_14, IO3_B, SEL_QSP_1), 1511 + PINMUX_IPSR_DATA(IP13_15, SD0_DATA3), 1512 + PINMUX_IPSR_MODSEL_DATA(IP13_15, SSL_B, SEL_QSP_1), 1513 + PINMUX_IPSR_DATA(IP13_18_16, SD0_CD), 1514 + PINMUX_IPSR_MODSEL_DATA(IP13_18_16, MMC_D6_B, SEL_MMC_1), 1515 + PINMUX_IPSR_MODSEL_DATA(IP13_18_16, SIM0_RST_B, SEL_SIM_1), 1516 + PINMUX_IPSR_MODSEL_DATA(IP13_18_16, CAN0_RX_F, SEL_CAN0_5), 1517 + PINMUX_IPSR_MODSEL_DATA(IP13_18_16, SCIFA5_TXD_B, SEL_SCIFA5_1), 1518 + PINMUX_IPSR_MODSEL_DATA(IP13_18_16, TX3_C, SEL_SCIF3_2), 1519 + PINMUX_IPSR_DATA(IP13_21_19, SD0_WP), 1520 + PINMUX_IPSR_MODSEL_DATA(IP13_21_19, MMC_D7_B, SEL_MMC_1), 1521 + PINMUX_IPSR_MODSEL_DATA(IP13_21_19, SIM0_D_B, SEL_SIM_1), 1522 + PINMUX_IPSR_MODSEL_DATA(IP13_21_19, CAN0_TX_F, SEL_CAN0_5), 1523 + PINMUX_IPSR_MODSEL_DATA(IP13_21_19, SCIFA5_RXD_B, SEL_SCIFA5_1), 1524 + PINMUX_IPSR_MODSEL_DATA(IP13_21_19, RX3_C, SEL_SCIF3_2), 1525 + PINMUX_IPSR_DATA(IP13_22, SD1_CMD), 1526 + PINMUX_IPSR_MODSEL_DATA(IP13_22, REMOCON_B, SEL_RCN_1), 1527 + PINMUX_IPSR_DATA(IP13_24_23, SD1_DATA0), 1528 + PINMUX_IPSR_MODSEL_DATA(IP13_24_23, SPEEDIN_B, SEL_RSP_1), 1529 + PINMUX_IPSR_DATA(IP13_25, SD1_DATA1), 1530 + PINMUX_IPSR_MODSEL_DATA(IP13_25, IETX_B, SEL_IEB_1), 1531 + PINMUX_IPSR_DATA(IP13_26, SD1_DATA2), 1532 + PINMUX_IPSR_MODSEL_DATA(IP13_26, IECLK_B, SEL_IEB_1), 1533 + PINMUX_IPSR_DATA(IP13_27, SD1_DATA3), 1534 + PINMUX_IPSR_MODSEL_DATA(IP13_27, IERX_B, SEL_IEB_1), 1535 + PINMUX_IPSR_DATA(IP13_30_28, SD1_CD), 1536 + PINMUX_IPSR_DATA(IP13_30_28, PWM0), 1537 + PINMUX_IPSR_DATA(IP13_30_28, TPU_TO0), 1538 + PINMUX_IPSR_MODSEL_DATA(IP13_30_28, SCL1_C, SEL_IIC1_2), 1539 + 1540 + /* IPSR14 */ 1541 + PINMUX_IPSR_DATA(IP14_1_0, SD1_WP), 1542 + PINMUX_IPSR_DATA(IP14_1_0, PWM1_B), 1543 + PINMUX_IPSR_MODSEL_DATA(IP14_1_0, SDA1_C, SEL_IIC1_2), 1544 + PINMUX_IPSR_DATA(IP14_2, SD2_CLK), 1545 + PINMUX_IPSR_DATA(IP14_2, MMC_CLK), 1546 + PINMUX_IPSR_DATA(IP14_3, SD2_CMD), 1547 + PINMUX_IPSR_DATA(IP14_3, MMC_CMD), 1548 + PINMUX_IPSR_DATA(IP14_4, SD2_DATA0), 1549 + PINMUX_IPSR_DATA(IP14_4, MMC_D0), 1550 + PINMUX_IPSR_DATA(IP14_5, SD2_DATA1), 1551 + PINMUX_IPSR_DATA(IP14_5, MMC_D1), 1552 + PINMUX_IPSR_DATA(IP14_6, SD2_DATA2), 1553 + PINMUX_IPSR_DATA(IP14_6, MMC_D2), 1554 + PINMUX_IPSR_DATA(IP14_7, SD2_DATA3), 1555 + PINMUX_IPSR_DATA(IP14_7, MMC_D3), 1556 + PINMUX_IPSR_DATA(IP14_10_8, SD2_CD), 1557 + PINMUX_IPSR_DATA(IP14_10_8, MMC_D4), 1558 + PINMUX_IPSR_MODSEL_DATA(IP14_10_8, SCL8_C, SEL_IIC8_2), 1559 + PINMUX_IPSR_MODSEL_DATA(IP14_10_8, TX5_B, SEL_SCIF5_1), 1560 + PINMUX_IPSR_MODSEL_DATA(IP14_10_8, SCIFA5_TXD_C, SEL_SCIFA5_2), 1561 + PINMUX_IPSR_DATA(IP14_13_11, SD2_WP), 1562 + PINMUX_IPSR_DATA(IP14_13_11, MMC_D5), 1563 + PINMUX_IPSR_MODSEL_DATA(IP14_13_11, SDA8_C, SEL_IIC8_2), 1564 + PINMUX_IPSR_MODSEL_DATA(IP14_13_11, RX5_B, SEL_SCIF5_1), 1565 + PINMUX_IPSR_MODSEL_DATA(IP14_13_11, SCIFA5_RXD_C, SEL_SCIFA5_2), 1566 + PINMUX_IPSR_MODSEL_DATA(IP14_16_14, MSIOF0_SCK, SEL_SOF0_0), 1567 + PINMUX_IPSR_MODSEL_DATA(IP14_16_14, RX2_C, SEL_SCIF2_2), 1568 + PINMUX_IPSR_MODSEL_DATA(IP14_16_14, ADIDATA, SEL_RAD_0), 1569 + PINMUX_IPSR_MODSEL_DATA(IP14_16_14, VI1_CLK_C, SEL_VI1_2), 1570 + PINMUX_IPSR_DATA(IP14_16_14, VI1_G0_B), 1571 + PINMUX_IPSR_MODSEL_DATA(IP14_19_17, MSIOF0_SYNC, SEL_SOF0_0), 1572 + PINMUX_IPSR_MODSEL_DATA(IP14_19_17, TX2_C, SEL_SCIF2_2), 1573 + PINMUX_IPSR_MODSEL_DATA(IP14_19_17, ADICS_SAMP, SEL_RAD_0), 1574 + PINMUX_IPSR_MODSEL_DATA(IP14_19_17, VI1_CLKENB_C, SEL_VI1_2), 1575 + PINMUX_IPSR_DATA(IP14_19_17, VI1_G1_B), 1576 + PINMUX_IPSR_MODSEL_DATA(IP14_22_20, MSIOF0_TXD, SEL_SOF0_0), 1577 + PINMUX_IPSR_MODSEL_DATA(IP14_22_20, ADICLK, SEL_RAD_0), 1578 + PINMUX_IPSR_MODSEL_DATA(IP14_22_20, VI1_FIELD_C, SEL_VI1_2), 1579 + PINMUX_IPSR_DATA(IP14_22_20, VI1_G2_B), 1580 + PINMUX_IPSR_MODSEL_DATA(IP14_25_23, MSIOF0_RXD, SEL_SOF0_0), 1581 + PINMUX_IPSR_MODSEL_DATA(IP14_25_23, ADICHS0, SEL_RAD_0), 1582 + PINMUX_IPSR_MODSEL_DATA(IP14_25_23, VI1_DATA0_C, SEL_VI1_2), 1583 + PINMUX_IPSR_DATA(IP14_25_23, VI1_G3_B), 1584 + PINMUX_IPSR_MODSEL_DATA(IP14_28_26, MSIOF0_SS1, SEL_SOF0_0), 1585 + PINMUX_IPSR_MODSEL_DATA(IP14_28_26, MMC_D6, SEL_MMC_0), 1586 + PINMUX_IPSR_MODSEL_DATA(IP14_28_26, ADICHS1, SEL_RAD_0), 1587 + PINMUX_IPSR_MODSEL_DATA(IP14_28_26, TX0_E, SEL_SCIF0_4), 1588 + PINMUX_IPSR_MODSEL_DATA(IP14_28_26, VI1_HSYNC_N_C, SEL_VI1_2), 1589 + PINMUX_IPSR_MODSEL_DATA(IP14_28_26, SCL7_C, SEL_IIC7_2), 1590 + PINMUX_IPSR_DATA(IP14_28_26, VI1_G4_B), 1591 + PINMUX_IPSR_MODSEL_DATA(IP14_31_29, MSIOF0_SS2, SEL_SOF0_0), 1592 + PINMUX_IPSR_MODSEL_DATA(IP14_31_29, MMC_D7, SEL_MMC_0), 1593 + PINMUX_IPSR_MODSEL_DATA(IP14_31_29, ADICHS2, SEL_RAD_0), 1594 + PINMUX_IPSR_MODSEL_DATA(IP14_31_29, RX0_E, SEL_SCIF0_4), 1595 + PINMUX_IPSR_MODSEL_DATA(IP14_31_29, VI1_VSYNC_N_C, SEL_VI1_2), 1596 + PINMUX_IPSR_MODSEL_DATA(IP14_31_29, SDA7_C, SEL_IIC7_2), 1597 + PINMUX_IPSR_DATA(IP14_31_29, VI1_G5_B), 1598 + 1599 + /* IPSR15 */ 1600 + PINMUX_IPSR_MODSEL_DATA(IP15_1_0, SIM0_RST, SEL_SIM_0), 1601 + PINMUX_IPSR_MODSEL_DATA(IP15_1_0, IETX, SEL_IEB_0), 1602 + PINMUX_IPSR_MODSEL_DATA(IP15_1_0, CAN1_TX_D, SEL_CAN1_3), 1603 + PINMUX_IPSR_DATA(IP15_3_2, SIM0_CLK), 1604 + PINMUX_IPSR_MODSEL_DATA(IP15_3_2, IECLK, SEL_IEB_0), 1605 + PINMUX_IPSR_MODSEL_DATA(IP15_3_2, CAN_CLK_C, SEL_CANCLK_2), 1606 + PINMUX_IPSR_MODSEL_DATA(IP15_5_4, SIM0_D, SEL_SIM_0), 1607 + PINMUX_IPSR_MODSEL_DATA(IP15_5_4, IERX, SEL_IEB_0), 1608 + PINMUX_IPSR_MODSEL_DATA(IP15_5_4, CAN1_RX_D, SEL_CAN1_3), 1609 + PINMUX_IPSR_MODSEL_DATA(IP15_8_6, GPS_CLK, SEL_GPS_0), 1610 + PINMUX_IPSR_MODSEL_DATA(IP15_8_6, DU1_DOTCLKIN_C, SEL_DIS_2), 1611 + PINMUX_IPSR_MODSEL_DATA(IP15_8_6, AUDIO_CLKB_B, SEL_ADG_1), 1612 + PINMUX_IPSR_DATA(IP15_8_6, PWM5_B), 1613 + PINMUX_IPSR_MODSEL_DATA(IP15_8_6, SCIFA3_TXD_C, SEL_SCIFA3_2), 1614 + PINMUX_IPSR_MODSEL_DATA(IP15_11_9, GPS_SIGN, SEL_GPS_0), 1615 + PINMUX_IPSR_MODSEL_DATA(IP15_11_9, TX4_C, SEL_SCIF4_2), 1616 + PINMUX_IPSR_MODSEL_DATA(IP15_11_9, SCIFA4_TXD_C, SEL_SCIFA4_2), 1617 + PINMUX_IPSR_DATA(IP15_11_9, PWM5), 1618 + PINMUX_IPSR_DATA(IP15_11_9, VI1_G6_B), 1619 + PINMUX_IPSR_MODSEL_DATA(IP15_11_9, SCIFA3_RXD_C, SEL_SCIFA3_2), 1620 + PINMUX_IPSR_MODSEL_DATA(IP15_14_12, GPS_MAG, SEL_GPS_0), 1621 + PINMUX_IPSR_MODSEL_DATA(IP15_14_12, RX4_C, SEL_SCIF4_2), 1622 + PINMUX_IPSR_MODSEL_DATA(IP15_14_12, SCIFA4_RXD_C, SEL_SCIFA4_2), 1623 + PINMUX_IPSR_DATA(IP15_14_12, PWM6), 1624 + PINMUX_IPSR_DATA(IP15_14_12, VI1_G7_B), 1625 + PINMUX_IPSR_MODSEL_DATA(IP15_14_12, SCIFA3_SCK_C, SEL_SCIFA3_2), 1626 + PINMUX_IPSR_MODSEL_DATA(IP15_17_15, HCTS0_N, SEL_HSCIF0_0), 1627 + PINMUX_IPSR_MODSEL_DATA(IP15_17_15, SCIFB0_CTS_N, SEL_SCIFB_0), 1628 + PINMUX_IPSR_MODSEL_DATA(IP15_17_15, GLO_I0_C, SEL_GPS_2), 1629 + PINMUX_IPSR_MODSEL_DATA(IP15_17_15, TCLK1, SEL_TMU1_0), 1630 + PINMUX_IPSR_MODSEL_DATA(IP15_17_15, VI1_DATA1_C, SEL_VI1_2), 1631 + PINMUX_IPSR_MODSEL_DATA(IP15_20_18, HRTS0_N, SEL_HSCIF0_0), 1632 + PINMUX_IPSR_MODSEL_DATA(IP15_20_18, SCIFB0_RTS_N, SEL_SCIFB_0), 1633 + PINMUX_IPSR_MODSEL_DATA(IP15_20_18, GLO_I1_C, SEL_GPS_2), 1634 + PINMUX_IPSR_MODSEL_DATA(IP15_20_18, VI1_DATA2_C, SEL_VI1_2), 1635 + PINMUX_IPSR_MODSEL_DATA(IP15_23_21, HSCK0, SEL_HSCIF0_0), 1636 + PINMUX_IPSR_MODSEL_DATA(IP15_23_21, SCIFB0_SCK, SEL_SCIFB_0), 1637 + PINMUX_IPSR_MODSEL_DATA(IP15_23_21, GLO_Q0_C, SEL_GPS_2), 1638 + PINMUX_IPSR_MODSEL_DATA(IP15_23_21, CAN_CLK, SEL_CANCLK_0), 1639 + PINMUX_IPSR_DATA(IP15_23_21, TCLK2), 1640 + PINMUX_IPSR_MODSEL_DATA(IP15_23_21, VI1_DATA3_C, SEL_VI1_2), 1641 + PINMUX_IPSR_MODSEL_DATA(IP15_26_24, HRX0, SEL_HSCIF0_0), 1642 + PINMUX_IPSR_MODSEL_DATA(IP15_26_24, SCIFB0_RXD, SEL_SCIFB_0), 1643 + PINMUX_IPSR_MODSEL_DATA(IP15_26_24, GLO_Q1_C, SEL_GPS_2), 1644 + PINMUX_IPSR_MODSEL_DATA(IP15_26_24, CAN0_RX_B, SEL_CAN0_1), 1645 + PINMUX_IPSR_MODSEL_DATA(IP15_26_24, VI1_DATA4_C, SEL_VI1_2), 1646 + PINMUX_IPSR_MODSEL_DATA(IP15_29_27, HTX0, SEL_HSCIF0_0), 1647 + PINMUX_IPSR_MODSEL_DATA(IP15_29_27, SCIFB0_TXD, SEL_SCIFB_0), 1648 + PINMUX_IPSR_MODSEL_DATA(IP15_29_27, GLO_SCLK_C, SEL_GPS_2), 1649 + PINMUX_IPSR_MODSEL_DATA(IP15_29_27, CAN0_TX_B, SEL_CAN0_1), 1650 + PINMUX_IPSR_MODSEL_DATA(IP15_29_27, VI1_DATA5_C, SEL_VI1_2), 1651 + 1652 + /* IPSR16 */ 1653 + PINMUX_IPSR_MODSEL_DATA(IP16_2_0, HRX1, SEL_HSCIF1_0), 1654 + PINMUX_IPSR_MODSEL_DATA(IP16_2_0, SCIFB1_RXD, SEL_SCIFB1_0), 1655 + PINMUX_IPSR_DATA(IP16_2_0, VI1_R0_B), 1656 + PINMUX_IPSR_MODSEL_DATA(IP16_2_0, GLO_SDATA_C, SEL_GPS_2), 1657 + PINMUX_IPSR_MODSEL_DATA(IP16_2_0, VI1_DATA6_C, SEL_VI1_2), 1658 + PINMUX_IPSR_MODSEL_DATA(IP16_5_3, HTX1, SEL_HSCIF1_0), 1659 + PINMUX_IPSR_MODSEL_DATA(IP16_5_3, SCIFB1_TXD, SEL_SCIFB1_0), 1660 + PINMUX_IPSR_DATA(IP16_5_3, VI1_R1_B), 1661 + PINMUX_IPSR_MODSEL_DATA(IP16_5_3, GLO_SS_C, SEL_GPS_2), 1662 + PINMUX_IPSR_MODSEL_DATA(IP16_5_3, VI1_DATA7_C, SEL_VI1_2), 1663 + PINMUX_IPSR_MODSEL_DATA(IP16_7_6, HSCK1, SEL_HSCIF1_0), 1664 + PINMUX_IPSR_MODSEL_DATA(IP16_7_6, SCIFB1_SCK, SEL_SCIFB1_0), 1665 + PINMUX_IPSR_DATA(IP16_7_6, MLB_CK), 1666 + PINMUX_IPSR_MODSEL_DATA(IP16_7_6, GLO_RFON_C, SEL_GPS_2), 1667 + PINMUX_IPSR_MODSEL_DATA(IP16_9_8, HCTS1_N, SEL_HSCIF1_0), 1668 + PINMUX_IPSR_DATA(IP16_9_8, SCIFB1_CTS_N), 1669 + PINMUX_IPSR_DATA(IP16_9_8, MLB_SIG), 1670 + PINMUX_IPSR_MODSEL_DATA(IP16_9_8, CAN1_TX_B, SEL_CAN1_1), 1671 + PINMUX_IPSR_MODSEL_DATA(IP16_11_10, HRTS1_N, SEL_HSCIF1_0), 1672 + PINMUX_IPSR_DATA(IP16_11_10, SCIFB1_RTS_N), 1673 + PINMUX_IPSR_DATA(IP16_11_10, MLB_DAT), 1674 + PINMUX_IPSR_MODSEL_DATA(IP16_11_10, CAN1_RX_B, SEL_CAN1_1), 1675 + }; 1676 + 1677 + static struct sh_pfc_pin pinmux_pins[] = { 1678 + PINMUX_GPIO_GP_ALL(), 1679 + }; 1680 + 1681 + /* - DU --------------------------------------------------------------------- */ 1682 + static const unsigned int du_rgb666_pins[] = { 1683 + /* R[7:2], G[7:2], B[7:2] */ 1684 + RCAR_GP_PIN(3, 7), RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 5), 1685 + RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 3), RCAR_GP_PIN(3, 2), 1686 + RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 13), 1687 + RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 11), RCAR_GP_PIN(3, 10), 1688 + RCAR_GP_PIN(3, 23), RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), 1689 + RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 19), RCAR_GP_PIN(3, 18), 1690 + }; 1691 + static const unsigned int du_rgb666_mux[] = { 1692 + DU1_DR7_MARK, DU1_DR6_MARK, DU1_DR5_MARK, DU1_DR4_MARK, 1693 + DU1_DR3_MARK, DU1_DR2_MARK, 1694 + DU1_DG7_MARK, DU1_DG6_MARK, DU1_DG5_MARK, DU1_DG4_MARK, 1695 + DU1_DG3_MARK, DU1_DG2_MARK, 1696 + DU1_DB7_MARK, DU1_DB6_MARK, DU1_DB5_MARK, DU1_DB4_MARK, 1697 + DU1_DB3_MARK, DU1_DB2_MARK, 1698 + }; 1699 + static const unsigned int du_rgb888_pins[] = { 1700 + /* R[7:0], G[7:0], B[7:0] */ 1701 + RCAR_GP_PIN(3, 7), RCAR_GP_PIN(3, 6), RCAR_GP_PIN(3, 5), 1702 + RCAR_GP_PIN(3, 4), RCAR_GP_PIN(3, 3), RCAR_GP_PIN(3, 2), 1703 + RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 0), 1704 + RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14), RCAR_GP_PIN(3, 13), 1705 + RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 11), RCAR_GP_PIN(3, 10), 1706 + RCAR_GP_PIN(3, 9), RCAR_GP_PIN(3, 8), 1707 + RCAR_GP_PIN(3, 23), RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), 1708 + RCAR_GP_PIN(3, 20), RCAR_GP_PIN(3, 19), RCAR_GP_PIN(3, 18), 1709 + RCAR_GP_PIN(3, 17), RCAR_GP_PIN(3, 16), 1710 + }; 1711 + static const unsigned int du_rgb888_mux[] = { 1712 + DU1_DR7_MARK, DU1_DR6_MARK, DU1_DR5_MARK, DU1_DR4_MARK, 1713 + DU1_DR3_MARK, DU1_DR2_MARK, DU1_DR1_MARK, DU1_DR0_MARK, 1714 + DU1_DG7_MARK, DU1_DG6_MARK, DU1_DG5_MARK, DU1_DG4_MARK, 1715 + DU1_DG3_MARK, DU1_DG2_MARK, DU1_DG1_MARK, DU1_DG0_MARK, 1716 + DU1_DB7_MARK, DU1_DB6_MARK, DU1_DB5_MARK, DU1_DB4_MARK, 1717 + DU1_DB3_MARK, DU1_DB2_MARK, DU1_DB1_MARK, DU1_DB0_MARK, 1718 + }; 1719 + static const unsigned int du_clk_out_0_pins[] = { 1720 + /* CLKOUT */ 1721 + RCAR_GP_PIN(3, 25), 1722 + }; 1723 + static const unsigned int du_clk_out_0_mux[] = { 1724 + DU1_DOTCLKOUT0_MARK 1725 + }; 1726 + static const unsigned int du_clk_out_1_pins[] = { 1727 + /* CLKOUT */ 1728 + RCAR_GP_PIN(3, 26), 1729 + }; 1730 + static const unsigned int du_clk_out_1_mux[] = { 1731 + DU1_DOTCLKOUT1_MARK 1732 + }; 1733 + static const unsigned int du_sync_1_pins[] = { 1734 + /* EXVSYNC/VSYNC, EXHSYNC/HSYNC, EXDISP/EXODDF/EXCDE */ 1735 + RCAR_GP_PIN(3, 29), RCAR_GP_PIN(3, 28), RCAR_GP_PIN(3, 27), 1736 + }; 1737 + static const unsigned int du_sync_1_mux[] = { 1738 + DU1_EXODDF_DU1_ODDF_DISP_CDE_MARK, 1739 + DU1_EXVSYNC_DU1_VSYNC_MARK, DU1_EXHSYNC_DU1_HSYNC_MARK 1740 + }; 1741 + static const unsigned int du_cde_disp_pins[] = { 1742 + /* CDE DISP */ 1743 + RCAR_GP_PIN(3, 31), RCAR_GP_PIN(3, 30), 1744 + }; 1745 + static const unsigned int du0_clk_in_pins[] = { 1746 + /* CLKIN */ 1747 + RCAR_GP_PIN(6, 31), 1748 + }; 1749 + static const unsigned int du0_clk_in_mux[] = { 1750 + DU0_DOTCLKIN_MARK 1751 + }; 1752 + static const unsigned int du_cde_disp_mux[] = { 1753 + DU1_CDE_MARK, DU1_DISP_MARK 1754 + }; 1755 + static const unsigned int du1_clk_in_pins[] = { 1756 + /* CLKIN */ 1757 + RCAR_GP_PIN(7, 20), RCAR_GP_PIN(7, 19), RCAR_GP_PIN(3, 24), 1758 + }; 1759 + static const unsigned int du1_clk_in_mux[] = { 1760 + DU1_DOTCLKIN_C_MARK, DU1_DOTCLKIN_B_MARK, DU1_DOTCLKIN_MARK 1761 + }; 1762 + /* - ETH -------------------------------------------------------------------- */ 1763 + static const unsigned int eth_link_pins[] = { 1764 + /* LINK */ 1765 + RCAR_GP_PIN(5, 18), 1766 + }; 1767 + static const unsigned int eth_link_mux[] = { 1768 + ETH_LINK_MARK, 1769 + }; 1770 + static const unsigned int eth_magic_pins[] = { 1771 + /* MAGIC */ 1772 + RCAR_GP_PIN(5, 22), 1773 + }; 1774 + static const unsigned int eth_magic_mux[] = { 1775 + ETH_MAGIC_MARK, 1776 + }; 1777 + static const unsigned int eth_mdio_pins[] = { 1778 + /* MDC, MDIO */ 1779 + RCAR_GP_PIN(5, 24), RCAR_GP_PIN(5, 13), 1780 + }; 1781 + static const unsigned int eth_mdio_mux[] = { 1782 + ETH_MDC_MARK, ETH_MDIO_MARK, 1783 + }; 1784 + static const unsigned int eth_rmii_pins[] = { 1785 + /* RXD[0:1], RX_ER, CRS_DV, TXD[0:1], TX_EN, REF_CLK */ 1786 + RCAR_GP_PIN(5, 16), RCAR_GP_PIN(5, 17), RCAR_GP_PIN(5, 15), 1787 + RCAR_GP_PIN(5, 14), RCAR_GP_PIN(5, 23), RCAR_GP_PIN(5, 20), 1788 + RCAR_GP_PIN(5, 21), RCAR_GP_PIN(5, 19), 1789 + }; 1790 + static const unsigned int eth_rmii_mux[] = { 1791 + ETH_RXD0_MARK, ETH_RXD1_MARK, ETH_RX_ER_MARK, ETH_CRS_DV_MARK, 1792 + ETH_TXD0_MARK, ETH_TXD1_MARK, ETH_TX_EN_MARK, ETH_REFCLK_MARK, 1793 + }; 1794 + /* - INTC ------------------------------------------------------------------- */ 1795 + static const unsigned int intc_irq0_pins[] = { 1796 + /* IRQ */ 1797 + RCAR_GP_PIN(7, 10), 1798 + }; 1799 + static const unsigned int intc_irq0_mux[] = { 1800 + IRQ0_MARK, 1801 + }; 1802 + static const unsigned int intc_irq1_pins[] = { 1803 + /* IRQ */ 1804 + RCAR_GP_PIN(7, 11), 1805 + }; 1806 + static const unsigned int intc_irq1_mux[] = { 1807 + IRQ1_MARK, 1808 + }; 1809 + static const unsigned int intc_irq2_pins[] = { 1810 + /* IRQ */ 1811 + RCAR_GP_PIN(7, 12), 1812 + }; 1813 + static const unsigned int intc_irq2_mux[] = { 1814 + IRQ2_MARK, 1815 + }; 1816 + static const unsigned int intc_irq3_pins[] = { 1817 + /* IRQ */ 1818 + RCAR_GP_PIN(7, 13), 1819 + }; 1820 + static const unsigned int intc_irq3_mux[] = { 1821 + IRQ3_MARK, 1822 + }; 1823 + /* - MMCIF ------------------------------------------------------------------ */ 1824 + static const unsigned int mmc_data1_pins[] = { 1825 + /* D[0] */ 1826 + RCAR_GP_PIN(6, 18), 1827 + }; 1828 + static const unsigned int mmc_data1_mux[] = { 1829 + MMC_D0_MARK, 1830 + }; 1831 + static const unsigned int mmc_data4_pins[] = { 1832 + /* D[0:3] */ 1833 + RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19), 1834 + RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 21), 1835 + }; 1836 + static const unsigned int mmc_data4_mux[] = { 1837 + MMC_D0_MARK, MMC_D1_MARK, MMC_D2_MARK, MMC_D3_MARK, 1838 + }; 1839 + static const unsigned int mmc_data8_pins[] = { 1840 + /* D[0:7] */ 1841 + RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19), 1842 + RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 21), 1843 + RCAR_GP_PIN(6, 22), RCAR_GP_PIN(6, 23), 1844 + RCAR_GP_PIN(6, 28), RCAR_GP_PIN(6, 29), 1845 + }; 1846 + static const unsigned int mmc_data8_mux[] = { 1847 + MMC_D0_MARK, MMC_D1_MARK, MMC_D2_MARK, MMC_D3_MARK, 1848 + MMC_D4_MARK, MMC_D5_MARK, MMC_D6_MARK, MMC_D7_MARK, 1849 + }; 1850 + static const unsigned int mmc_ctrl_pins[] = { 1851 + /* CLK, CMD */ 1852 + RCAR_GP_PIN(6, 16), RCAR_GP_PIN(6, 17), 1853 + }; 1854 + static const unsigned int mmc_ctrl_mux[] = { 1855 + MMC_CLK_MARK, MMC_CMD_MARK, 1856 + }; 1857 + /* - MSIOF0 ----------------------------------------------------------------- */ 1858 + static const unsigned int msiof0_clk_pins[] = { 1859 + /* SCK */ 1860 + RCAR_GP_PIN(6, 24), 1861 + }; 1862 + static const unsigned int msiof0_clk_mux[] = { 1863 + MSIOF0_SCK_MARK, 1864 + }; 1865 + static const unsigned int msiof0_sync_pins[] = { 1866 + /* SYNC */ 1867 + RCAR_GP_PIN(6, 25), 1868 + }; 1869 + static const unsigned int msiof0_sync_mux[] = { 1870 + MSIOF0_SYNC_MARK, 1871 + }; 1872 + static const unsigned int msiof0_ss1_pins[] = { 1873 + /* SS1 */ 1874 + RCAR_GP_PIN(6, 28), 1875 + }; 1876 + static const unsigned int msiof0_ss1_mux[] = { 1877 + MSIOF0_SS1_MARK, 1878 + }; 1879 + static const unsigned int msiof0_ss2_pins[] = { 1880 + /* SS2 */ 1881 + RCAR_GP_PIN(6, 29), 1882 + }; 1883 + static const unsigned int msiof0_ss2_mux[] = { 1884 + MSIOF0_SS2_MARK, 1885 + }; 1886 + static const unsigned int msiof0_rx_pins[] = { 1887 + /* RXD */ 1888 + RCAR_GP_PIN(6, 27), 1889 + }; 1890 + static const unsigned int msiof0_rx_mux[] = { 1891 + MSIOF0_RXD_MARK, 1892 + }; 1893 + static const unsigned int msiof0_tx_pins[] = { 1894 + /* TXD */ 1895 + RCAR_GP_PIN(6, 26), 1896 + }; 1897 + static const unsigned int msiof0_tx_mux[] = { 1898 + MSIOF0_TXD_MARK, 1899 + }; 1900 + /* - MSIOF1 ----------------------------------------------------------------- */ 1901 + static const unsigned int msiof1_clk_pins[] = { 1902 + /* SCK */ 1903 + RCAR_GP_PIN(0, 22), 1904 + }; 1905 + static const unsigned int msiof1_clk_mux[] = { 1906 + MSIOF1_SCK_MARK, 1907 + }; 1908 + static const unsigned int msiof1_sync_pins[] = { 1909 + /* SYNC */ 1910 + RCAR_GP_PIN(0, 23), 1911 + }; 1912 + static const unsigned int msiof1_sync_mux[] = { 1913 + MSIOF1_SYNC_MARK, 1914 + }; 1915 + static const unsigned int msiof1_ss1_pins[] = { 1916 + /* SS1 */ 1917 + RCAR_GP_PIN(0, 24), 1918 + }; 1919 + static const unsigned int msiof1_ss1_mux[] = { 1920 + MSIOF1_SS1_MARK, 1921 + }; 1922 + static const unsigned int msiof1_ss2_pins[] = { 1923 + /* SS2 */ 1924 + RCAR_GP_PIN(0, 25), 1925 + }; 1926 + static const unsigned int msiof1_ss2_mux[] = { 1927 + MSIOF1_SS2_MARK, 1928 + }; 1929 + static const unsigned int msiof1_rx_pins[] = { 1930 + /* RXD */ 1931 + RCAR_GP_PIN(0, 27), 1932 + }; 1933 + static const unsigned int msiof1_rx_mux[] = { 1934 + MSIOF1_RXD_MARK, 1935 + }; 1936 + static const unsigned int msiof1_tx_pins[] = { 1937 + /* TXD */ 1938 + RCAR_GP_PIN(0, 26), 1939 + }; 1940 + static const unsigned int msiof1_tx_mux[] = { 1941 + MSIOF1_TXD_MARK, 1942 + }; 1943 + /* - MSIOF2 ----------------------------------------------------------------- */ 1944 + static const unsigned int msiof2_clk_pins[] = { 1945 + /* SCK */ 1946 + RCAR_GP_PIN(1, 13), 1947 + }; 1948 + static const unsigned int msiof2_clk_mux[] = { 1949 + MSIOF2_SCK_MARK, 1950 + }; 1951 + static const unsigned int msiof2_sync_pins[] = { 1952 + /* SYNC */ 1953 + RCAR_GP_PIN(1, 14), 1954 + }; 1955 + static const unsigned int msiof2_sync_mux[] = { 1956 + MSIOF2_SYNC_MARK, 1957 + }; 1958 + static const unsigned int msiof2_ss1_pins[] = { 1959 + /* SS1 */ 1960 + RCAR_GP_PIN(1, 17), 1961 + }; 1962 + static const unsigned int msiof2_ss1_mux[] = { 1963 + MSIOF2_SS1_MARK, 1964 + }; 1965 + static const unsigned int msiof2_ss2_pins[] = { 1966 + /* SS2 */ 1967 + RCAR_GP_PIN(1, 18), 1968 + }; 1969 + static const unsigned int msiof2_ss2_mux[] = { 1970 + MSIOF2_SS2_MARK, 1971 + }; 1972 + static const unsigned int msiof2_rx_pins[] = { 1973 + /* RXD */ 1974 + RCAR_GP_PIN(1, 16), 1975 + }; 1976 + static const unsigned int msiof2_rx_mux[] = { 1977 + MSIOF2_RXD_MARK, 1978 + }; 1979 + static const unsigned int msiof2_tx_pins[] = { 1980 + /* TXD */ 1981 + RCAR_GP_PIN(1, 15), 1982 + }; 1983 + static const unsigned int msiof2_tx_mux[] = { 1984 + MSIOF2_TXD_MARK, 1985 + }; 1986 + /* - SCIF0 ------------------------------------------------------------------ */ 1987 + static const unsigned int scif0_data_pins[] = { 1988 + /* RX, TX */ 1989 + RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6), 1990 + }; 1991 + static const unsigned int scif0_data_mux[] = { 1992 + RX0_MARK, TX0_MARK, 1993 + }; 1994 + static const unsigned int scif0_data_b_pins[] = { 1995 + /* RX, TX */ 1996 + RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 0), 1997 + }; 1998 + static const unsigned int scif0_data_b_mux[] = { 1999 + RX0_B_MARK, TX0_B_MARK, 2000 + }; 2001 + static const unsigned int scif0_data_c_pins[] = { 2002 + /* RX, TX */ 2003 + RCAR_GP_PIN(4, 26), RCAR_GP_PIN(4, 25), 2004 + }; 2005 + static const unsigned int scif0_data_c_mux[] = { 2006 + RX0_C_MARK, TX0_C_MARK, 2007 + }; 2008 + static const unsigned int scif0_data_d_pins[] = { 2009 + /* RX, TX */ 2010 + RCAR_GP_PIN(2, 23), RCAR_GP_PIN(2, 22), 2011 + }; 2012 + static const unsigned int scif0_data_d_mux[] = { 2013 + RX0_D_MARK, TX0_D_MARK, 2014 + }; 2015 + static const unsigned int scif0_data_e_pins[] = { 2016 + /* RX, TX */ 2017 + RCAR_GP_PIN(6, 29), RCAR_GP_PIN(6, 28), 2018 + }; 2019 + static const unsigned int scif0_data_e_mux[] = { 2020 + RX0_E_MARK, TX0_E_MARK, 2021 + }; 2022 + /* - SCIF1 ------------------------------------------------------------------ */ 2023 + static const unsigned int scif1_data_pins[] = { 2024 + /* RX, TX */ 2025 + RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 8), 2026 + }; 2027 + static const unsigned int scif1_data_mux[] = { 2028 + RX1_MARK, TX1_MARK, 2029 + }; 2030 + static const unsigned int scif1_data_b_pins[] = { 2031 + /* RX, TX */ 2032 + RCAR_GP_PIN(3, 9), RCAR_GP_PIN(3, 8), 2033 + }; 2034 + static const unsigned int scif1_data_b_mux[] = { 2035 + RX1_B_MARK, TX1_B_MARK, 2036 + }; 2037 + static const unsigned int scif1_clk_b_pins[] = { 2038 + /* SCK */ 2039 + RCAR_GP_PIN(3, 10), 2040 + }; 2041 + static const unsigned int scif1_clk_b_mux[] = { 2042 + SCIF1_SCK_B_MARK, 2043 + }; 2044 + static const unsigned int scif1_data_c_pins[] = { 2045 + /* RX, TX */ 2046 + RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 27), 2047 + }; 2048 + static const unsigned int scif1_data_c_mux[] = { 2049 + RX1_C_MARK, TX1_C_MARK, 2050 + }; 2051 + static const unsigned int scif1_data_d_pins[] = { 2052 + /* RX, TX */ 2053 + RCAR_GP_PIN(2, 25), RCAR_GP_PIN(2, 24), 2054 + }; 2055 + static const unsigned int scif1_data_d_mux[] = { 2056 + RX1_D_MARK, TX1_D_MARK, 2057 + }; 2058 + /* - SCIF2 ------------------------------------------------------------------ */ 2059 + static const unsigned int scif2_data_pins[] = { 2060 + /* RX, TX */ 2061 + RCAR_GP_PIN(2, 30), RCAR_GP_PIN(2, 31), 2062 + }; 2063 + static const unsigned int scif2_data_mux[] = { 2064 + RX2_MARK, TX2_MARK, 2065 + }; 2066 + static const unsigned int scif2_data_b_pins[] = { 2067 + /* RX, TX */ 2068 + RCAR_GP_PIN(3, 17), RCAR_GP_PIN(3, 16), 2069 + }; 2070 + static const unsigned int scif2_data_b_mux[] = { 2071 + RX2_B_MARK, TX2_B_MARK, 2072 + }; 2073 + static const unsigned int scif2_clk_b_pins[] = { 2074 + /* SCK */ 2075 + RCAR_GP_PIN(3, 18), 2076 + }; 2077 + static const unsigned int scif2_clk_b_mux[] = { 2078 + SCIF2_SCK_B_MARK, 2079 + }; 2080 + static const unsigned int scif2_data_c_pins[] = { 2081 + /* RX, TX */ 2082 + RCAR_GP_PIN(6, 24), RCAR_GP_PIN(6, 25), 2083 + }; 2084 + static const unsigned int scif2_data_c_mux[] = { 2085 + RX2_C_MARK, TX2_C_MARK, 2086 + }; 2087 + static const unsigned int scif2_data_e_pins[] = { 2088 + /* RX, TX */ 2089 + RCAR_GP_PIN(2, 7), RCAR_GP_PIN(2, 8), 2090 + }; 2091 + static const unsigned int scif2_data_e_mux[] = { 2092 + RX2_E_MARK, TX2_E_MARK, 2093 + }; 2094 + /* - SCIF3 ------------------------------------------------------------------ */ 2095 + static const unsigned int scif3_data_pins[] = { 2096 + /* RX, TX */ 2097 + RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), 2098 + }; 2099 + static const unsigned int scif3_data_mux[] = { 2100 + RX3_MARK, TX3_MARK, 2101 + }; 2102 + static const unsigned int scif3_clk_pins[] = { 2103 + /* SCK */ 2104 + RCAR_GP_PIN(3, 23), 2105 + }; 2106 + static const unsigned int scif3_clk_mux[] = { 2107 + SCIF3_SCK_MARK, 2108 + }; 2109 + static const unsigned int scif3_data_b_pins[] = { 2110 + /* RX, TX */ 2111 + RCAR_GP_PIN(3, 29), RCAR_GP_PIN(3, 26), 2112 + }; 2113 + static const unsigned int scif3_data_b_mux[] = { 2114 + RX3_B_MARK, TX3_B_MARK, 2115 + }; 2116 + static const unsigned int scif3_clk_b_pins[] = { 2117 + /* SCK */ 2118 + RCAR_GP_PIN(4, 8), 2119 + }; 2120 + static const unsigned int scif3_clk_b_mux[] = { 2121 + SCIF3_SCK_B_MARK, 2122 + }; 2123 + static const unsigned int scif3_data_c_pins[] = { 2124 + /* RX, TX */ 2125 + RCAR_GP_PIN(6, 7), RCAR_GP_PIN(6, 6), 2126 + }; 2127 + static const unsigned int scif3_data_c_mux[] = { 2128 + RX3_C_MARK, TX3_C_MARK, 2129 + }; 2130 + static const unsigned int scif3_data_d_pins[] = { 2131 + /* RX, TX */ 2132 + RCAR_GP_PIN(2, 27), RCAR_GP_PIN(2, 26), 2133 + }; 2134 + static const unsigned int scif3_data_d_mux[] = { 2135 + RX3_D_MARK, TX3_D_MARK, 2136 + }; 2137 + /* - SCIF4 ------------------------------------------------------------------ */ 2138 + static const unsigned int scif4_data_pins[] = { 2139 + /* RX, TX */ 2140 + RCAR_GP_PIN(4, 2), RCAR_GP_PIN(4, 1), 2141 + }; 2142 + static const unsigned int scif4_data_mux[] = { 2143 + RX4_MARK, TX4_MARK, 2144 + }; 2145 + static const unsigned int scif4_data_b_pins[] = { 2146 + /* RX, TX */ 2147 + RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 0), 2148 + }; 2149 + static const unsigned int scif4_data_b_mux[] = { 2150 + RX4_B_MARK, TX4_B_MARK, 2151 + }; 2152 + static const unsigned int scif4_data_c_pins[] = { 2153 + /* RX, TX */ 2154 + RCAR_GP_PIN(7, 22), RCAR_GP_PIN(7, 21), 2155 + }; 2156 + static const unsigned int scif4_data_c_mux[] = { 2157 + RX4_C_MARK, TX4_C_MARK, 2158 + }; 2159 + /* - SCIF5 ------------------------------------------------------------------ */ 2160 + static const unsigned int scif5_data_pins[] = { 2161 + /* RX, TX */ 2162 + RCAR_GP_PIN(4, 4), RCAR_GP_PIN(4, 3), 2163 + }; 2164 + static const unsigned int scif5_data_mux[] = { 2165 + RX5_MARK, TX5_MARK, 2166 + }; 2167 + static const unsigned int scif5_data_b_pins[] = { 2168 + /* RX, TX */ 2169 + RCAR_GP_PIN(6, 23), RCAR_GP_PIN(6, 22), 2170 + }; 2171 + static const unsigned int scif5_data_b_mux[] = { 2172 + RX5_B_MARK, TX5_B_MARK, 2173 + }; 2174 + /* - SCIFA0 ----------------------------------------------------------------- */ 2175 + static const unsigned int scifa0_data_pins[] = { 2176 + /* RXD, TXD */ 2177 + RCAR_GP_PIN(1, 7), RCAR_GP_PIN(1, 6), 2178 + }; 2179 + static const unsigned int scifa0_data_mux[] = { 2180 + SCIFA0_RXD_MARK, SCIFA0_TXD_MARK, 2181 + }; 2182 + static const unsigned int scifa0_data_b_pins[] = { 2183 + /* RXD, TXD */ 2184 + RCAR_GP_PIN(3, 1), RCAR_GP_PIN(3, 0), 2185 + }; 2186 + static const unsigned int scifa0_data_b_mux[] = { 2187 + SCIFA0_RXD_B_MARK, SCIFA0_TXD_B_MARK 2188 + }; 2189 + /* - SCIFA1 ----------------------------------------------------------------- */ 2190 + static const unsigned int scifa1_data_pins[] = { 2191 + /* RXD, TXD */ 2192 + RCAR_GP_PIN(1, 9), RCAR_GP_PIN(1, 8), 2193 + }; 2194 + static const unsigned int scifa1_data_mux[] = { 2195 + SCIFA1_RXD_MARK, SCIFA1_TXD_MARK, 2196 + }; 2197 + static const unsigned int scifa1_clk_pins[] = { 2198 + /* SCK */ 2199 + RCAR_GP_PIN(3, 10), 2200 + }; 2201 + static const unsigned int scifa1_clk_mux[] = { 2202 + SCIFA1_SCK_MARK, 2203 + }; 2204 + static const unsigned int scifa1_data_b_pins[] = { 2205 + /* RXD, TXD */ 2206 + RCAR_GP_PIN(3, 9), RCAR_GP_PIN(3, 8), 2207 + }; 2208 + static const unsigned int scifa1_data_b_mux[] = { 2209 + SCIFA1_RXD_B_MARK, SCIFA1_TXD_B_MARK, 2210 + }; 2211 + static const unsigned int scifa1_clk_b_pins[] = { 2212 + /* SCK */ 2213 + RCAR_GP_PIN(1, 0), 2214 + }; 2215 + static const unsigned int scifa1_clk_b_mux[] = { 2216 + SCIFA1_SCK_B_MARK, 2217 + }; 2218 + static const unsigned int scifa1_data_c_pins[] = { 2219 + /* RXD, TXD */ 2220 + RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3), 2221 + }; 2222 + static const unsigned int scifa1_data_c_mux[] = { 2223 + SCIFA1_RXD_C_MARK, SCIFA1_TXD_C_MARK, 2224 + }; 2225 + /* - SCIFA2 ----------------------------------------------------------------- */ 2226 + static const unsigned int scifa2_data_pins[] = { 2227 + /* RXD, TXD */ 2228 + RCAR_GP_PIN(2, 30), RCAR_GP_PIN(2, 31), 2229 + }; 2230 + static const unsigned int scifa2_data_mux[] = { 2231 + SCIFA2_RXD_MARK, SCIFA2_TXD_MARK, 2232 + }; 2233 + static const unsigned int scifa2_clk_pins[] = { 2234 + /* SCK */ 2235 + RCAR_GP_PIN(3, 18), 2236 + }; 2237 + static const unsigned int scifa2_clk_mux[] = { 2238 + SCIFA2_SCK_MARK, 2239 + }; 2240 + static const unsigned int scifa2_data_b_pins[] = { 2241 + /* RXD, TXD */ 2242 + RCAR_GP_PIN(3, 17), RCAR_GP_PIN(3, 16), 2243 + }; 2244 + static const unsigned int scifa2_data_b_mux[] = { 2245 + SCIFA2_RXD_B_MARK, SCIFA2_TXD_B_MARK, 2246 + }; 2247 + /* - SCIFA3 ----------------------------------------------------------------- */ 2248 + static const unsigned int scifa3_data_pins[] = { 2249 + /* RXD, TXD */ 2250 + RCAR_GP_PIN(3, 22), RCAR_GP_PIN(3, 21), 2251 + }; 2252 + static const unsigned int scifa3_data_mux[] = { 2253 + SCIFA3_RXD_MARK, SCIFA3_TXD_MARK, 2254 + }; 2255 + static const unsigned int scifa3_clk_pins[] = { 2256 + /* SCK */ 2257 + RCAR_GP_PIN(3, 23), 2258 + }; 2259 + static const unsigned int scifa3_clk_mux[] = { 2260 + SCIFA3_SCK_MARK, 2261 + }; 2262 + static const unsigned int scifa3_data_b_pins[] = { 2263 + /* RXD, TXD */ 2264 + RCAR_GP_PIN(5, 19), RCAR_GP_PIN(5, 20), 2265 + }; 2266 + static const unsigned int scifa3_data_b_mux[] = { 2267 + SCIFA3_RXD_B_MARK, SCIFA3_TXD_B_MARK, 2268 + }; 2269 + static const unsigned int scifa3_clk_b_pins[] = { 2270 + /* SCK */ 2271 + RCAR_GP_PIN(4, 8), 2272 + }; 2273 + static const unsigned int scifa3_clk_b_mux[] = { 2274 + SCIFA3_SCK_B_MARK, 2275 + }; 2276 + static const unsigned int scifa3_data_c_pins[] = { 2277 + /* RXD, TXD */ 2278 + RCAR_GP_PIN(7, 21), RCAR_GP_PIN(7, 20), 2279 + }; 2280 + static const unsigned int scifa3_data_c_mux[] = { 2281 + SCIFA3_RXD_C_MARK, SCIFA3_TXD_C_MARK, 2282 + }; 2283 + static const unsigned int scifa3_clk_c_pins[] = { 2284 + /* SCK */ 2285 + RCAR_GP_PIN(7, 22), 2286 + }; 2287 + static const unsigned int scifa3_clk_c_mux[] = { 2288 + SCIFA3_SCK_C_MARK, 2289 + }; 2290 + /* - SCIFA4 ----------------------------------------------------------------- */ 2291 + static const unsigned int scifa4_data_pins[] = { 2292 + /* RXD, TXD */ 2293 + RCAR_GP_PIN(4, 2), RCAR_GP_PIN(4, 1), 2294 + }; 2295 + static const unsigned int scifa4_data_mux[] = { 2296 + SCIFA4_RXD_MARK, SCIFA4_TXD_MARK, 2297 + }; 2298 + static const unsigned int scifa4_data_b_pins[] = { 2299 + /* RXD, TXD */ 2300 + RCAR_GP_PIN(5, 1), RCAR_GP_PIN(5, 0), 2301 + }; 2302 + static const unsigned int scifa4_data_b_mux[] = { 2303 + SCIFA4_RXD_B_MARK, SCIFA4_TXD_B_MARK, 2304 + }; 2305 + static const unsigned int scifa4_data_c_pins[] = { 2306 + /* RXD, TXD */ 2307 + RCAR_GP_PIN(7, 22), RCAR_GP_PIN(7, 21), 2308 + }; 2309 + static const unsigned int scifa4_data_c_mux[] = { 2310 + SCIFA4_RXD_C_MARK, SCIFA4_TXD_C_MARK, 2311 + }; 2312 + /* - SCIFA5 ----------------------------------------------------------------- */ 2313 + static const unsigned int scifa5_data_pins[] = { 2314 + /* RXD, TXD */ 2315 + RCAR_GP_PIN(4, 4), RCAR_GP_PIN(4, 3), 2316 + }; 2317 + static const unsigned int scifa5_data_mux[] = { 2318 + SCIFA5_RXD_MARK, SCIFA5_TXD_MARK, 2319 + }; 2320 + static const unsigned int scifa5_data_b_pins[] = { 2321 + /* RXD, TXD */ 2322 + RCAR_GP_PIN(6, 7), RCAR_GP_PIN(6, 6), 2323 + }; 2324 + static const unsigned int scifa5_data_b_mux[] = { 2325 + SCIFA5_RXD_B_MARK, SCIFA5_TXD_B_MARK, 2326 + }; 2327 + static const unsigned int scifa5_data_c_pins[] = { 2328 + /* RXD, TXD */ 2329 + RCAR_GP_PIN(6, 23), RCAR_GP_PIN(6, 22), 2330 + }; 2331 + static const unsigned int scifa5_data_c_mux[] = { 2332 + SCIFA5_RXD_C_MARK, SCIFA5_TXD_C_MARK, 2333 + }; 2334 + /* - SCIFB0 ----------------------------------------------------------------- */ 2335 + static const unsigned int scifb0_data_pins[] = { 2336 + /* RXD, TXD */ 2337 + RCAR_GP_PIN(7, 3), RCAR_GP_PIN(7, 4), 2338 + }; 2339 + static const unsigned int scifb0_data_mux[] = { 2340 + SCIFB0_RXD_MARK, SCIFB0_TXD_MARK, 2341 + }; 2342 + static const unsigned int scifb0_clk_pins[] = { 2343 + /* SCK */ 2344 + RCAR_GP_PIN(7, 2), 2345 + }; 2346 + static const unsigned int scifb0_clk_mux[] = { 2347 + SCIFB0_SCK_MARK, 2348 + }; 2349 + static const unsigned int scifb0_ctrl_pins[] = { 2350 + /* RTS, CTS */ 2351 + RCAR_GP_PIN(7, 1), RCAR_GP_PIN(7, 0), 2352 + }; 2353 + static const unsigned int scifb0_ctrl_mux[] = { 2354 + SCIFB0_RTS_N_MARK, SCIFB0_CTS_N_MARK, 2355 + }; 2356 + static const unsigned int scifb0_data_b_pins[] = { 2357 + /* RXD, TXD */ 2358 + RCAR_GP_PIN(1, 20), RCAR_GP_PIN(1, 21), 2359 + }; 2360 + static const unsigned int scifb0_data_b_mux[] = { 2361 + SCIFB0_RXD_B_MARK, SCIFB0_TXD_B_MARK, 2362 + }; 2363 + static const unsigned int scifb0_clk_b_pins[] = { 2364 + /* SCK */ 2365 + RCAR_GP_PIN(5, 31), 2366 + }; 2367 + static const unsigned int scifb0_clk_b_mux[] = { 2368 + SCIFB0_SCK_B_MARK, 2369 + }; 2370 + static const unsigned int scifb0_ctrl_b_pins[] = { 2371 + /* RTS, CTS */ 2372 + RCAR_GP_PIN(1, 22), RCAR_GP_PIN(1, 23), 2373 + }; 2374 + static const unsigned int scifb0_ctrl_b_mux[] = { 2375 + SCIFB0_RTS_N_B_MARK, SCIFB0_CTS_N_B_MARK, 2376 + }; 2377 + static const unsigned int scifb0_data_c_pins[] = { 2378 + /* RXD, TXD */ 2379 + RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1), 2380 + }; 2381 + static const unsigned int scifb0_data_c_mux[] = { 2382 + SCIFB0_RXD_C_MARK, SCIFB0_TXD_C_MARK, 2383 + }; 2384 + static const unsigned int scifb0_clk_c_pins[] = { 2385 + /* SCK */ 2386 + RCAR_GP_PIN(2, 30), 2387 + }; 2388 + static const unsigned int scifb0_clk_c_mux[] = { 2389 + SCIFB0_SCK_C_MARK, 2390 + }; 2391 + static const unsigned int scifb0_data_d_pins[] = { 2392 + /* RXD, TXD */ 2393 + RCAR_GP_PIN(4, 28), RCAR_GP_PIN(4, 18), 2394 + }; 2395 + static const unsigned int scifb0_data_d_mux[] = { 2396 + SCIFB0_RXD_D_MARK, SCIFB0_TXD_D_MARK, 2397 + }; 2398 + static const unsigned int scifb0_clk_d_pins[] = { 2399 + /* SCK */ 2400 + RCAR_GP_PIN(4, 17), 2401 + }; 2402 + static const unsigned int scifb0_clk_d_mux[] = { 2403 + SCIFB0_SCK_D_MARK, 2404 + }; 2405 + /* - SCIFB1 ----------------------------------------------------------------- */ 2406 + static const unsigned int scifb1_data_pins[] = { 2407 + /* RXD, TXD */ 2408 + RCAR_GP_PIN(7, 5), RCAR_GP_PIN(7, 6), 2409 + }; 2410 + static const unsigned int scifb1_data_mux[] = { 2411 + SCIFB1_RXD_MARK, SCIFB1_TXD_MARK, 2412 + }; 2413 + static const unsigned int scifb1_clk_pins[] = { 2414 + /* SCK */ 2415 + RCAR_GP_PIN(7, 7), 2416 + }; 2417 + static const unsigned int scifb1_clk_mux[] = { 2418 + SCIFB1_SCK_MARK, 2419 + }; 2420 + static const unsigned int scifb1_ctrl_pins[] = { 2421 + /* RTS, CTS */ 2422 + RCAR_GP_PIN(7, 9), RCAR_GP_PIN(7, 8), 2423 + }; 2424 + static const unsigned int scifb1_ctrl_mux[] = { 2425 + SCIFB1_RTS_N_MARK, SCIFB1_CTS_N_MARK, 2426 + }; 2427 + static const unsigned int scifb1_data_b_pins[] = { 2428 + /* RXD, TXD */ 2429 + RCAR_GP_PIN(1, 17), RCAR_GP_PIN(1, 18), 2430 + }; 2431 + static const unsigned int scifb1_data_b_mux[] = { 2432 + SCIFB1_RXD_B_MARK, SCIFB1_TXD_B_MARK, 2433 + }; 2434 + static const unsigned int scifb1_clk_b_pins[] = { 2435 + /* SCK */ 2436 + RCAR_GP_PIN(1, 3), 2437 + }; 2438 + static const unsigned int scifb1_clk_b_mux[] = { 2439 + SCIFB1_SCK_B_MARK, 2440 + }; 2441 + static const unsigned int scifb1_data_c_pins[] = { 2442 + /* RXD, TXD */ 2443 + RCAR_GP_PIN(1, 2), RCAR_GP_PIN(1, 3), 2444 + }; 2445 + static const unsigned int scifb1_data_c_mux[] = { 2446 + SCIFB1_RXD_C_MARK, SCIFB1_TXD_C_MARK, 2447 + }; 2448 + static const unsigned int scifb1_clk_c_pins[] = { 2449 + /* SCK */ 2450 + RCAR_GP_PIN(7, 11), 2451 + }; 2452 + static const unsigned int scifb1_clk_c_mux[] = { 2453 + SCIFB1_SCK_C_MARK, 2454 + }; 2455 + static const unsigned int scifb1_data_d_pins[] = { 2456 + /* RXD, TXD */ 2457 + RCAR_GP_PIN(7, 10), RCAR_GP_PIN(7, 12), 2458 + }; 2459 + static const unsigned int scifb1_data_d_mux[] = { 2460 + SCIFB1_RXD_D_MARK, SCIFB1_TXD_D_MARK, 2461 + }; 2462 + /* - SCIFB2 ----------------------------------------------------------------- */ 2463 + static const unsigned int scifb2_data_pins[] = { 2464 + /* RXD, TXD */ 2465 + RCAR_GP_PIN(4, 16), RCAR_GP_PIN(4, 17), 2466 + }; 2467 + static const unsigned int scifb2_data_mux[] = { 2468 + SCIFB2_RXD_MARK, SCIFB2_TXD_MARK, 2469 + }; 2470 + static const unsigned int scifb2_clk_pins[] = { 2471 + /* SCK */ 2472 + RCAR_GP_PIN(4, 15), 2473 + }; 2474 + static const unsigned int scifb2_clk_mux[] = { 2475 + SCIFB2_SCK_MARK, 2476 + }; 2477 + static const unsigned int scifb2_ctrl_pins[] = { 2478 + /* RTS, CTS */ 2479 + RCAR_GP_PIN(4, 14), RCAR_GP_PIN(4, 13), 2480 + }; 2481 + static const unsigned int scifb2_ctrl_mux[] = { 2482 + SCIFB2_RTS_N_MARK, SCIFB2_CTS_N_MARK, 2483 + }; 2484 + static const unsigned int scifb2_data_b_pins[] = { 2485 + /* RXD, TXD */ 2486 + RCAR_GP_PIN(3, 12), RCAR_GP_PIN(3, 13), 2487 + }; 2488 + static const unsigned int scifb2_data_b_mux[] = { 2489 + SCIFB2_RXD_B_MARK, SCIFB2_TXD_B_MARK, 2490 + }; 2491 + static const unsigned int scifb2_clk_b_pins[] = { 2492 + /* SCK */ 2493 + RCAR_GP_PIN(5, 31), 2494 + }; 2495 + static const unsigned int scifb2_clk_b_mux[] = { 2496 + SCIFB2_SCK_B_MARK, 2497 + }; 2498 + static const unsigned int scifb2_ctrl_b_pins[] = { 2499 + /* RTS, CTS */ 2500 + RCAR_GP_PIN(3, 15), RCAR_GP_PIN(3, 14), 2501 + }; 2502 + static const unsigned int scifb2_ctrl_b_mux[] = { 2503 + SCIFB2_RTS_N_B_MARK, SCIFB2_CTS_N_B_MARK, 2504 + }; 2505 + static const unsigned int scifb2_data_c_pins[] = { 2506 + /* RXD, TXD */ 2507 + RCAR_GP_PIN(2, 0), RCAR_GP_PIN(2, 1), 2508 + }; 2509 + static const unsigned int scifb2_data_c_mux[] = { 2510 + SCIFB2_RXD_C_MARK, SCIFB2_TXD_C_MARK, 2511 + }; 2512 + static const unsigned int scifb2_clk_c_pins[] = { 2513 + /* SCK */ 2514 + RCAR_GP_PIN(5, 27), 2515 + }; 2516 + static const unsigned int scifb2_clk_c_mux[] = { 2517 + SCIFB2_SCK_C_MARK, 2518 + }; 2519 + static const unsigned int scifb2_data_d_pins[] = { 2520 + /* RXD, TXD */ 2521 + RCAR_GP_PIN(5, 26), RCAR_GP_PIN(5, 25), 2522 + }; 2523 + static const unsigned int scifb2_data_d_mux[] = { 2524 + SCIFB2_RXD_D_MARK, SCIFB2_TXD_D_MARK, 2525 + }; 2526 + /* - SDHI0 ------------------------------------------------------------------ */ 2527 + static const unsigned int sdhi0_data1_pins[] = { 2528 + /* D0 */ 2529 + RCAR_GP_PIN(6, 2), 2530 + }; 2531 + static const unsigned int sdhi0_data1_mux[] = { 2532 + SD0_DATA0_MARK, 2533 + }; 2534 + static const unsigned int sdhi0_data4_pins[] = { 2535 + /* D[0:3] */ 2536 + RCAR_GP_PIN(6, 2), RCAR_GP_PIN(6, 3), 2537 + RCAR_GP_PIN(6, 4), RCAR_GP_PIN(6, 5), 2538 + }; 2539 + static const unsigned int sdhi0_data4_mux[] = { 2540 + SD0_DATA0_MARK, SD0_DATA1_MARK, SD0_DATA2_MARK, SD0_DATA3_MARK, 2541 + }; 2542 + static const unsigned int sdhi0_ctrl_pins[] = { 2543 + /* CLK, CMD */ 2544 + RCAR_GP_PIN(6, 0), RCAR_GP_PIN(6, 1), 2545 + }; 2546 + static const unsigned int sdhi0_ctrl_mux[] = { 2547 + SD0_CLK_MARK, SD0_CMD_MARK, 2548 + }; 2549 + static const unsigned int sdhi0_cd_pins[] = { 2550 + /* CD */ 2551 + RCAR_GP_PIN(6, 6), 2552 + }; 2553 + static const unsigned int sdhi0_cd_mux[] = { 2554 + SD0_CD_MARK, 2555 + }; 2556 + static const unsigned int sdhi0_wp_pins[] = { 2557 + /* WP */ 2558 + RCAR_GP_PIN(6, 7), 2559 + }; 2560 + static const unsigned int sdhi0_wp_mux[] = { 2561 + SD0_WP_MARK, 2562 + }; 2563 + /* - SDHI1 ------------------------------------------------------------------ */ 2564 + static const unsigned int sdhi1_data1_pins[] = { 2565 + /* D0 */ 2566 + RCAR_GP_PIN(6, 10), 2567 + }; 2568 + static const unsigned int sdhi1_data1_mux[] = { 2569 + SD1_DATA0_MARK, 2570 + }; 2571 + static const unsigned int sdhi1_data4_pins[] = { 2572 + /* D[0:3] */ 2573 + RCAR_GP_PIN(6, 10), RCAR_GP_PIN(6, 11), 2574 + RCAR_GP_PIN(6, 12), RCAR_GP_PIN(6, 13), 2575 + }; 2576 + static const unsigned int sdhi1_data4_mux[] = { 2577 + SD1_DATA0_MARK, SD1_DATA1_MARK, SD1_DATA2_MARK, SD1_DATA3_MARK, 2578 + }; 2579 + static const unsigned int sdhi1_ctrl_pins[] = { 2580 + /* CLK, CMD */ 2581 + RCAR_GP_PIN(6, 8), RCAR_GP_PIN(6, 9), 2582 + }; 2583 + static const unsigned int sdhi1_ctrl_mux[] = { 2584 + SD1_CLK_MARK, SD1_CMD_MARK, 2585 + }; 2586 + static const unsigned int sdhi1_cd_pins[] = { 2587 + /* CD */ 2588 + RCAR_GP_PIN(6, 14), 2589 + }; 2590 + static const unsigned int sdhi1_cd_mux[] = { 2591 + SD1_CD_MARK, 2592 + }; 2593 + static const unsigned int sdhi1_wp_pins[] = { 2594 + /* WP */ 2595 + RCAR_GP_PIN(6, 15), 2596 + }; 2597 + static const unsigned int sdhi1_wp_mux[] = { 2598 + SD1_WP_MARK, 2599 + }; 2600 + /* - SDHI2 ------------------------------------------------------------------ */ 2601 + static const unsigned int sdhi2_data1_pins[] = { 2602 + /* D0 */ 2603 + RCAR_GP_PIN(6, 18), 2604 + }; 2605 + static const unsigned int sdhi2_data1_mux[] = { 2606 + SD2_DATA0_MARK, 2607 + }; 2608 + static const unsigned int sdhi2_data4_pins[] = { 2609 + /* D[0:3] */ 2610 + RCAR_GP_PIN(6, 18), RCAR_GP_PIN(6, 19), 2611 + RCAR_GP_PIN(6, 20), RCAR_GP_PIN(6, 21), 2612 + }; 2613 + static const unsigned int sdhi2_data4_mux[] = { 2614 + SD2_DATA0_MARK, SD2_DATA1_MARK, SD2_DATA2_MARK, SD2_DATA3_MARK, 2615 + }; 2616 + static const unsigned int sdhi2_ctrl_pins[] = { 2617 + /* CLK, CMD */ 2618 + RCAR_GP_PIN(6, 16), RCAR_GP_PIN(6, 17), 2619 + }; 2620 + static const unsigned int sdhi2_ctrl_mux[] = { 2621 + SD2_CLK_MARK, SD2_CMD_MARK, 2622 + }; 2623 + static const unsigned int sdhi2_cd_pins[] = { 2624 + /* CD */ 2625 + RCAR_GP_PIN(6, 22), 2626 + }; 2627 + static const unsigned int sdhi2_cd_mux[] = { 2628 + SD2_CD_MARK, 2629 + }; 2630 + static const unsigned int sdhi2_wp_pins[] = { 2631 + /* WP */ 2632 + RCAR_GP_PIN(6, 23), 2633 + }; 2634 + static const unsigned int sdhi2_wp_mux[] = { 2635 + SD2_WP_MARK, 2636 + }; 2637 + /* - USB0 ------------------------------------------------------------------- */ 2638 + static const unsigned int usb0_pwen_pins[] = { 2639 + /* PWEN */ 2640 + RCAR_GP_PIN(7, 23), 2641 + }; 2642 + static const unsigned int usb0_pwen_mux[] = { 2643 + USB0_PWEN_MARK, 2644 + }; 2645 + static const unsigned int usb0_ovc_pins[] = { 2646 + /* OVC */ 2647 + RCAR_GP_PIN(7, 24), 2648 + }; 2649 + static const unsigned int usb0_ovc_mux[] = { 2650 + USB0_OVC_MARK, 2651 + }; 2652 + /* - USB1 ------------------------------------------------------------------- */ 2653 + static const unsigned int usb1_pwen_pins[] = { 2654 + /* PWEN */ 2655 + RCAR_GP_PIN(7, 25), 2656 + }; 2657 + static const unsigned int usb1_pwen_mux[] = { 2658 + USB1_PWEN_MARK, 2659 + }; 2660 + static const unsigned int usb1_ovc_pins[] = { 2661 + /* OVC */ 2662 + RCAR_GP_PIN(6, 30), 2663 + }; 2664 + static const unsigned int usb1_ovc_mux[] = { 2665 + USB1_OVC_MARK, 2666 + }; 2667 + 2668 + static const struct sh_pfc_pin_group pinmux_groups[] = { 2669 + SH_PFC_PIN_GROUP(du_rgb666), 2670 + SH_PFC_PIN_GROUP(du_rgb888), 2671 + SH_PFC_PIN_GROUP(du_clk_out_0), 2672 + SH_PFC_PIN_GROUP(du_clk_out_1), 2673 + SH_PFC_PIN_GROUP(du_sync_1), 2674 + SH_PFC_PIN_GROUP(du_cde_disp), 2675 + SH_PFC_PIN_GROUP(du0_clk_in), 2676 + SH_PFC_PIN_GROUP(du1_clk_in), 2677 + SH_PFC_PIN_GROUP(eth_link), 2678 + SH_PFC_PIN_GROUP(eth_magic), 2679 + SH_PFC_PIN_GROUP(eth_mdio), 2680 + SH_PFC_PIN_GROUP(eth_rmii), 2681 + SH_PFC_PIN_GROUP(intc_irq0), 2682 + SH_PFC_PIN_GROUP(intc_irq1), 2683 + SH_PFC_PIN_GROUP(intc_irq2), 2684 + SH_PFC_PIN_GROUP(intc_irq3), 2685 + SH_PFC_PIN_GROUP(mmc_data1), 2686 + SH_PFC_PIN_GROUP(mmc_data4), 2687 + SH_PFC_PIN_GROUP(mmc_data8), 2688 + SH_PFC_PIN_GROUP(mmc_ctrl), 2689 + SH_PFC_PIN_GROUP(msiof0_clk), 2690 + SH_PFC_PIN_GROUP(msiof0_sync), 2691 + SH_PFC_PIN_GROUP(msiof0_ss1), 2692 + SH_PFC_PIN_GROUP(msiof0_ss2), 2693 + SH_PFC_PIN_GROUP(msiof0_rx), 2694 + SH_PFC_PIN_GROUP(msiof0_tx), 2695 + SH_PFC_PIN_GROUP(msiof1_clk), 2696 + SH_PFC_PIN_GROUP(msiof1_sync), 2697 + SH_PFC_PIN_GROUP(msiof1_ss1), 2698 + SH_PFC_PIN_GROUP(msiof1_ss2), 2699 + SH_PFC_PIN_GROUP(msiof1_rx), 2700 + SH_PFC_PIN_GROUP(msiof1_tx), 2701 + SH_PFC_PIN_GROUP(msiof2_clk), 2702 + SH_PFC_PIN_GROUP(msiof2_sync), 2703 + SH_PFC_PIN_GROUP(msiof2_ss1), 2704 + SH_PFC_PIN_GROUP(msiof2_ss2), 2705 + SH_PFC_PIN_GROUP(msiof2_rx), 2706 + SH_PFC_PIN_GROUP(msiof2_tx), 2707 + SH_PFC_PIN_GROUP(scif0_data), 2708 + SH_PFC_PIN_GROUP(scif0_data_b), 2709 + SH_PFC_PIN_GROUP(scif0_data_c), 2710 + SH_PFC_PIN_GROUP(scif0_data_d), 2711 + SH_PFC_PIN_GROUP(scif0_data_e), 2712 + SH_PFC_PIN_GROUP(scif1_data), 2713 + SH_PFC_PIN_GROUP(scif1_data_b), 2714 + SH_PFC_PIN_GROUP(scif1_clk_b), 2715 + SH_PFC_PIN_GROUP(scif1_data_c), 2716 + SH_PFC_PIN_GROUP(scif1_data_d), 2717 + SH_PFC_PIN_GROUP(scif2_data), 2718 + SH_PFC_PIN_GROUP(scif2_data_b), 2719 + SH_PFC_PIN_GROUP(scif2_clk_b), 2720 + SH_PFC_PIN_GROUP(scif2_data_c), 2721 + SH_PFC_PIN_GROUP(scif2_data_e), 2722 + SH_PFC_PIN_GROUP(scif3_data), 2723 + SH_PFC_PIN_GROUP(scif3_clk), 2724 + SH_PFC_PIN_GROUP(scif3_data_b), 2725 + SH_PFC_PIN_GROUP(scif3_clk_b), 2726 + SH_PFC_PIN_GROUP(scif3_data_c), 2727 + SH_PFC_PIN_GROUP(scif3_data_d), 2728 + SH_PFC_PIN_GROUP(scif4_data), 2729 + SH_PFC_PIN_GROUP(scif4_data_b), 2730 + SH_PFC_PIN_GROUP(scif4_data_c), 2731 + SH_PFC_PIN_GROUP(scif5_data), 2732 + SH_PFC_PIN_GROUP(scif5_data_b), 2733 + SH_PFC_PIN_GROUP(scifa0_data), 2734 + SH_PFC_PIN_GROUP(scifa0_data_b), 2735 + SH_PFC_PIN_GROUP(scifa1_data), 2736 + SH_PFC_PIN_GROUP(scifa1_clk), 2737 + SH_PFC_PIN_GROUP(scifa1_data_b), 2738 + SH_PFC_PIN_GROUP(scifa1_clk_b), 2739 + SH_PFC_PIN_GROUP(scifa1_data_c), 2740 + SH_PFC_PIN_GROUP(scifa2_data), 2741 + SH_PFC_PIN_GROUP(scifa2_clk), 2742 + SH_PFC_PIN_GROUP(scifa2_data_b), 2743 + SH_PFC_PIN_GROUP(scifa3_data), 2744 + SH_PFC_PIN_GROUP(scifa3_clk), 2745 + SH_PFC_PIN_GROUP(scifa3_data_b), 2746 + SH_PFC_PIN_GROUP(scifa3_clk_b), 2747 + SH_PFC_PIN_GROUP(scifa3_data_c), 2748 + SH_PFC_PIN_GROUP(scifa3_clk_c), 2749 + SH_PFC_PIN_GROUP(scifa4_data), 2750 + SH_PFC_PIN_GROUP(scifa4_data_b), 2751 + SH_PFC_PIN_GROUP(scifa4_data_c), 2752 + SH_PFC_PIN_GROUP(scifa5_data), 2753 + SH_PFC_PIN_GROUP(scifa5_data_b), 2754 + SH_PFC_PIN_GROUP(scifa5_data_c), 2755 + SH_PFC_PIN_GROUP(scifb0_data), 2756 + SH_PFC_PIN_GROUP(scifb0_clk), 2757 + SH_PFC_PIN_GROUP(scifb0_ctrl), 2758 + SH_PFC_PIN_GROUP(scifb0_data_b), 2759 + SH_PFC_PIN_GROUP(scifb0_clk_b), 2760 + SH_PFC_PIN_GROUP(scifb0_ctrl_b), 2761 + SH_PFC_PIN_GROUP(scifb0_data_c), 2762 + SH_PFC_PIN_GROUP(scifb0_clk_c), 2763 + SH_PFC_PIN_GROUP(scifb0_data_d), 2764 + SH_PFC_PIN_GROUP(scifb0_clk_d), 2765 + SH_PFC_PIN_GROUP(scifb1_data), 2766 + SH_PFC_PIN_GROUP(scifb1_clk), 2767 + SH_PFC_PIN_GROUP(scifb1_ctrl), 2768 + SH_PFC_PIN_GROUP(scifb1_data_b), 2769 + SH_PFC_PIN_GROUP(scifb1_clk_b), 2770 + SH_PFC_PIN_GROUP(scifb1_data_c), 2771 + SH_PFC_PIN_GROUP(scifb1_clk_c), 2772 + SH_PFC_PIN_GROUP(scifb1_data_d), 2773 + SH_PFC_PIN_GROUP(scifb2_data), 2774 + SH_PFC_PIN_GROUP(scifb2_clk), 2775 + SH_PFC_PIN_GROUP(scifb2_ctrl), 2776 + SH_PFC_PIN_GROUP(scifb2_data_b), 2777 + SH_PFC_PIN_GROUP(scifb2_clk_b), 2778 + SH_PFC_PIN_GROUP(scifb2_ctrl_b), 2779 + SH_PFC_PIN_GROUP(scifb2_data_c), 2780 + SH_PFC_PIN_GROUP(scifb2_clk_c), 2781 + SH_PFC_PIN_GROUP(scifb2_data_d), 2782 + SH_PFC_PIN_GROUP(sdhi0_data1), 2783 + SH_PFC_PIN_GROUP(sdhi0_data4), 2784 + SH_PFC_PIN_GROUP(sdhi0_ctrl), 2785 + SH_PFC_PIN_GROUP(sdhi0_cd), 2786 + SH_PFC_PIN_GROUP(sdhi0_wp), 2787 + SH_PFC_PIN_GROUP(sdhi1_data1), 2788 + SH_PFC_PIN_GROUP(sdhi1_data4), 2789 + SH_PFC_PIN_GROUP(sdhi1_ctrl), 2790 + SH_PFC_PIN_GROUP(sdhi1_cd), 2791 + SH_PFC_PIN_GROUP(sdhi1_wp), 2792 + SH_PFC_PIN_GROUP(sdhi2_data1), 2793 + SH_PFC_PIN_GROUP(sdhi2_data4), 2794 + SH_PFC_PIN_GROUP(sdhi2_ctrl), 2795 + SH_PFC_PIN_GROUP(sdhi2_cd), 2796 + SH_PFC_PIN_GROUP(sdhi2_wp), 2797 + SH_PFC_PIN_GROUP(usb0_pwen), 2798 + SH_PFC_PIN_GROUP(usb0_ovc), 2799 + SH_PFC_PIN_GROUP(usb1_pwen), 2800 + SH_PFC_PIN_GROUP(usb1_ovc), 2801 + }; 2802 + 2803 + static const char * const du_groups[] = { 2804 + "du_rgb666", 2805 + "du_rgb888", 2806 + "du_clk_out_0", 2807 + "du_clk_out_1", 2808 + "du_sync_1", 2809 + "du_cde_disp", 2810 + }; 2811 + 2812 + static const char * const du0_groups[] = { 2813 + "du0_clk_in", 2814 + }; 2815 + 2816 + static const char * const du1_groups[] = { 2817 + "du1_clk_in", 2818 + }; 2819 + 2820 + static const char * const eth_groups[] = { 2821 + "eth_link", 2822 + "eth_magic", 2823 + "eth_mdio", 2824 + "eth_rmii", 2825 + }; 2826 + 2827 + static const char * const intc_groups[] = { 2828 + "intc_irq0", 2829 + "intc_irq1", 2830 + "intc_irq2", 2831 + "intc_irq3", 2832 + }; 2833 + 2834 + static const char * const mmc_groups[] = { 2835 + "mmc_data1", 2836 + "mmc_data4", 2837 + "mmc_data8", 2838 + "mmc_ctrl", 2839 + }; 2840 + 2841 + static const char * const msiof0_groups[] = { 2842 + "msiof0_clk", 2843 + "msiof0_ctrl", 2844 + "msiof0_data", 2845 + }; 2846 + 2847 + static const char * const msiof1_groups[] = { 2848 + "msiof1_clk", 2849 + "msiof1_ctrl", 2850 + "msiof1_data", 2851 + }; 2852 + 2853 + static const char * const msiof2_groups[] = { 2854 + "msiof2_clk", 2855 + "msiof2_ctrl", 2856 + "msiof2_data", 2857 + }; 2858 + 2859 + static const char * const scif0_groups[] = { 2860 + "scif0_data", 2861 + "scif0_data_b", 2862 + "scif0_data_c", 2863 + "scif0_data_d", 2864 + "scif0_data_e", 2865 + }; 2866 + 2867 + static const char * const scif1_groups[] = { 2868 + "scif1_data", 2869 + "scif1_data_b", 2870 + "scif1_clk_b", 2871 + "scif1_data_c", 2872 + "scif1_data_d", 2873 + }; 2874 + 2875 + static const char * const scif2_groups[] = { 2876 + "scif2_data", 2877 + "scif2_data_b", 2878 + "scif2_clk_b", 2879 + "scif2_data_c", 2880 + "scif2_data_e", 2881 + }; 2882 + static const char * const scif3_groups[] = { 2883 + "scif3_data", 2884 + "scif3_clk", 2885 + "scif3_data_b", 2886 + "scif3_clk_b", 2887 + "scif3_data_c", 2888 + "scif3_data_d", 2889 + }; 2890 + static const char * const scif4_groups[] = { 2891 + "scif4_data", 2892 + "scif4_data_b", 2893 + "scif4_data_c", 2894 + }; 2895 + static const char * const scif5_groups[] = { 2896 + "scif5_data", 2897 + "scif5_data_b", 2898 + }; 2899 + static const char * const scifa0_groups[] = { 2900 + "scifa0_data", 2901 + "scifa0_data_b", 2902 + }; 2903 + static const char * const scifa1_groups[] = { 2904 + "scifa1_data", 2905 + "scifa1_clk", 2906 + "scifa1_data_b", 2907 + "scifa1_clk_b", 2908 + "scifa1_data_c", 2909 + }; 2910 + static const char * const scifa2_groups[] = { 2911 + "scifa2_data", 2912 + "scifa2_clk", 2913 + "scifa2_data_b", 2914 + }; 2915 + static const char * const scifa3_groups[] = { 2916 + "scifa3_data", 2917 + "scifa3_clk", 2918 + "scifa3_data_b", 2919 + "scifa3_clk_b", 2920 + "scifa3_data_c", 2921 + "scifa3_clk_c", 2922 + }; 2923 + static const char * const scifa4_groups[] = { 2924 + "scifa4_data", 2925 + "scifa4_data_b", 2926 + "scifa4_data_c", 2927 + }; 2928 + static const char * const scifa5_groups[] = { 2929 + "scifa5_data", 2930 + "scifa5_data_b", 2931 + "scifa5_data_c", 2932 + }; 2933 + static const char * const scifb0_groups[] = { 2934 + "scifb0_data", 2935 + "scifb0_clk", 2936 + "scifb0_ctrl", 2937 + "scifb0_data_b", 2938 + "scifb0_clk_b", 2939 + "scifb0_ctrl_b", 2940 + "scifb0_data_c", 2941 + "scifb0_clk_c", 2942 + "scifb0_data_d", 2943 + "scifb0_clk_d", 2944 + }; 2945 + static const char * const scifb1_groups[] = { 2946 + "scifb1_data", 2947 + "scifb1_clk", 2948 + "scifb1_ctrl", 2949 + "scifb1_data_b", 2950 + "scifb1_clk_b", 2951 + "scifb1_data_c", 2952 + "scifb1_clk_c", 2953 + "scifb1_data_d", 2954 + }; 2955 + static const char * const scifb2_groups[] = { 2956 + "scifb2_data", 2957 + "scifb2_clk", 2958 + "scifb2_ctrl", 2959 + "scifb2_data_b", 2960 + "scifb2_clk_b", 2961 + "scifb2_ctrl_b", 2962 + "scifb0_data_c", 2963 + "scifb2_clk_c", 2964 + "scifb2_data_d", 2965 + }; 2966 + 2967 + static const char * const sdhi0_groups[] = { 2968 + "sdhi0_data1", 2969 + "sdhi0_data4", 2970 + "sdhi0_ctrl", 2971 + "sdhi0_cd", 2972 + "sdhi0_wp", 2973 + }; 2974 + 2975 + static const char * const sdhi1_groups[] = { 2976 + "sdhi1_data1", 2977 + "sdhi1_data4", 2978 + "sdhi1_ctrl", 2979 + "sdhi1_cd", 2980 + "sdhi1_wp", 2981 + }; 2982 + 2983 + static const char * const sdhi2_groups[] = { 2984 + "sdhi2_data1", 2985 + "sdhi2_data4", 2986 + "sdhi2_ctrl", 2987 + "sdhi2_cd", 2988 + "sdhi2_wp", 2989 + }; 2990 + 2991 + static const char * const usb0_groups[] = { 2992 + "usb0_pwen", 2993 + "usb0_ovc", 2994 + }; 2995 + static const char * const usb1_groups[] = { 2996 + "usb1_pwen", 2997 + "usb1_ovc", 2998 + }; 2999 + 3000 + static const struct sh_pfc_function pinmux_functions[] = { 3001 + SH_PFC_FUNCTION(du), 3002 + SH_PFC_FUNCTION(du0), 3003 + SH_PFC_FUNCTION(du1), 3004 + SH_PFC_FUNCTION(eth), 3005 + SH_PFC_FUNCTION(intc), 3006 + SH_PFC_FUNCTION(mmc), 3007 + SH_PFC_FUNCTION(msiof0), 3008 + SH_PFC_FUNCTION(msiof1), 3009 + SH_PFC_FUNCTION(msiof2), 3010 + SH_PFC_FUNCTION(scif0), 3011 + SH_PFC_FUNCTION(scif1), 3012 + SH_PFC_FUNCTION(scif2), 3013 + SH_PFC_FUNCTION(scif3), 3014 + SH_PFC_FUNCTION(scif4), 3015 + SH_PFC_FUNCTION(scif5), 3016 + SH_PFC_FUNCTION(scifa0), 3017 + SH_PFC_FUNCTION(scifa1), 3018 + SH_PFC_FUNCTION(scifa2), 3019 + SH_PFC_FUNCTION(scifa3), 3020 + SH_PFC_FUNCTION(scifa4), 3021 + SH_PFC_FUNCTION(scifa5), 3022 + SH_PFC_FUNCTION(scifb0), 3023 + SH_PFC_FUNCTION(scifb1), 3024 + SH_PFC_FUNCTION(scifb2), 3025 + SH_PFC_FUNCTION(sdhi0), 3026 + SH_PFC_FUNCTION(sdhi1), 3027 + SH_PFC_FUNCTION(sdhi2), 3028 + SH_PFC_FUNCTION(usb0), 3029 + SH_PFC_FUNCTION(usb1), 3030 + }; 3031 + 3032 + static struct pinmux_cfg_reg pinmux_config_regs[] = { 3033 + { PINMUX_CFG_REG("GPSR0", 0xE6060004, 32, 1) { 3034 + GP_0_31_FN, FN_IP1_22_20, 3035 + GP_0_30_FN, FN_IP1_19_17, 3036 + GP_0_29_FN, FN_IP1_16_14, 3037 + GP_0_28_FN, FN_IP1_13_11, 3038 + GP_0_27_FN, FN_IP1_10_8, 3039 + GP_0_26_FN, FN_IP1_7_6, 3040 + GP_0_25_FN, FN_IP1_5_4, 3041 + GP_0_24_FN, FN_IP1_3_2, 3042 + GP_0_23_FN, FN_IP1_1_0, 3043 + GP_0_22_FN, FN_IP0_30_29, 3044 + GP_0_21_FN, FN_IP0_28_27, 3045 + GP_0_20_FN, FN_IP0_26_25, 3046 + GP_0_19_FN, FN_IP0_24_23, 3047 + GP_0_18_FN, FN_IP0_22_21, 3048 + GP_0_17_FN, FN_IP0_20_19, 3049 + GP_0_16_FN, FN_IP0_18_16, 3050 + GP_0_15_FN, FN_IP0_15, 3051 + GP_0_14_FN, FN_IP0_14, 3052 + GP_0_13_FN, FN_IP0_13, 3053 + GP_0_12_FN, FN_IP0_12, 3054 + GP_0_11_FN, FN_IP0_11, 3055 + GP_0_10_FN, FN_IP0_10, 3056 + GP_0_9_FN, FN_IP0_9, 3057 + GP_0_8_FN, FN_IP0_8, 3058 + GP_0_7_FN, FN_IP0_7, 3059 + GP_0_6_FN, FN_IP0_6, 3060 + GP_0_5_FN, FN_IP0_5, 3061 + GP_0_4_FN, FN_IP0_4, 3062 + GP_0_3_FN, FN_IP0_3, 3063 + GP_0_2_FN, FN_IP0_2, 3064 + GP_0_1_FN, FN_IP0_1, 3065 + GP_0_0_FN, FN_IP0_0, } 3066 + }, 3067 + { PINMUX_CFG_REG("GPSR1", 0xE6060008, 32, 1) { 3068 + 0, 0, 3069 + 0, 0, 3070 + 0, 0, 3071 + 0, 0, 3072 + 0, 0, 3073 + 0, 0, 3074 + GP_1_25_FN, FN_IP3_21_20, 3075 + GP_1_24_FN, FN_IP3_19_18, 3076 + GP_1_23_FN, FN_IP3_17_16, 3077 + GP_1_22_FN, FN_IP3_15_14, 3078 + GP_1_21_FN, FN_IP3_13_12, 3079 + GP_1_20_FN, FN_IP3_11_9, 3080 + GP_1_19_FN, FN_RD_N, 3081 + GP_1_18_FN, FN_IP3_8_6, 3082 + GP_1_17_FN, FN_IP3_5_3, 3083 + GP_1_16_FN, FN_IP3_2_0, 3084 + GP_1_15_FN, FN_IP2_29_27, 3085 + GP_1_14_FN, FN_IP2_26_25, 3086 + GP_1_13_FN, FN_IP2_24_23, 3087 + GP_1_12_FN, FN_EX_CS0_N, 3088 + GP_1_11_FN, FN_IP2_22_21, 3089 + GP_1_10_FN, FN_IP2_20_19, 3090 + GP_1_9_FN, FN_IP2_18_16, 3091 + GP_1_8_FN, FN_IP2_15_13, 3092 + GP_1_7_FN, FN_IP2_12_10, 3093 + GP_1_6_FN, FN_IP2_9_7, 3094 + GP_1_5_FN, FN_IP2_6_5, 3095 + GP_1_4_FN, FN_IP2_4_3, 3096 + GP_1_3_FN, FN_IP2_2_0, 3097 + GP_1_2_FN, FN_IP1_31_29, 3098 + GP_1_1_FN, FN_IP1_28_26, 3099 + GP_1_0_FN, FN_IP1_25_23, } 3100 + }, 3101 + { PINMUX_CFG_REG("GPSR2", 0xE606000C, 32, 1) { 3102 + GP_2_31_FN, FN_IP6_7_6, 3103 + GP_2_30_FN, FN_IP6_5_3, 3104 + GP_2_29_FN, FN_IP6_2_0, 3105 + GP_2_28_FN, FN_AUDIO_CLKA, 3106 + GP_2_27_FN, FN_IP5_31_29, 3107 + GP_2_26_FN, FN_IP5_28_26, 3108 + GP_2_25_FN, FN_IP5_25_24, 3109 + GP_2_24_FN, FN_IP5_23_22, 3110 + GP_2_23_FN, FN_IP5_21_20, 3111 + GP_2_22_FN, FN_IP5_19_17, 3112 + GP_2_21_FN, FN_IP5_16_15, 3113 + GP_2_20_FN, FN_IP5_14_12, 3114 + GP_2_19_FN, FN_IP5_11_9, 3115 + GP_2_18_FN, FN_IP5_8_6, 3116 + GP_2_17_FN, FN_IP5_5_3, 3117 + GP_2_16_FN, FN_IP5_2_0, 3118 + GP_2_15_FN, FN_IP4_30_28, 3119 + GP_2_14_FN, FN_IP4_27_26, 3120 + GP_2_13_FN, FN_IP4_25_24, 3121 + GP_2_12_FN, FN_IP4_23_22, 3122 + GP_2_11_FN, FN_IP4_21, 3123 + GP_2_10_FN, FN_IP4_20, 3124 + GP_2_9_FN, FN_IP4_19, 3125 + GP_2_8_FN, FN_IP4_18_16, 3126 + GP_2_7_FN, FN_IP4_15_13, 3127 + GP_2_6_FN, FN_IP4_12_10, 3128 + GP_2_5_FN, FN_IP4_9_8, 3129 + GP_2_4_FN, FN_IP4_7_5, 3130 + GP_2_3_FN, FN_IP4_4_2, 3131 + GP_2_2_FN, FN_IP4_1_0, 3132 + GP_2_1_FN, FN_IP3_30_28, 3133 + GP_2_0_FN, FN_IP3_27_25 } 3134 + }, 3135 + { PINMUX_CFG_REG("GPSR3", 0xE6060010, 32, 1) { 3136 + GP_3_31_FN, FN_IP9_18_17, 3137 + GP_3_30_FN, FN_IP9_16, 3138 + GP_3_29_FN, FN_IP9_15_13, 3139 + GP_3_28_FN, FN_IP9_12, 3140 + GP_3_27_FN, FN_IP9_11, 3141 + GP_3_26_FN, FN_IP9_10_8, 3142 + GP_3_25_FN, FN_IP9_7, 3143 + GP_3_24_FN, FN_IP9_6, 3144 + GP_3_23_FN, FN_IP9_5_3, 3145 + GP_3_22_FN, FN_IP9_2_0, 3146 + GP_3_21_FN, FN_IP8_30_28, 3147 + GP_3_20_FN, FN_IP8_27_26, 3148 + GP_3_19_FN, FN_IP8_25_24, 3149 + GP_3_18_FN, FN_IP8_23_21, 3150 + GP_3_17_FN, FN_IP8_20_18, 3151 + GP_3_16_FN, FN_IP8_17_15, 3152 + GP_3_15_FN, FN_IP8_14_12, 3153 + GP_3_14_FN, FN_IP8_11_9, 3154 + GP_3_13_FN, FN_IP8_8_6, 3155 + GP_3_12_FN, FN_IP8_5_3, 3156 + GP_3_11_FN, FN_IP8_2_0, 3157 + GP_3_10_FN, FN_IP7_29_27, 3158 + GP_3_9_FN, FN_IP7_26_24, 3159 + GP_3_8_FN, FN_IP7_23_21, 3160 + GP_3_7_FN, FN_IP7_20_19, 3161 + GP_3_6_FN, FN_IP7_18_17, 3162 + GP_3_5_FN, FN_IP7_16_15, 3163 + GP_3_4_FN, FN_IP7_14_13, 3164 + GP_3_3_FN, FN_IP7_12_11, 3165 + GP_3_2_FN, FN_IP7_10_9, 3166 + GP_3_1_FN, FN_IP7_8_6, 3167 + GP_3_0_FN, FN_IP7_5_3 } 3168 + }, 3169 + { PINMUX_CFG_REG("GPSR4", 0xE6060014, 32, 1) { 3170 + GP_4_31_FN, FN_IP15_5_4, 3171 + GP_4_30_FN, FN_IP15_3_2, 3172 + GP_4_29_FN, FN_IP15_1_0, 3173 + GP_4_28_FN, FN_IP11_8_6, 3174 + GP_4_27_FN, FN_IP11_5_3, 3175 + GP_4_26_FN, FN_IP11_2_0, 3176 + GP_4_25_FN, FN_IP10_31_29, 3177 + GP_4_24_FN, FN_IP10_28_27, 3178 + GP_4_23_FN, FN_IP10_26_25, 3179 + GP_4_22_FN, FN_IP10_24_22, 3180 + GP_4_21_FN, FN_IP10_21_19, 3181 + GP_4_20_FN, FN_IP10_18_17, 3182 + GP_4_19_FN, FN_IP10_16_15, 3183 + GP_4_18_FN, FN_IP10_14_12, 3184 + GP_4_17_FN, FN_IP10_11_9, 3185 + GP_4_16_FN, FN_IP10_8_6, 3186 + GP_4_15_FN, FN_IP10_5_3, 3187 + GP_4_14_FN, FN_IP10_2_0, 3188 + GP_4_13_FN, FN_IP9_31_29, 3189 + GP_4_12_FN, FN_VI0_DATA7_VI0_B7, 3190 + GP_4_11_FN, FN_VI0_DATA6_VI0_B6, 3191 + GP_4_10_FN, FN_VI0_DATA5_VI0_B5, 3192 + GP_4_9_FN, FN_VI0_DATA4_VI0_B4, 3193 + GP_4_8_FN, FN_IP9_28_27, 3194 + GP_4_7_FN, FN_VI0_DATA2_VI0_B2, 3195 + GP_4_6_FN, FN_VI0_DATA1_VI0_B1, 3196 + GP_4_5_FN, FN_VI0_DATA0_VI0_B0, 3197 + GP_4_4_FN, FN_IP9_26_25, 3198 + GP_4_3_FN, FN_IP9_24_23, 3199 + GP_4_2_FN, FN_IP9_22_21, 3200 + GP_4_1_FN, FN_IP9_20_19, 3201 + GP_4_0_FN, FN_VI0_CLK } 3202 + }, 3203 + { PINMUX_CFG_REG("GPSR5", 0xE6060018, 32, 1) { 3204 + GP_5_31_FN, FN_IP3_24_22, 3205 + GP_5_30_FN, FN_IP13_9_7, 3206 + GP_5_29_FN, FN_IP13_6_5, 3207 + GP_5_28_FN, FN_IP13_4_3, 3208 + GP_5_27_FN, FN_IP13_2_0, 3209 + GP_5_26_FN, FN_IP12_29_27, 3210 + GP_5_25_FN, FN_IP12_26_24, 3211 + GP_5_24_FN, FN_IP12_23_22, 3212 + GP_5_23_FN, FN_IP12_21_20, 3213 + GP_5_22_FN, FN_IP12_19_18, 3214 + GP_5_21_FN, FN_IP12_17_16, 3215 + GP_5_20_FN, FN_IP12_15_13, 3216 + GP_5_19_FN, FN_IP12_12_10, 3217 + GP_5_18_FN, FN_IP12_9_7, 3218 + GP_5_17_FN, FN_IP12_6_4, 3219 + GP_5_16_FN, FN_IP12_3_2, 3220 + GP_5_15_FN, FN_IP12_1_0, 3221 + GP_5_14_FN, FN_IP11_31_30, 3222 + GP_5_13_FN, FN_IP11_29_28, 3223 + GP_5_12_FN, FN_IP11_27, 3224 + GP_5_11_FN, FN_IP11_26, 3225 + GP_5_10_FN, FN_IP11_25, 3226 + GP_5_9_FN, FN_IP11_24, 3227 + GP_5_8_FN, FN_IP11_23, 3228 + GP_5_7_FN, FN_IP11_22, 3229 + GP_5_6_FN, FN_IP11_21, 3230 + GP_5_5_FN, FN_IP11_20, 3231 + GP_5_4_FN, FN_IP11_19, 3232 + GP_5_3_FN, FN_IP11_18_17, 3233 + GP_5_2_FN, FN_IP11_16_15, 3234 + GP_5_1_FN, FN_IP11_14_12, 3235 + GP_5_0_FN, FN_IP11_11_9 } 3236 + }, 3237 + { PINMUX_CFG_REG("GPSR6", 0xE606001C, 32, 1) { 3238 + GP_6_31_FN, FN_DU0_DOTCLKIN, 3239 + GP_6_30_FN, FN_USB1_OVC, 3240 + GP_6_29_FN, FN_IP14_31_29, 3241 + GP_6_28_FN, FN_IP14_28_26, 3242 + GP_6_27_FN, FN_IP14_25_23, 3243 + GP_6_26_FN, FN_IP14_22_20, 3244 + GP_6_25_FN, FN_IP14_19_17, 3245 + GP_6_24_FN, FN_IP14_16_14, 3246 + GP_6_23_FN, FN_IP14_13_11, 3247 + GP_6_22_FN, FN_IP14_10_8, 3248 + GP_6_21_FN, FN_IP14_7, 3249 + GP_6_20_FN, FN_IP14_6, 3250 + GP_6_19_FN, FN_IP14_5, 3251 + GP_6_18_FN, FN_IP14_4, 3252 + GP_6_17_FN, FN_IP14_3, 3253 + GP_6_16_FN, FN_IP14_2, 3254 + GP_6_15_FN, FN_IP14_1_0, 3255 + GP_6_14_FN, FN_IP13_30_28, 3256 + GP_6_13_FN, FN_IP13_27, 3257 + GP_6_12_FN, FN_IP13_26, 3258 + GP_6_11_FN, FN_IP13_25, 3259 + GP_6_10_FN, FN_IP13_24_23, 3260 + GP_6_9_FN, FN_IP13_22, 3261 + 0, 0, 3262 + GP_6_7_FN, FN_IP13_21_19, 3263 + GP_6_6_FN, FN_IP13_18_16, 3264 + GP_6_5_FN, FN_IP13_15, 3265 + GP_6_4_FN, FN_IP13_14, 3266 + GP_6_3_FN, FN_IP13_13, 3267 + GP_6_2_FN, FN_IP13_12, 3268 + GP_6_1_FN, FN_IP13_11, 3269 + GP_6_0_FN, FN_IP13_10 } 3270 + }, 3271 + { PINMUX_CFG_REG("GPSR7", 0xE6060074, 32, 1) { 3272 + 0, 0, 3273 + 0, 0, 3274 + 0, 0, 3275 + 0, 0, 3276 + 0, 0, 3277 + 0, 0, 3278 + GP_7_25_FN, FN_USB1_PWEN, 3279 + GP_7_24_FN, FN_USB0_OVC, 3280 + GP_7_23_FN, FN_USB0_PWEN, 3281 + GP_7_22_FN, FN_IP15_14_12, 3282 + GP_7_21_FN, FN_IP15_11_9, 3283 + GP_7_20_FN, FN_IP15_8_6, 3284 + GP_7_19_FN, FN_IP7_2_0, 3285 + GP_7_18_FN, FN_IP6_29_27, 3286 + GP_7_17_FN, FN_IP6_26_24, 3287 + GP_7_16_FN, FN_IP6_23_21, 3288 + GP_7_15_FN, FN_IP6_20_19, 3289 + GP_7_14_FN, FN_IP6_18_16, 3290 + GP_7_13_FN, FN_IP6_15_14, 3291 + GP_7_12_FN, FN_IP6_13_12, 3292 + GP_7_11_FN, FN_IP6_11_10, 3293 + GP_7_10_FN, FN_IP6_9_8, 3294 + GP_7_9_FN, FN_IP16_11_10, 3295 + GP_7_8_FN, FN_IP16_9_8, 3296 + GP_7_7_FN, FN_IP16_7_6, 3297 + GP_7_6_FN, FN_IP16_5_3, 3298 + GP_7_5_FN, FN_IP16_2_0, 3299 + GP_7_4_FN, FN_IP15_29_27, 3300 + GP_7_3_FN, FN_IP15_26_24, 3301 + GP_7_2_FN, FN_IP15_23_21, 3302 + GP_7_1_FN, FN_IP15_20_18, 3303 + GP_7_0_FN, FN_IP15_17_15 } 3304 + }, 3305 + { PINMUX_CFG_REG_VAR("IPSR0", 0xE6060020, 32, 3306 + 1, 2, 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3307 + 1, 1, 1, 1, 1, 1, 1, 1) { 3308 + /* IP0_31 [1] */ 3309 + 0, 0, 3310 + /* IP0_30_29 [2] */ 3311 + FN_A6, FN_MSIOF1_SCK, 3312 + 0, 0, 3313 + /* IP0_28_27 [2] */ 3314 + FN_A5, FN_MSIOF0_RXD_B, 3315 + 0, 0, 3316 + /* IP0_26_25 [2] */ 3317 + FN_A4, FN_MSIOF0_TXD_B, 3318 + 0, 0, 3319 + /* IP0_24_23 [2] */ 3320 + FN_A3, FN_MSIOF0_SS2_B, 3321 + 0, 0, 3322 + /* IP0_22_21 [2] */ 3323 + FN_A2, FN_MSIOF0_SS1_B, 3324 + 0, 0, 3325 + /* IP0_20_19 [2] */ 3326 + FN_A1, FN_MSIOF0_SYNC_B, 3327 + 0, 0, 3328 + /* IP0_18_16 [3] */ 3329 + FN_A0, FN_ATAWR0_N_C, FN_MSIOF0_SCK_B, FN_SCL0_C, FN_PWM2_B, 3330 + 0, 0, 0, 3331 + /* IP0_15 [1] */ 3332 + FN_D15, 0, 3333 + /* IP0_14 [1] */ 3334 + FN_D14, 0, 3335 + /* IP0_13 [1] */ 3336 + FN_D13, 0, 3337 + /* IP0_12 [1] */ 3338 + FN_D12, 0, 3339 + /* IP0_11 [1] */ 3340 + FN_D11, 0, 3341 + /* IP0_10 [1] */ 3342 + FN_D10, 0, 3343 + /* IP0_9 [1] */ 3344 + FN_D9, 0, 3345 + /* IP0_8 [1] */ 3346 + FN_D8, 0, 3347 + /* IP0_7 [1] */ 3348 + FN_D7, 0, 3349 + /* IP0_6 [1] */ 3350 + FN_D6, 0, 3351 + /* IP0_5 [1] */ 3352 + FN_D5, 0, 3353 + /* IP0_4 [1] */ 3354 + FN_D4, 0, 3355 + /* IP0_3 [1] */ 3356 + FN_D3, 0, 3357 + /* IP0_2 [1] */ 3358 + FN_D2, 0, 3359 + /* IP0_1 [1] */ 3360 + FN_D1, 0, 3361 + /* IP0_0 [1] */ 3362 + FN_D0, 0, } 3363 + }, 3364 + { PINMUX_CFG_REG_VAR("IPSR1", 0xE6060024, 32, 3365 + 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2) { 3366 + /* IP1_31_29 [3] */ 3367 + FN_A18, FN_DREQ1, FN_SCIFA1_RXD_C, 0, FN_SCIFB1_RXD_C, 3368 + 0, 0, 0, 3369 + /* IP1_28_26 [3] */ 3370 + FN_A17, FN_DACK2_B, 0, FN_SDA0_C, 3371 + 0, 0, 0, 0, 3372 + /* IP1_25_23 [3] */ 3373 + FN_A16, FN_DREQ2_B, FN_FMCLK_C, 0, FN_SCIFA1_SCK_B, 3374 + 0, 0, 0, 3375 + /* IP1_22_20 [3] */ 3376 + FN_A15, FN_BPFCLK_C, 3377 + 0, 0, 0, 0, 0, 0, 3378 + /* IP1_19_17 [3] */ 3379 + FN_A14, FN_ATADIR0_N_C, FN_FMIN, FN_FMIN_C, FN_MSIOF1_SYNC_D, 3380 + 0, 0, 0, 3381 + /* IP1_16_14 [3] */ 3382 + FN_A13, FN_ATAG0_N_C, FN_BPFCLK, FN_MSIOF1_SS1_D, 3383 + 0, 0, 0, 0, 3384 + /* IP1_13_11 [3] */ 3385 + FN_A12, FN_FMCLK, FN_SDA3_D, FN_MSIOF1_SCK_D, 3386 + 0, 0, 0, 0, 3387 + /* IP1_10_8 [3] */ 3388 + FN_A11, FN_MSIOF1_RXD, FN_SCL3_D, FN_MSIOF1_RXD_D, 3389 + 0, 0, 0, 0, 3390 + /* IP1_7_6 [2] */ 3391 + FN_A10, FN_MSIOF1_TXD, 0, FN_MSIOF1_TXD_D, 3392 + /* IP1_5_4 [2] */ 3393 + FN_A9, FN_MSIOF1_SS2, FN_SDA0, 0, 3394 + /* IP1_3_2 [2] */ 3395 + FN_A8, FN_MSIOF1_SS1, FN_SCL0, 0, 3396 + /* IP1_1_0 [2] */ 3397 + FN_A7, FN_MSIOF1_SYNC, 3398 + 0, 0, } 3399 + }, 3400 + { PINMUX_CFG_REG_VAR("IPSR2", 0xE6060028, 32, 3401 + 2, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 3) { 3402 + /* IP2_31_20 [2] */ 3403 + 0, 0, 0, 0, 3404 + /* IP2_29_27 [3] */ 3405 + FN_EX_CS3_N, FN_ATADIR0_N, FN_MSIOF2_TXD, 3406 + FN_ATAG0_N, 0, FN_EX_WAIT1, 3407 + 0, 0, 3408 + /* IP2_26_25 [2] */ 3409 + FN_EX_CS2_N, FN_ATAWR0_N, FN_MSIOF2_SYNC, 0, 3410 + /* IP2_24_23 [2] */ 3411 + FN_EX_CS1_N, FN_MSIOF2_SCK, 0, 0, 3412 + /* IP2_22_21 [2] */ 3413 + FN_CS1_N_A26, FN_ATADIR0_N_B, FN_SDA1, 0, 3414 + /* IP2_20_19 [2] */ 3415 + FN_CS0_N, FN_ATAG0_N_B, FN_SCL1, 0, 3416 + /* IP2_18_16 [3] */ 3417 + FN_A25, FN_DACK2, FN_SSL, FN_DREQ1_C, FN_RX1, FN_SCIFA1_RXD, 3418 + 0, 0, 3419 + /* IP2_15_13 [3] */ 3420 + FN_A24, FN_DREQ2, FN_IO3, FN_TX1, FN_SCIFA1_TXD, 3421 + 0, 0, 0, 3422 + /* IP2_12_0 [3] */ 3423 + FN_A23, FN_IO2, FN_BPFCLK_B, FN_RX0, FN_SCIFA0_RXD, 3424 + 0, 0, 0, 3425 + /* IP2_9_7 [3] */ 3426 + FN_A22, FN_MISO_IO1, FN_FMCLK_B, FN_TX0, FN_SCIFA0_TXD, 3427 + 0, 0, 0, 3428 + /* IP2_6_5 [2] */ 3429 + FN_A21, FN_ATAWR0_N_B, FN_MOSI_IO0, 0, 3430 + /* IP2_4_3 [2] */ 3431 + FN_A20, FN_SPCLK, 0, 0, 3432 + /* IP2_2_0 [3] */ 3433 + FN_A19, FN_DACK1, FN_SCIFA1_TXD_C, 0, 3434 + FN_SCIFB1_TXD_C, 0, FN_SCIFB1_SCK_B, 0, } 3435 + }, 3436 + { PINMUX_CFG_REG_VAR("IPSR3", 0xE606002C, 32, 3437 + 1, 3, 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3) { 3438 + /* IP3_31 [1] */ 3439 + 0, 0, 3440 + /* IP3_30_28 [3] */ 3441 + FN_SSI_WS0129, FN_HTX0_C, FN_HTX2_C, 3442 + FN_SCIFB0_TXD_C, FN_SCIFB2_TXD_C, 3443 + 0, 0, 0, 3444 + /* IP3_27_25 [3] */ 3445 + FN_SSI_SCK0129, FN_HRX0_C, FN_HRX2_C, 3446 + FN_SCIFB0_RXD_C, FN_SCIFB2_RXD_C, 3447 + 0, 0, 0, 3448 + /* IP3_24_22 [3] */ 3449 + FN_SPEEDIN, 0, FN_HSCK0_C, FN_HSCK2_C, FN_SCIFB0_SCK_B, 3450 + FN_SCIFB2_SCK_B, FN_DREQ2_C, FN_HTX2_D, 3451 + /* IP3_21_20 [2] */ 3452 + FN_DACK0, FN_DRACK0, FN_REMOCON, 0, 3453 + /* IP3_19_18 [2] */ 3454 + FN_DREQ0, FN_PWM3, FN_TPU_TO3, 0, 3455 + /* IP3_17_16 [2] */ 3456 + FN_EX_WAIT0, FN_HRTS2_N_B, FN_SCIFB0_CTS_N_B, 0, 3457 + /* IP3_15_14 [2] */ 3458 + FN_WE1_N, FN_ATARD0_N_B, FN_HTX2_B, FN_SCIFB0_RTS_N_B, 3459 + /* IP3_13_12 [2] */ 3460 + FN_WE0_N, FN_HCTS2_N_B, FN_SCIFB0_TXD_B, 0, 3461 + /* IP3_11_9 [3] */ 3462 + FN_RD_WR_N, FN_HRX2_B, FN_FMIN_B, FN_SCIFB0_RXD_B, FN_DREQ1_D, 3463 + 0, 0, 0, 3464 + /* IP3_8_6 [3] */ 3465 + FN_BS_N, FN_ATACS10_N, FN_MSIOF2_SS2, FN_HTX1_B, 3466 + FN_SCIFB1_TXD_B, FN_PWM2, FN_TPU_TO2, 0, 3467 + /* IP3_5_3 [3] */ 3468 + FN_EX_CS5_N, FN_ATACS00_N, FN_MSIOF2_SS1, FN_HRX1_B, 3469 + FN_SCIFB1_RXD_B, FN_PWM1, FN_TPU_TO1, 0, 3470 + /* IP3_2_0 [3] */ 3471 + FN_EX_CS4_N, FN_ATARD0_N, FN_MSIOF2_RXD, 0, FN_EX_WAIT2, 3472 + 0, 0, 0, } 3473 + }, 3474 + { PINMUX_CFG_REG_VAR("IPSR4", 0xE6060030, 32, 3475 + 1, 3, 2, 2, 2, 1, 1, 1, 3, 3, 3, 2, 3, 3, 2) { 3476 + /* IP4_31 [1] */ 3477 + 0, 0, 3478 + /* IP4_30_28 [3] */ 3479 + FN_SSI_SCK5, FN_MSIOF1_SCK_C, FN_TS_SDATA0, FN_GLO_I0, 3480 + FN_MSIOF2_SYNC_D, FN_VI1_R2_B, 3481 + 0, 0, 3482 + /* IP4_27_26 [2] */ 3483 + FN_SSI_SDATA4, FN_MSIOF2_SCK_D, 0, 0, 3484 + /* IP4_25_24 [2] */ 3485 + FN_SSI_WS4, FN_GLO_RFON_D, 0, 0, 3486 + /* IP4_23_22 [2] */ 3487 + FN_SSI_SCK4, FN_GLO_SS_D, 0, 0, 3488 + /* IP4_21 [1] */ 3489 + FN_SSI_SDATA3, 0, 3490 + /* IP4_20 [1] */ 3491 + FN_SSI_WS34, 0, 3492 + /* IP4_19 [1] */ 3493 + FN_SSI_SCK34, 0, 3494 + /* IP4_18_16 [3] */ 3495 + FN_SSI_SDATA2, FN_GPS_MAG_B, FN_TX2_E, FN_HRTS1_N_E, 3496 + 0, 0, 0, 0, 3497 + /* IP4_15_13 [3] */ 3498 + FN_SSI_WS2, FN_SDA2, FN_GPS_SIGN_B, FN_RX2_E, 3499 + FN_GLO_Q1_D, FN_HCTS1_N_E, 3500 + 0, 0, 3501 + /* IP4_12_10 [3] */ 3502 + FN_SSI_SCK2, FN_SCL2, FN_GPS_CLK_B, FN_GLO_Q0_D, FN_HSCK1_E, 3503 + 0, 0, 0, 3504 + /* IP4_9_8 [2] */ 3505 + FN_SSI_SDATA1, FN_SDA1_B, FN_SDA8_B, FN_MSIOF2_RXD_C, 3506 + /* IP4_7_5 [3] */ 3507 + FN_SSI_WS1, FN_SCL1_B, FN_SCL8_B, FN_MSIOF2_TXD_C, FN_GLO_I1_D, 3508 + 0, 0, 0, 3509 + /* IP4_4_2 [3] */ 3510 + FN_SSI_SCK1, FN_SDA0_B, FN_SDA7_B, 3511 + FN_MSIOF2_SYNC_C, FN_GLO_I0_D, 3512 + 0, 0, 0, 3513 + /* IP4_1_0 [2] */ 3514 + FN_SSI_SDATA0, FN_SCL0_B, FN_SCL7_B, FN_MSIOF2_SCK_C, } 3515 + }, 3516 + { PINMUX_CFG_REG_VAR("IPSR5", 0xE6060034, 32, 3517 + 3, 3, 2, 2, 2, 3, 2, 3, 3, 3, 3, 3) { 3518 + /* IP5_31_29 [3] */ 3519 + FN_SSI_SDATA9, FN_RX3_D, FN_CAN0_RX_D, 3520 + 0, 0, 0, 0, 0, 3521 + /* IP5_28_26 [3] */ 3522 + FN_SSI_WS9, FN_TX3_D, FN_CAN0_TX_D, FN_GLO_SDATA_D, 3523 + 0, 0, 0, 0, 3524 + /* IP5_25_24 [2] */ 3525 + FN_SSI_SCK9, FN_RX1_D, FN_GLO_SCLK_D, 0, 3526 + /* IP5_23_22 [2] */ 3527 + FN_SSI_SDATA8, FN_TX1_D, FN_STP_ISSYNC_0_B, 0, 3528 + /* IP5_21_20 [2] */ 3529 + FN_SSI_SDATA7, FN_RX0_D, FN_STP_ISEN_0_B, 0, 3530 + /* IP5_19_17 [3] */ 3531 + FN_SSI_WS78, FN_TX0_D, FN_STP_ISD_0_B, FN_GLO_RFON, 3532 + 0, 0, 0, 0, 3533 + /* IP5_16_15 [2] */ 3534 + FN_SSI_SCK78, FN_STP_ISCLK_0_B, FN_GLO_SS, 0, 3535 + /* IP5_14_12 [3] */ 3536 + FN_SSI_SDATA6, FN_STP_IVCXO27_0_B, FN_GLO_SDATA, FN_VI1_R7_B, 3537 + 0, 0, 0, 0, 3538 + /* IP5_11_9 [3] */ 3539 + FN_SSI_WS6, FN_GLO_SCLK, FN_MSIOF2_SS2_D, FN_VI1_R6_B, 3540 + 0, 0, 0, 0, 3541 + /* IP5_8_6 [3] */ 3542 + FN_SSI_SCK6, FN_MSIOF1_RXD_C, FN_TS_SPSYNC0, FN_GLO_Q1, 3543 + FN_MSIOF2_RXD_D, FN_VI1_R5_B, 3544 + 0, 0, 3545 + /* IP5_5_3 [3] */ 3546 + FN_SSI_SDATA5, FN_MSIOF1_TXD_C, FN_TS_SDEN0, FN_GLO_Q0, 3547 + FN_MSIOF2_SS1_D, FN_VI1_R4_B, 3548 + 0, 0, 3549 + /* IP5_2_0 [3] */ 3550 + FN_SSI_WS5, FN_MSIOF1_SYNC_C, FN_TS_SCK0, FN_GLO_I1, 3551 + FN_MSIOF2_TXD_D, FN_VI1_R3_B, 3552 + 0, 0, } 3553 + }, 3554 + { PINMUX_CFG_REG_VAR("IPSR6", 0xE6060038, 32, 3555 + 2, 3, 3, 3, 2, 3, 2, 2, 2, 2, 2, 3, 3) { 3556 + /* IP6_31_30 [2] */ 3557 + 0, 0, 0, 0, 3558 + /* IP6_29_27 [3] */ 3559 + FN_IRQ8, FN_HRTS1_N_C, FN_MSIOF1_RXD_B, 3560 + FN_GPS_SIGN_C, FN_GPS_SIGN_D, 3561 + 0, 0, 0, 3562 + /* IP6_26_24 [3] */ 3563 + FN_IRQ7, FN_HCTS1_N_C, FN_MSIOF1_TXD_B, 3564 + FN_GPS_CLK_C, FN_GPS_CLK_D, 3565 + 0, 0, 0, 3566 + /* IP6_23_21 [3] */ 3567 + FN_IRQ6, FN_HSCK1_C, FN_MSIOF1_SS2_B, 3568 + FN_SDA1_E, FN_MSIOF2_SYNC_E, 3569 + 0, 0, 0, 3570 + /* IP6_20_19 [2] */ 3571 + FN_IRQ5, FN_HTX1_C, FN_SCL1_E, FN_MSIOF2_SCK_E, 3572 + /* IP6_18_16 [3] */ 3573 + FN_IRQ4, FN_HRX1_C, FN_SDA4_C, FN_MSIOF2_RXD_E, FN_INTC_IRQ4_N, 3574 + 0, 0, 0, 3575 + /* IP6_15_14 [2] */ 3576 + FN_IRQ3, FN_SCL4_C, FN_MSIOF2_TXD_E, FN_INTC_IRQ3_N, 3577 + /* IP6_13_12 [2] */ 3578 + FN_IRQ2, FN_SCIFB1_TXD_D, FN_INTC_IRQ2_N, 0, 3579 + /* IP6_11_10 [2] */ 3580 + FN_IRQ1, FN_SCIFB1_SCK_C, FN_INTC_IRQ1_N, 0, 3581 + /* IP6_9_8 [2] */ 3582 + FN_IRQ0, FN_SCIFB1_RXD_D, FN_INTC_IRQ0_N, 0, 3583 + /* IP6_7_6 [2] */ 3584 + FN_AUDIO_CLKOUT, FN_MSIOF1_SS1_B, FN_TX2, FN_SCIFA2_TXD, 3585 + /* IP6_5_3 [3] */ 3586 + FN_AUDIO_CLKC, FN_SCIFB0_SCK_C, FN_MSIOF1_SYNC_B, FN_RX2, 3587 + FN_SCIFA2_RXD, FN_FMIN_E, 3588 + 0, 0, 3589 + /* IP6_2_0 [3] */ 3590 + FN_AUDIO_CLKB, FN_STP_OPWM_0_B, FN_MSIOF1_SCK_B, 3591 + FN_SCIF_CLK, 0, FN_BPFCLK_E, 3592 + 0, 0, } 3593 + }, 3594 + { PINMUX_CFG_REG_VAR("IPSR7", 0xE606003C, 32, 3595 + 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, 3) { 3596 + /* IP7_31_30 [2] */ 3597 + 0, 0, 0, 0, 3598 + /* IP7_29_27 [3] */ 3599 + FN_DU1_DG2, FN_LCDOUT10, FN_VI1_DATA4_B, FN_SCIF1_SCK_B, 3600 + FN_SCIFA1_SCK, FN_SSI_SCK78_B, 3601 + 0, 0, 3602 + /* IP7_26_24 [3] */ 3603 + FN_DU1_DG1, FN_LCDOUT9, FN_VI1_DATA3_B, FN_RX1_B, 3604 + FN_SCIFA1_RXD_B, FN_MSIOF2_SS2_B, 3605 + 0, 0, 3606 + /* IP7_23_21 [3] */ 3607 + FN_DU1_DG0, FN_LCDOUT8, FN_VI1_DATA2_B, FN_TX1_B, 3608 + FN_SCIFA1_TXD_B, FN_MSIOF2_SS1_B, 3609 + 0, 0, 3610 + /* IP7_20_19 [2] */ 3611 + FN_DU1_DR7, FN_LCDOUT7, FN_SSI_SDATA1_B, 0, 3612 + /* IP7_18_17 [2] */ 3613 + FN_DU1_DR6, FN_LCDOUT6, FN_SSI_WS1_B, 0, 3614 + /* IP7_16_15 [2] */ 3615 + FN_DU1_DR5, FN_LCDOUT5, FN_SSI_SCK1_B, 0, 3616 + /* IP7_14_13 [2] */ 3617 + FN_DU1_DR4, FN_LCDOUT4, FN_SSI_SDATA0_B, 0, 3618 + /* IP7_12_11 [2] */ 3619 + FN_DU1_DR3, FN_LCDOUT3, FN_SSI_WS0129_B, 0, 3620 + /* IP7_10_9 [2] */ 3621 + FN_DU1_DR2, FN_LCDOUT2, FN_SSI_SCK0129_B, 0, 3622 + /* IP7_8_6 [3] */ 3623 + FN_DU1_DR1, FN_LCDOUT1, FN_VI1_DATA1_B, FN_RX0_B, 3624 + FN_SCIFA0_RXD_B, FN_MSIOF2_SYNC_B, 3625 + 0, 0, 3626 + /* IP7_5_3 [3] */ 3627 + FN_DU1_DR0, FN_LCDOUT0, FN_VI1_DATA0_B, FN_TX0_B, 3628 + FN_SCIFA0_TXD_B, FN_MSIOF2_SCK_B, 3629 + 0, 0, 3630 + /* IP7_2_0 [3] */ 3631 + FN_IRQ9, FN_DU1_DOTCLKIN_B, FN_CAN_CLK_D, FN_GPS_MAG_C, 3632 + FN_SCIF_CLK_B, FN_GPS_MAG_D, 3633 + 0, 0, } 3634 + }, 3635 + { PINMUX_CFG_REG_VAR("IPSR8", 0xE6060040, 32, 3636 + 1, 3, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3) { 3637 + /* IP8_31 [1] */ 3638 + 0, 0, 3639 + /* IP8_30_28 [3] */ 3640 + FN_DU1_DB5, FN_LCDOUT21, FN_TX3, FN_SCIFA3_TXD, FN_CAN1_TX, 3641 + 0, 0, 0, 3642 + /* IP8_27_26 [2] */ 3643 + FN_DU1_DB4, FN_LCDOUT20, FN_VI1_FIELD_B, FN_CAN1_RX, 3644 + /* IP8_25_24 [2] */ 3645 + FN_DU1_DB3, FN_LCDOUT19, FN_VI1_CLKENB_B, 0, 3646 + /* IP8_23_21 [3] */ 3647 + FN_DU1_DB2, FN_LCDOUT18, FN_VI1_VSYNC_N_B, FN_SCIF2_SCK_B, 3648 + FN_SCIFA2_SCK, FN_SSI_SDATA9_B, 3649 + 0, 0, 3650 + /* IP8_20_18 [3] */ 3651 + FN_DU1_DB1, FN_LCDOUT17, FN_VI1_HSYNC_N_B, FN_RX2_B, 3652 + FN_SCIFA2_RXD_B, FN_MSIOF2_RXD_B, 3653 + 0, 0, 3654 + /* IP8_17_15 [3] */ 3655 + FN_DU1_DB0, FN_LCDOUT16, FN_VI1_CLK_B, FN_TX2_B, 3656 + FN_SCIFA2_TXD_B, FN_MSIOF2_TXD_B, 3657 + 0, 0, 3658 + /* IP8_14_12 [3] */ 3659 + FN_DU1_DG7, FN_LCDOUT15, FN_HTX0_B, 3660 + FN_SCIFB2_RTS_N_B, FN_SSI_WS9_B, 3661 + 0, 0, 0, 3662 + /* IP8_11_9 [3] */ 3663 + FN_DU1_DG6, FN_LCDOUT14, FN_HRTS0_N_B, 3664 + FN_SCIFB2_CTS_N_B, FN_SSI_SCK9_B, 3665 + 0, 0, 0, 3666 + /* IP8_8_6 [3] */ 3667 + FN_DU1_DG5, FN_LCDOUT13, FN_VI1_DATA7_B, FN_HCTS0_N_B, 3668 + FN_SCIFB2_TXD_B, FN_SSI_SDATA8_B, 3669 + 0, 0, 3670 + /* IP8_5_3 [3] */ 3671 + FN_DU1_DG4, FN_LCDOUT12, FN_VI1_DATA6_B, FN_HRX0_B, 3672 + FN_SCIFB2_RXD_B, FN_SSI_SDATA7_B, 3673 + 0, 0, 3674 + /* IP8_2_0 [3] */ 3675 + FN_DU1_DG3, FN_LCDOUT11, FN_VI1_DATA5_B, 0, FN_SSI_WS78_B, 3676 + 0, 0, 0, } 3677 + }, 3678 + { PINMUX_CFG_REG_VAR("IPSR9", 0xE6060044, 32, 3679 + 3, 2, 2, 2, 2, 2, 2, 1, 3, 1, 1, 3, 1, 1, 3, 3) { 3680 + /* IP9_31_29 [3] */ 3681 + FN_VI0_G0, FN_SCL8, FN_STP_IVCXO27_0_C, FN_SCL4, 3682 + FN_HCTS2_N, FN_SCIFB2_CTS_N, FN_ATAWR1_N, 0, 3683 + /* IP9_28_27 [2] */ 3684 + FN_VI0_DATA3_VI0_B3, FN_SCIF3_SCK_B, FN_SCIFA3_SCK_B, 0, 3685 + /* IP9_26_25 [2] */ 3686 + FN_VI0_VSYNC_N, FN_RX5, FN_SCIFA5_RXD, FN_TS_SPSYNC0_D, 3687 + /* IP9_24_23 [2] */ 3688 + FN_VI0_HSYNC_N, FN_TX5, FN_SCIFA5_TXD, FN_TS_SDEN0_D, 3689 + /* IP9_22_21 [2] */ 3690 + FN_VI0_FIELD, FN_RX4, FN_SCIFA4_RXD, FN_TS_SCK0_D, 3691 + /* IP9_20_19 [2] */ 3692 + FN_VI0_CLKENB, FN_TX4, FN_SCIFA4_TXD, FN_TS_SDATA0_D, 3693 + /* IP9_18_17 [2] */ 3694 + FN_DU1_CDE, FN_QPOLB, FN_PWM4_B, 0, 3695 + /* IP9_16 [1] */ 3696 + FN_DU1_DISP, FN_QPOLA, 3697 + /* IP9_15_13 [3] */ 3698 + FN_DU1_EXODDF_DU1_ODDF_DISP_CDE, FN_QCPV_QDE, 3699 + FN_CAN0_RX, FN_RX3_B, FN_SDA2_B, 3700 + 0, 0, 0, 3701 + /* IP9_12 [1] */ 3702 + FN_DU1_EXVSYNC_DU1_VSYNC, FN_QSTB_QHE, 3703 + /* IP9_11 [1] */ 3704 + FN_DU1_EXHSYNC_DU1_HSYNC, FN_QSTH_QHS, 3705 + /* IP9_10_8 [3] */ 3706 + FN_DU1_DOTCLKOUT1, FN_QSTVB_QVE, FN_CAN0_TX, 3707 + FN_TX3_B, FN_SCL2_B, FN_PWM4, 3708 + 0, 0, 3709 + /* IP9_7 [1] */ 3710 + FN_DU1_DOTCLKOUT0, FN_QCLK, 3711 + /* IP9_6 [1] */ 3712 + FN_DU1_DOTCLKIN, FN_QSTVA_QVS, 3713 + /* IP9_5_3 [3] */ 3714 + FN_DU1_DB7, FN_LCDOUT23, FN_SDA3_C, 3715 + FN_SCIF3_SCK, FN_SCIFA3_SCK, 3716 + 0, 0, 0, 3717 + /* IP9_2_0 [3] */ 3718 + FN_DU1_DB6, FN_LCDOUT22, FN_SCL3_C, FN_RX3, FN_SCIFA3_RXD, 3719 + 0, 0, 0, } 3720 + }, 3721 + { PINMUX_CFG_REG_VAR("IPSR10", 0xE6060048, 32, 3722 + 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 3, 3) { 3723 + /* IP10_31_29 [3] */ 3724 + FN_VI0_R4, FN_VI2_DATA5, FN_GLO_SCLK_B, FN_TX0_C, FN_SCL1_D, 3725 + 0, 0, 0, 3726 + /* IP10_28_27 [2] */ 3727 + FN_VI0_R3, FN_VI2_DATA4, FN_GLO_Q1_B, FN_TS_SPSYNC0_C, 3728 + /* IP10_26_25 [2] */ 3729 + FN_VI0_R2, FN_VI2_DATA3, FN_GLO_Q0_B, FN_TS_SDEN0_C, 3730 + /* IP10_24_22 [3] */ 3731 + FN_VI0_R1, FN_VI2_DATA2, FN_GLO_I1_B, FN_TS_SCK0_C, FN_ATAG1_N, 3732 + 0, 0, 0, 3733 + /* IP10_21_29 [3] */ 3734 + FN_VI0_R0, FN_VI2_DATA1, FN_GLO_I0_B, 3735 + FN_TS_SDATA0_C, FN_ATACS11_N, 3736 + 0, 0, 0, 3737 + /* IP10_18_17 [2] */ 3738 + FN_VI0_G7, FN_VI2_DATA0, FN_FMIN_D, 0, 3739 + /* IP10_16_15 [2] */ 3740 + FN_VI0_G6, FN_VI2_CLK, FN_BPFCLK_D, 0, 3741 + /* IP10_14_12 [3] */ 3742 + FN_VI0_G5, FN_VI2_FIELD, FN_STP_OPWM_0_C, FN_FMCLK_D, 3743 + FN_CAN0_TX_E, FN_HTX1_D, FN_SCIFB0_TXD_D, 0, 3744 + /* IP10_11_9 [3] */ 3745 + FN_VI0_G4, FN_VI2_CLKENB, FN_STP_ISSYNC_0_C, 3746 + FN_HTX2, FN_SCIFB2_TXD, FN_SCIFB0_SCK_D, 3747 + 0, 0, 3748 + /* IP10_8_6 [3] */ 3749 + FN_VI0_G3, FN_VI2_VSYNC_N, FN_STP_ISEN_0_C, FN_SDA3_B, 3750 + FN_HRX2, FN_SCIFB2_RXD, FN_ATACS01_N, 0, 3751 + /* IP10_5_3 [3] */ 3752 + FN_VI0_G2, FN_VI2_HSYNC_N, FN_STP_ISD_0_C, FN_SCL3_B, 3753 + FN_HSCK2, FN_SCIFB2_SCK, FN_ATARD1_N, 0, 3754 + /* IP10_2_0 [3] */ 3755 + FN_VI0_G1, FN_SDA8, FN_STP_ISCLK_0_C, FN_SDA4, 3756 + FN_HRTS2_N, FN_SCIFB2_RTS_N, FN_ATADIR1_N, 0, } 3757 + }, 3758 + { PINMUX_CFG_REG_VAR("IPSR11", 0xE606004C, 32, 3759 + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3760 + 3, 3, 3, 3, 3) { 3761 + /* IP11_31_30 [2] */ 3762 + FN_ETH_CRS_DV, FN_AVB_LINK, FN_SDA2_C, 0, 3763 + /* IP11_29_28 [2] */ 3764 + FN_ETH_MDIO, FN_AVB_RX_CLK, FN_SCL2_C, 0, 3765 + /* IP11_27 [1] */ 3766 + FN_VI1_DATA7, FN_AVB_MDC, 3767 + /* IP11_26 [1] */ 3768 + FN_VI1_DATA6, FN_AVB_MAGIC, 3769 + /* IP11_25 [1] */ 3770 + FN_VI1_DATA5, FN_AVB_RX_DV, 3771 + /* IP11_24 [1] */ 3772 + FN_VI1_DATA4, FN_AVB_MDIO, 3773 + /* IP11_23 [1] */ 3774 + FN_VI1_DATA3, FN_AVB_RX_ER, 3775 + /* IP11_22 [1] */ 3776 + FN_VI1_DATA2, FN_AVB_RXD7, 3777 + /* IP11_21 [1] */ 3778 + FN_VI1_DATA1, FN_AVB_RXD6, 3779 + /* IP11_20 [1] */ 3780 + FN_VI1_DATA0, FN_AVB_RXD5, 3781 + /* IP11_19 [1] */ 3782 + FN_VI1_CLK, FN_AVB_RXD4, 3783 + /* IP11_18_17 [2] */ 3784 + FN_VI1_FIELD, FN_AVB_RXD3, FN_TS_SPSYNC0_B, 0, 3785 + /* IP11_16_15 [2] */ 3786 + FN_VI1_CLKENB, FN_AVB_RXD2, FN_TS_SDEN0_B, 0, 3787 + /* IP11_14_12 [3] */ 3788 + FN_VI1_VSYNC_N, FN_AVB_RXD1, FN_TS_SCK0_B, 3789 + FN_RX4_B, FN_SCIFA4_RXD_B, 3790 + 0, 0, 0, 3791 + /* IP11_11_9 [3] */ 3792 + FN_VI1_HSYNC_N, FN_AVB_RXD0, FN_TS_SDATA0_B, 3793 + FN_TX4_B, FN_SCIFA4_TXD_B, 3794 + 0, 0, 0, 3795 + /* IP11_8_6 [3] */ 3796 + FN_VI0_R7, FN_GLO_RFON_B, FN_RX1_C, FN_CAN0_RX_E, 3797 + FN_SDA4_B, FN_HRX1_D, FN_SCIFB0_RXD_D, 0, 3798 + /* IP11_5_3 [3] */ 3799 + FN_VI0_R6, FN_VI2_DATA7, FN_GLO_SS_B, FN_TX1_C, FN_SCL4_B, 3800 + 0, 0, 0, 3801 + /* IP11_2_0 [3] */ 3802 + FN_VI0_R5, FN_VI2_DATA6, FN_GLO_SDATA_B, FN_RX0_C, FN_SDA1_D, 3803 + 0, 0, 0, } 3804 + }, 3805 + { PINMUX_CFG_REG_VAR("IPSR12", 0xE6060050, 32, 3806 + 2, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3, 2, 2) { 3807 + /* IP12_31_30 [2] */ 3808 + 0, 0, 0, 0, 3809 + /* IP12_29_27 [3] */ 3810 + FN_STP_ISCLK_0, FN_AVB_TX_EN, FN_SCIFB2_RXD_D, 3811 + FN_ADICS_SAMP_B, FN_MSIOF0_SCK_C, 3812 + 0, 0, 0, 3813 + /* IP12_26_24 [3] */ 3814 + FN_STP_IVCXO27_0, FN_AVB_TXD7, FN_SCIFB2_TXD_D, 3815 + FN_ADIDATA_B, FN_MSIOF0_SYNC_C, 3816 + 0, 0, 0, 3817 + /* IP12_23_22 [2] */ 3818 + FN_ETH_MDC, FN_AVB_TXD6, FN_IERX_C, 0, 3819 + /* IP12_21_20 [2] */ 3820 + FN_ETH_TXD0, FN_AVB_TXD5, FN_IECLK_C, 0, 3821 + /* IP12_19_18 [2] */ 3822 + FN_ETH_MAGIC, FN_AVB_TXD4, FN_IETX_C, 0, 3823 + /* IP12_17_16 [2] */ 3824 + FN_ETH_TX_EN, FN_AVB_TXD3, FN_TCLK1_B, FN_CAN_CLK_B, 3825 + /* IP12_15_13 [3] */ 3826 + FN_ETH_TXD1, FN_AVB_TXD2, FN_SCIFA3_TXD_B, 3827 + FN_CAN1_TX_C, FN_MSIOF1_TXD_E, 3828 + 0, 0, 0, 3829 + /* IP12_12_10 [3] */ 3830 + FN_ETH_REFCLK, FN_AVB_TXD1, FN_SCIFA3_RXD_B, 3831 + FN_CAN1_RX_C, FN_MSIOF1_SYNC_E, 3832 + 0, 0, 0, 3833 + /* IP12_9_7 [3] */ 3834 + FN_ETH_LINK, FN_AVB_TXD0, FN_CAN0_RX_C, 3835 + FN_SDA2_D, FN_MSIOF1_SCK_E, 3836 + 0, 0, 0, 3837 + /* IP12_6_4 [3] */ 3838 + FN_ETH_RXD1, FN_AVB_GTXREFCLK, FN_CAN0_TX_C, 3839 + FN_SCL2_D, FN_MSIOF1_RXD_E, 3840 + 0, 0, 0, 3841 + /* IP12_3_2 [2] */ 3842 + FN_ETH_RXD0, FN_AVB_PHY_INT, FN_SDA3, FN_SDA7, 3843 + /* IP12_1_0 [2] */ 3844 + FN_ETH_RX_ER, FN_AVB_CRS, FN_SCL3, FN_SCL7, } 3845 + }, 3846 + { PINMUX_CFG_REG_VAR("IPSR13", 0xE6060054, 32, 3847 + 1, 3, 1, 1, 1, 2, 1, 3, 3, 1, 1, 1, 1, 1, 1, 3848 + 3, 2, 2, 3) { 3849 + /* IP13_31 [1] */ 3850 + 0, 0, 3851 + /* IP13_30_28 [3] */ 3852 + FN_SD1_CD, FN_PWM0, FN_TPU_TO0, FN_SCL1_C, 3853 + 0, 0, 0, 0, 3854 + /* IP13_27 [1] */ 3855 + FN_SD1_DATA3, FN_IERX_B, 3856 + /* IP13_26 [1] */ 3857 + FN_SD1_DATA2, FN_IECLK_B, 3858 + /* IP13_25 [1] */ 3859 + FN_SD1_DATA1, FN_IETX_B, 3860 + /* IP13_24_23 [2] */ 3861 + FN_SD1_DATA0, FN_SPEEDIN_B, 0, 0, 3862 + /* IP13_22 [1] */ 3863 + FN_SD1_CMD, FN_REMOCON_B, 3864 + /* IP13_21_19 [3] */ 3865 + FN_SD0_WP, FN_MMC_D7_B, FN_SIM0_D_B, FN_CAN0_TX_F, 3866 + FN_SCIFA5_RXD_B, FN_RX3_C, 3867 + 0, 0, 3868 + /* IP13_18_16 [3] */ 3869 + FN_SD0_CD, FN_MMC_D6_B, FN_SIM0_RST_B, FN_CAN0_RX_F, 3870 + FN_SCIFA5_TXD_B, FN_TX3_C, 3871 + 0, 0, 3872 + /* IP13_15 [1] */ 3873 + FN_SD0_DATA3, FN_SSL_B, 3874 + /* IP13_14 [1] */ 3875 + FN_SD0_DATA2, FN_IO3_B, 3876 + /* IP13_13 [1] */ 3877 + FN_SD0_DATA1, FN_IO2_B, 3878 + /* IP13_12 [1] */ 3879 + FN_SD0_DATA0, FN_MISO_IO1_B, 3880 + /* IP13_11 [1] */ 3881 + FN_SD0_CMD, FN_MOSI_IO0_B, 3882 + /* IP13_10 [1] */ 3883 + FN_SD0_CLK, FN_SPCLK_B, 3884 + /* IP13_9_7 [3] */ 3885 + FN_STP_OPWM_0, FN_AVB_GTX_CLK, FN_PWM0_B, 3886 + FN_ADICHS2_B, FN_MSIOF0_TXD_C, 3887 + 0, 0, 0, 3888 + /* IP13_6_5 [2] */ 3889 + FN_STP_ISSYNC_0, FN_AVB_COL, FN_ADICHS1_B, FN_MSIOF0_RXD_C, 3890 + /* IP13_4_3 [2] */ 3891 + FN_STP_ISEN_0, FN_AVB_TX_CLK, FN_ADICHS0_B, FN_MSIOF0_SS2_C, 3892 + /* IP13_2_0 [3] */ 3893 + FN_STP_ISD_0, FN_AVB_TX_ER, FN_SCIFB2_SCK_C, 3894 + FN_ADICLK_B, FN_MSIOF0_SS1_C, 3895 + 0, 0, 0, } 3896 + }, 3897 + { PINMUX_CFG_REG_VAR("IPSR14", 0xE6060058, 32, 3898 + 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 2) { 3899 + /* IP14_31_29 [3] */ 3900 + FN_MSIOF0_SS2, FN_MMC_D7, FN_ADICHS2, FN_RX0_E, 3901 + FN_VI1_VSYNC_N_C, FN_SDA7_C, FN_VI1_G5_B, 0, 3902 + /* IP14_28_26 [3] */ 3903 + FN_MSIOF0_SS1, FN_MMC_D6, FN_ADICHS1, FN_TX0_E, 3904 + FN_VI1_HSYNC_N_C, FN_SCL7_C, FN_VI1_G4_B, 0, 3905 + /* IP14_25_23 [3] */ 3906 + FN_MSIOF0_RXD, FN_ADICHS0, 0, FN_VI1_DATA0_C, FN_VI1_G3_B, 3907 + 0, 0, 0, 3908 + /* IP14_22_20 [3] */ 3909 + FN_MSIOF0_TXD, FN_ADICLK, 0, FN_VI1_FIELD_C, FN_VI1_G2_B, 3910 + 0, 0, 0, 3911 + /* IP14_19_17 [3] */ 3912 + FN_MSIOF0_SYNC, FN_TX2_C, FN_ADICS_SAMP, 0, 3913 + FN_VI1_CLKENB_C, FN_VI1_G1_B, 3914 + 0, 0, 3915 + /* IP14_16_14 [3] */ 3916 + FN_MSIOF0_SCK, FN_RX2_C, FN_ADIDATA, 0, 3917 + FN_VI1_CLK_C, FN_VI1_G0_B, 3918 + 0, 0, 3919 + /* IP14_13_11 [3] */ 3920 + FN_SD2_WP, FN_MMC_D5, FN_SDA8_C, FN_RX5_B, FN_SCIFA5_RXD_C, 3921 + 0, 0, 0, 3922 + /* IP14_10_8 [3] */ 3923 + FN_SD2_CD, FN_MMC_D4, FN_SCL8_C, FN_TX5_B, FN_SCIFA5_TXD_C, 3924 + 0, 0, 0, 3925 + /* IP14_7 [1] */ 3926 + FN_SD2_DATA3, FN_MMC_D3, 3927 + /* IP14_6 [1] */ 3928 + FN_SD2_DATA2, FN_MMC_D2, 3929 + /* IP14_5 [1] */ 3930 + FN_SD2_DATA1, FN_MMC_D1, 3931 + /* IP14_4 [1] */ 3932 + FN_SD2_DATA0, FN_MMC_D0, 3933 + /* IP14_3 [1] */ 3934 + FN_SD2_CMD, FN_MMC_CMD, 3935 + /* IP14_2 [1] */ 3936 + FN_SD2_CLK, FN_MMC_CLK, 3937 + /* IP14_1_0 [2] */ 3938 + FN_SD1_WP, FN_PWM1_B, FN_SDA1_C, 0, } 3939 + }, 3940 + { PINMUX_CFG_REG_VAR("IPSR15", 0xE606005C, 32, 3941 + 2, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2) { 3942 + /* IP15_31_30 [2] */ 3943 + 0, 0, 0, 0, 3944 + /* IP15_29_27 [3] */ 3945 + FN_HTX0, FN_SCIFB0_TXD, 0, FN_GLO_SCLK_C, 3946 + FN_CAN0_TX_B, FN_VI1_DATA5_C, 3947 + 0, 0, 3948 + /* IP15_26_24 [3] */ 3949 + FN_HRX0, FN_SCIFB0_RXD, 0, FN_GLO_Q1_C, 3950 + FN_CAN0_RX_B, FN_VI1_DATA4_C, 3951 + 0, 0, 3952 + /* IP15_23_21 [3] */ 3953 + FN_HSCK0, FN_SCIFB0_SCK, 0, FN_GLO_Q0_C, FN_CAN_CLK, 3954 + FN_TCLK2, FN_VI1_DATA3_C, 0, 3955 + /* IP15_20_18 [3] */ 3956 + FN_HRTS0_N, FN_SCIFB0_RTS_N, 0, FN_GLO_I1_C, FN_VI1_DATA2_C, 3957 + 0, 0, 0, 3958 + /* IP15_17_15 [3] */ 3959 + FN_HCTS0_N, FN_SCIFB0_CTS_N, 0, FN_GLO_I0_C, 3960 + FN_TCLK1, FN_VI1_DATA1_C, 3961 + 0, 0, 3962 + /* IP15_14_12 [3] */ 3963 + FN_GPS_MAG, FN_RX4_C, FN_SCIFA4_RXD_C, FN_PWM6, 3964 + FN_VI1_G7_B, FN_SCIFA3_SCK_C, 3965 + 0, 0, 3966 + /* IP15_11_9 [3] */ 3967 + FN_GPS_SIGN, FN_TX4_C, FN_SCIFA4_TXD_C, FN_PWM5, 3968 + FN_VI1_G6_B, FN_SCIFA3_RXD_C, 3969 + 0, 0, 3970 + /* IP15_8_6 [3] */ 3971 + FN_GPS_CLK, FN_DU1_DOTCLKIN_C, FN_AUDIO_CLKB_B, 3972 + FN_PWM5_B, FN_SCIFA3_TXD_C, 3973 + 0, 0, 0, 3974 + /* IP15_5_4 [2] */ 3975 + FN_SIM0_D, FN_IERX, FN_CAN1_RX_D, 0, 3976 + /* IP15_3_2 [2] */ 3977 + FN_SIM0_CLK, FN_IECLK, FN_CAN_CLK_C, 0, 3978 + /* IP15_1_0 [2] */ 3979 + FN_SIM0_RST, FN_IETX, FN_CAN1_TX_D, 0, } 3980 + }, 3981 + { PINMUX_CFG_REG_VAR("IPSR16", 0xE6060160, 32, 3982 + 4, 4, 4, 4, 4, 2, 2, 2, 3, 3) { 3983 + /* IP16_31_28 [4] */ 3984 + 0, 0, 0, 0, 0, 0, 0, 0, 3985 + 0, 0, 0, 0, 0, 0, 0, 0, 3986 + /* IP16_27_24 [4] */ 3987 + 0, 0, 0, 0, 0, 0, 0, 0, 3988 + 0, 0, 0, 0, 0, 0, 0, 0, 3989 + /* IP16_23_20 [4] */ 3990 + 0, 0, 0, 0, 0, 0, 0, 0, 3991 + 0, 0, 0, 0, 0, 0, 0, 0, 3992 + /* IP16_19_16 [4] */ 3993 + 0, 0, 0, 0, 0, 0, 0, 0, 3994 + 0, 0, 0, 0, 0, 0, 0, 0, 3995 + /* IP16_15_12 [4] */ 3996 + 0, 0, 0, 0, 0, 0, 0, 0, 3997 + 0, 0, 0, 0, 0, 0, 0, 0, 3998 + /* IP16_11_10 [2] */ 3999 + FN_HRTS1_N, FN_SCIFB1_RTS_N, FN_MLB_DAT, FN_CAN1_RX_B, 4000 + /* IP16_9_8 [2] */ 4001 + FN_HCTS1_N, FN_SCIFB1_CTS_N, FN_MLB_SIG, FN_CAN1_TX_B, 4002 + /* IP16_7_6 [2] */ 4003 + FN_HSCK1, FN_SCIFB1_SCK, FN_MLB_CK, FN_GLO_RFON_C, 4004 + /* IP16_5_3 [3] */ 4005 + FN_HTX1, FN_SCIFB1_TXD, FN_VI1_R1_B, 4006 + FN_GLO_SS_C, FN_VI1_DATA7_C, 4007 + 0, 0, 0, 4008 + /* IP16_2_0 [3] */ 4009 + FN_HRX1, FN_SCIFB1_RXD, FN_VI1_R0_B, 4010 + FN_GLO_SDATA_C, FN_VI1_DATA6_C, 4011 + 0, 0, 0, } 4012 + }, 4013 + { PINMUX_CFG_REG_VAR("MOD_SEL", 0xE6060090, 32, 4014 + 1, 2, 2, 2, 3, 2, 1, 1, 1, 1, 4015 + 3, 2, 2, 2, 1, 2, 2, 2) { 4016 + /* RESEVED [1] */ 4017 + 0, 0, 4018 + /* SEL_SCIF1 [2] */ 4019 + FN_SEL_SCIF1_0, FN_SEL_SCIF1_1, FN_SEL_SCIF1_2, FN_SEL_SCIF1_3, 4020 + /* SEL_SCIFB [2] */ 4021 + FN_SEL_SCIFB_0, FN_SEL_SCIFB_1, FN_SEL_SCIFB_2, FN_SEL_SCIFB_3, 4022 + /* SEL_SCIFB2 [2] */ 4023 + FN_SEL_SCIFB2_0, FN_SEL_SCIFB2_1, 4024 + FN_SEL_SCIFB2_2, FN_SEL_SCIFB2_3, 4025 + /* SEL_SCIFB1 [3] */ 4026 + FN_SEL_SCIFB1_0, FN_SEL_SCIFB1_1, 4027 + FN_SEL_SCIFB1_2, FN_SEL_SCIFB1_3, 4028 + 0, 0, 0, 0, 4029 + /* SEL_SCIFA1 [2] */ 4030 + FN_SEL_SCIFA1_0, FN_SEL_SCIFA1_1, FN_SEL_SCIFA1_2, 0, 4031 + /* SEL_SSI9 [1] */ 4032 + FN_SEL_SSI9_0, FN_SEL_SSI9_1, 4033 + /* SEL_SCFA [1] */ 4034 + FN_SEL_SCFA_0, FN_SEL_SCFA_1, 4035 + /* SEL_QSP [1] */ 4036 + FN_SEL_QSP_0, FN_SEL_QSP_1, 4037 + /* SEL_SSI7 [1] */ 4038 + FN_SEL_SSI7_0, FN_SEL_SSI7_1, 4039 + /* SEL_HSCIF1 [3] */ 4040 + FN_SEL_HSCIF1_0, FN_SEL_HSCIF1_1, FN_SEL_HSCIF1_2, 4041 + FN_SEL_HSCIF1_3, FN_SEL_HSCIF1_4, 4042 + 0, 0, 0, 4043 + /* RESEVED [2] */ 4044 + 0, 0, 0, 0, 4045 + /* SEL_VI1 [2] */ 4046 + FN_SEL_VI1_0, FN_SEL_VI1_1, FN_SEL_VI1_2, 0, 4047 + /* RESEVED [2] */ 4048 + 0, 0, 0, 0, 4049 + /* SEL_TMU [1] */ 4050 + FN_SEL_TMU1_0, FN_SEL_TMU1_1, 4051 + /* SEL_LBS [2] */ 4052 + FN_SEL_LBS_0, FN_SEL_LBS_1, FN_SEL_LBS_2, FN_SEL_LBS_3, 4053 + /* SEL_TSIF0 [2] */ 4054 + FN_SEL_TSIF0_0, FN_SEL_TSIF0_1, FN_SEL_TSIF0_2, FN_SEL_TSIF0_3, 4055 + /* SEL_SOF0 [2] */ 4056 + FN_SEL_SOF0_0, FN_SEL_SOF0_1, FN_SEL_SOF0_2, 0, } 4057 + }, 4058 + { PINMUX_CFG_REG_VAR("MOD_SEL2", 0xE6060094, 32, 4059 + 3, 1, 1, 3, 2, 1, 1, 2, 2, 4060 + 1, 3, 2, 1, 2, 2, 2, 1, 1, 1) { 4061 + /* SEL_SCIF0 [3] */ 4062 + FN_SEL_SCIF0_0, FN_SEL_SCIF0_1, FN_SEL_SCIF0_2, 4063 + FN_SEL_SCIF0_3, FN_SEL_SCIF0_4, 4064 + 0, 0, 0, 4065 + /* RESEVED [1] */ 4066 + 0, 0, 4067 + /* SEL_SCIF [1] */ 4068 + FN_SEL_SCIF_0, FN_SEL_SCIF_1, 4069 + /* SEL_CAN0 [3] */ 4070 + FN_SEL_CAN0_0, FN_SEL_CAN0_1, FN_SEL_CAN0_2, FN_SEL_CAN0_3, 4071 + FN_SEL_CAN0_4, FN_SEL_CAN0_5, 4072 + 0, 0, 4073 + /* SEL_CAN1 [2] */ 4074 + FN_SEL_CAN1_0, FN_SEL_CAN1_1, FN_SEL_CAN1_2, FN_SEL_CAN1_3, 4075 + /* RESEVED [1] */ 4076 + 0, 0, 4077 + /* SEL_SCIFA2 [1] */ 4078 + FN_SEL_SCIFA2_0, FN_SEL_SCIFA2_1, 4079 + /* SEL_SCIF4 [2] */ 4080 + FN_SEL_SCIF4_0, FN_SEL_SCIF4_1, FN_SEL_SCIF4_2, 0, 4081 + /* RESEVED [2] */ 4082 + 0, 0, 0, 0, 4083 + /* SEL_ADG [1] */ 4084 + FN_SEL_ADG_0, FN_SEL_ADG_1, 4085 + /* SEL_FM [3] */ 4086 + FN_SEL_FM_0, FN_SEL_FM_1, FN_SEL_FM_2, 4087 + FN_SEL_FM_3, FN_SEL_FM_4, 4088 + 0, 0, 0, 4089 + /* SEL_SCIFA5 [2] */ 4090 + FN_SEL_SCIFA5_0, FN_SEL_SCIFA5_1, FN_SEL_SCIFA5_2, 0, 4091 + /* RESEVED [1] */ 4092 + 0, 0, 4093 + /* SEL_GPS [2] */ 4094 + FN_SEL_GPS_0, FN_SEL_GPS_1, FN_SEL_GPS_2, FN_SEL_GPS_3, 4095 + /* SEL_SCIFA4 [2] */ 4096 + FN_SEL_SCIFA4_0, FN_SEL_SCIFA4_1, FN_SEL_SCIFA4_2, 0, 4097 + /* SEL_SCIFA3 [2] */ 4098 + FN_SEL_SCIFA3_0, FN_SEL_SCIFA3_1, FN_SEL_SCIFA3_2, 0, 4099 + /* SEL_SIM [1] */ 4100 + FN_SEL_SIM_0, FN_SEL_SIM_1, 4101 + /* RESEVED [1] */ 4102 + 0, 0, 4103 + /* SEL_SSI8 [1] */ 4104 + FN_SEL_SSI8_0, FN_SEL_SSI8_1, } 4105 + }, 4106 + { PINMUX_CFG_REG_VAR("MOD_SEL3", 0xE6060098, 32, 4107 + 2, 2, 2, 2, 2, 2, 2, 2, 4108 + 1, 1, 2, 2, 3, 2, 2, 2, 1) { 4109 + /* SEL_HSCIF2 [2] */ 4110 + FN_SEL_HSCIF2_0, FN_SEL_HSCIF2_1, 4111 + FN_SEL_HSCIF2_2, FN_SEL_HSCIF2_3, 4112 + /* SEL_CANCLK [2] */ 4113 + FN_SEL_CANCLK_0, FN_SEL_CANCLK_1, 4114 + FN_SEL_CANCLK_2, FN_SEL_CANCLK_3, 4115 + /* SEL_IIC8 [2] */ 4116 + FN_SEL_IIC8_0, FN_SEL_IIC8_1, FN_SEL_IIC8_2, 0, 4117 + /* SEL_IIC7 [2] */ 4118 + FN_SEL_IIC7_0, FN_SEL_IIC7_1, FN_SEL_IIC7_2, 0, 4119 + /* SEL_IIC4 [2] */ 4120 + FN_SEL_IIC4_0, FN_SEL_IIC4_1, FN_SEL_IIC4_2, 0, 4121 + /* SEL_IIC3 [2] */ 4122 + FN_SEL_IIC3_0, FN_SEL_IIC3_1, FN_SEL_IIC3_2, FN_SEL_IIC3_3, 4123 + /* SEL_SCIF3 [2] */ 4124 + FN_SEL_SCIF3_0, FN_SEL_SCIF3_1, FN_SEL_SCIF3_2, FN_SEL_SCIF3_3, 4125 + /* SEL_IEB [2] */ 4126 + FN_SEL_IEB_0, FN_SEL_IEB_1, FN_SEL_IEB_2, 4127 + /* SEL_MMC [1] */ 4128 + FN_SEL_MMC_0, FN_SEL_MMC_1, 4129 + /* SEL_SCIF5 [1] */ 4130 + FN_SEL_SCIF5_0, FN_SEL_SCIF5_1, 4131 + /* RESEVED [2] */ 4132 + 0, 0, 0, 0, 4133 + /* SEL_IIC2 [2] */ 4134 + FN_SEL_IIC2_0, FN_SEL_IIC2_1, FN_SEL_IIC2_2, FN_SEL_IIC2_3, 4135 + /* SEL_IIC1 [3] */ 4136 + FN_SEL_IIC1_0, FN_SEL_IIC1_1, FN_SEL_IIC1_2, FN_SEL_IIC1_3, 4137 + FN_SEL_IIC1_4, 4138 + 0, 0, 0, 4139 + /* SEL_IIC0 [2] */ 4140 + FN_SEL_IIC0_0, FN_SEL_IIC0_1, FN_SEL_IIC0_2, 0, 4141 + /* RESEVED [2] */ 4142 + 0, 0, 0, 0, 4143 + /* RESEVED [2] */ 4144 + 0, 0, 0, 0, 4145 + /* RESEVED [1] */ 4146 + 0, 0, } 4147 + }, 4148 + { PINMUX_CFG_REG_VAR("MOD_SEL4", 0xE606009C, 32, 4149 + 3, 2, 2, 1, 1, 1, 1, 3, 2, 4150 + 2, 3, 1, 1, 1, 2, 2, 2, 2) { 4151 + /* SEL_SOF1 [3] */ 4152 + FN_SEL_SOF1_0, FN_SEL_SOF1_1, FN_SEL_SOF1_2, FN_SEL_SOF1_3, 4153 + FN_SEL_SOF1_4, 4154 + 0, 0, 0, 4155 + /* SEL_HSCIF0 [2] */ 4156 + FN_SEL_HSCIF0_0, FN_SEL_HSCIF0_1, FN_SEL_HSCIF0_2, 0, 4157 + /* SEL_DIS [2] */ 4158 + FN_SEL_DIS_0, FN_SEL_DIS_1, FN_SEL_DIS_2, 0, 4159 + /* RESEVED [1] */ 4160 + 0, 0, 4161 + /* SEL_RAD [1] */ 4162 + FN_SEL_RAD_0, FN_SEL_RAD_1, 4163 + /* SEL_RCN [1] */ 4164 + FN_SEL_RCN_0, FN_SEL_RCN_1, 4165 + /* SEL_RSP [1] */ 4166 + FN_SEL_RSP_0, FN_SEL_RSP_1, 4167 + /* SEL_SCIF2 [3] */ 4168 + FN_SEL_SCIF2_0, FN_SEL_SCIF2_1, FN_SEL_SCIF2_2, 4169 + FN_SEL_SCIF2_3, FN_SEL_SCIF2_4, 4170 + 0, 0, 0, 4171 + /* RESEVED [2] */ 4172 + 0, 0, 0, 0, 4173 + /* RESEVED [2] */ 4174 + 0, 0, 0, 0, 4175 + /* SEL_SOF2 [3] */ 4176 + FN_SEL_SOF2_0, FN_SEL_SOF2_1, FN_SEL_SOF2_2, 4177 + FN_SEL_SOF2_3, FN_SEL_SOF2_4, 4178 + 0, 0, 0, 4179 + /* RESEVED [1] */ 4180 + 0, 0, 4181 + /* SEL_SSI1 [1] */ 4182 + FN_SEL_SSI1_0, FN_SEL_SSI1_1, 4183 + /* SEL_SSI0 [1] */ 4184 + FN_SEL_SSI0_0, FN_SEL_SSI0_1, 4185 + /* SEL_SSP [2] */ 4186 + FN_SEL_SSP_0, FN_SEL_SSP_1, FN_SEL_SSP_2, 0, 4187 + /* RESEVED [2] */ 4188 + 0, 0, 0, 0, 4189 + /* RESEVED [2] */ 4190 + 0, 0, 0, 0, 4191 + /* RESEVED [2] */ 4192 + 0, 0, 0, 0, } 4193 + }, 4194 + { }, 4195 + }; 4196 + 4197 + const struct sh_pfc_soc_info r8a7791_pinmux_info = { 4198 + .name = "r8a77910_pfc", 4199 + .unlock_reg = 0xe6060000, /* PMMR */ 4200 + 4201 + .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END }, 4202 + 4203 + .pins = pinmux_pins, 4204 + .nr_pins = ARRAY_SIZE(pinmux_pins), 4205 + .groups = pinmux_groups, 4206 + .nr_groups = ARRAY_SIZE(pinmux_groups), 4207 + .functions = pinmux_functions, 4208 + .nr_functions = ARRAY_SIZE(pinmux_functions), 4209 + 4210 + .cfg_regs = pinmux_config_regs, 4211 + 4212 + .gpio_data = pinmux_data, 4213 + .gpio_data_size = ARRAY_SIZE(pinmux_data), 4214 + };
+56
drivers/pinctrl/sirf/pinctrl-atlas6.c
··· 122 122 PINCTRL_PIN(100, "ac97_dout"), 123 123 PINCTRL_PIN(101, "ac97_din"), 124 124 PINCTRL_PIN(102, "x_rtc_io"), 125 + 126 + PINCTRL_PIN(103, "x_usb1_dp"), 127 + PINCTRL_PIN(104, "x_usb1_dn"), 125 128 }; 126 129 127 130 static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = { ··· 142 139 static const struct sirfsoc_padmux lcd_16bits_padmux = { 143 140 .muxmask_counts = ARRAY_SIZE(lcd_16bits_sirfsoc_muxmask), 144 141 .muxmask = lcd_16bits_sirfsoc_muxmask, 142 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 145 143 .funcmask = BIT(4), 146 144 .funcval = 0, 147 145 }; ··· 168 164 static const struct sirfsoc_padmux lcd_18bits_padmux = { 169 165 .muxmask_counts = ARRAY_SIZE(lcd_18bits_muxmask), 170 166 .muxmask = lcd_18bits_muxmask, 167 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 171 168 .funcmask = BIT(4) | BIT(15), 172 169 .funcval = 0, 173 170 }; ··· 194 189 static const struct sirfsoc_padmux lcd_24bits_padmux = { 195 190 .muxmask_counts = ARRAY_SIZE(lcd_24bits_muxmask), 196 191 .muxmask = lcd_24bits_muxmask, 192 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 197 193 .funcmask = BIT(4) | BIT(15), 198 194 .funcval = 0, 199 195 }; ··· 220 214 static const struct sirfsoc_padmux lcdrom_padmux = { 221 215 .muxmask_counts = ARRAY_SIZE(lcdrom_muxmask), 222 216 .muxmask = lcdrom_muxmask, 217 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 223 218 .funcmask = BIT(4), 224 219 .funcval = BIT(4), 225 220 }; ··· 244 237 static const struct sirfsoc_padmux uart0_padmux = { 245 238 .muxmask_counts = ARRAY_SIZE(uart0_muxmask), 246 239 .muxmask = uart0_muxmask, 240 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 247 241 .funcmask = BIT(9), 248 242 .funcval = BIT(9), 249 243 }; ··· 292 284 static const struct sirfsoc_padmux uart2_padmux = { 293 285 .muxmask_counts = ARRAY_SIZE(uart2_muxmask), 294 286 .muxmask = uart2_muxmask, 287 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 295 288 .funcmask = BIT(10), 296 289 .funcval = BIT(10), 297 290 }; ··· 326 317 static const struct sirfsoc_padmux sdmmc3_padmux = { 327 318 .muxmask_counts = ARRAY_SIZE(sdmmc3_muxmask), 328 319 .muxmask = sdmmc3_muxmask, 320 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 329 321 .funcmask = BIT(7), 330 322 .funcval = 0, 331 323 }; ··· 346 336 static const struct sirfsoc_padmux spi0_padmux = { 347 337 .muxmask_counts = ARRAY_SIZE(spi0_muxmask), 348 338 .muxmask = spi0_muxmask, 339 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 349 340 .funcmask = BIT(7), 350 341 .funcval = BIT(7), 351 342 }; ··· 363 352 static const struct sirfsoc_padmux cko1_padmux = { 364 353 .muxmask_counts = ARRAY_SIZE(cko1_muxmask), 365 354 .muxmask = cko1_muxmask, 355 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 366 356 .funcmask = BIT(3), 367 357 .funcval = 0, 368 358 }; ··· 383 371 static const struct sirfsoc_padmux i2s_padmux = { 384 372 .muxmask_counts = ARRAY_SIZE(i2s_muxmask), 385 373 .muxmask = i2s_muxmask, 374 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 386 375 .funcmask = BIT(3), 387 376 .funcval = BIT(3), 388 377 }; ··· 403 390 static const struct sirfsoc_padmux i2s_no_din_padmux = { 404 391 .muxmask_counts = ARRAY_SIZE(i2s_no_din_muxmask), 405 392 .muxmask = i2s_no_din_muxmask, 393 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 406 394 .funcmask = BIT(3), 407 395 .funcval = BIT(3), 408 396 }; ··· 423 409 static const struct sirfsoc_padmux i2s_6chn_padmux = { 424 410 .muxmask_counts = ARRAY_SIZE(i2s_6chn_muxmask), 425 411 .muxmask = i2s_6chn_muxmask, 412 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 426 413 .funcmask = BIT(1) | BIT(3) | BIT(9), 427 414 .funcval = BIT(1) | BIT(3) | BIT(9), 428 415 }; ··· 454 439 static const struct sirfsoc_padmux spi1_padmux = { 455 440 .muxmask_counts = ARRAY_SIZE(spi1_muxmask), 456 441 .muxmask = spi1_muxmask, 442 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 457 443 .funcmask = BIT(16), 458 444 .funcval = 0, 459 445 }; ··· 471 455 static const struct sirfsoc_padmux sdmmc1_padmux = { 472 456 .muxmask_counts = ARRAY_SIZE(sdmmc1_muxmask), 473 457 .muxmask = sdmmc1_muxmask, 458 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 474 459 .funcmask = BIT(5), 475 460 .funcval = BIT(5), 476 461 }; ··· 488 471 static const struct sirfsoc_padmux gps_padmux = { 489 472 .muxmask_counts = ARRAY_SIZE(gps_muxmask), 490 473 .muxmask = gps_muxmask, 474 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 491 475 .funcmask = BIT(13), 492 476 .funcval = 0, 493 477 }; ··· 505 487 static const struct sirfsoc_padmux sdmmc5_padmux = { 506 488 .muxmask_counts = ARRAY_SIZE(sdmmc5_muxmask), 507 489 .muxmask = sdmmc5_muxmask, 490 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 508 491 .funcmask = BIT(13), 509 492 .funcval = BIT(13), 510 493 }; ··· 522 503 static const struct sirfsoc_padmux usp0_padmux = { 523 504 .muxmask_counts = ARRAY_SIZE(usp0_muxmask), 524 505 .muxmask = usp0_muxmask, 506 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 525 507 .funcmask = BIT(1) | BIT(2) | BIT(9), 526 508 .funcval = 0, 527 509 }; ··· 555 535 static const struct sirfsoc_padmux usp1_padmux = { 556 536 .muxmask_counts = ARRAY_SIZE(usp1_muxmask), 557 537 .muxmask = usp1_muxmask, 538 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 558 539 .funcmask = BIT(16), 559 540 .funcval = BIT(16), 560 541 }; ··· 575 554 static const struct sirfsoc_padmux nand_padmux = { 576 555 .muxmask_counts = ARRAY_SIZE(nand_muxmask), 577 556 .muxmask = nand_muxmask, 557 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 578 558 .funcmask = BIT(5) | BIT(19), 579 559 .funcval = 0, 580 560 }; ··· 592 570 static const struct sirfsoc_padmux sdmmc0_padmux = { 593 571 .muxmask_counts = ARRAY_SIZE(sdmmc0_muxmask), 594 572 .muxmask = sdmmc0_muxmask, 573 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 595 574 .funcmask = BIT(5) | BIT(19), 596 575 .funcval = BIT(19), 597 576 }; ··· 609 586 static const struct sirfsoc_padmux sdmmc2_padmux = { 610 587 .muxmask_counts = ARRAY_SIZE(sdmmc2_muxmask), 611 588 .muxmask = sdmmc2_muxmask, 589 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 612 590 .funcmask = BIT(11), 613 591 .funcval = 0, 614 592 }; ··· 626 602 static const struct sirfsoc_padmux sdmmc2_nowp_padmux = { 627 603 .muxmask_counts = ARRAY_SIZE(sdmmc2_nowp_muxmask), 628 604 .muxmask = sdmmc2_nowp_muxmask, 605 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 629 606 .funcmask = BIT(11), 630 607 .funcval = 0, 631 608 }; ··· 659 634 static const struct sirfsoc_padmux vip_padmux = { 660 635 .muxmask_counts = ARRAY_SIZE(vip_muxmask), 661 636 .muxmask = vip_muxmask, 637 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 662 638 .funcmask = BIT(18), 663 639 .funcval = BIT(18), 664 640 }; ··· 680 654 static const struct sirfsoc_padmux vip_noupli_padmux = { 681 655 .muxmask_counts = ARRAY_SIZE(vip_noupli_muxmask), 682 656 .muxmask = vip_noupli_muxmask, 657 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 683 658 .funcmask = BIT(15), 684 659 .funcval = BIT(15), 685 660 }; ··· 711 684 static const struct sirfsoc_padmux i2c1_padmux = { 712 685 .muxmask_counts = ARRAY_SIZE(i2c1_muxmask), 713 686 .muxmask = i2c1_muxmask, 687 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 714 688 .funcmask = BIT(16), 715 689 .funcval = 0, 716 690 }; ··· 728 700 static const struct sirfsoc_padmux pwm0_padmux = { 729 701 .muxmask_counts = ARRAY_SIZE(pwm0_muxmask), 730 702 .muxmask = pwm0_muxmask, 703 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 731 704 .funcmask = BIT(12), 732 705 .funcval = 0, 733 706 }; ··· 801 772 static const struct sirfsoc_padmux warm_rst_padmux = { 802 773 .muxmask_counts = ARRAY_SIZE(warm_rst_muxmask), 803 774 .muxmask = warm_rst_muxmask, 775 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 804 776 .funcmask = BIT(4), 805 777 .funcval = 0, 806 778 }; ··· 819 789 static const struct sirfsoc_padmux usb0_upli_drvbus_padmux = { 820 790 .muxmask_counts = ARRAY_SIZE(usb0_upli_drvbus_muxmask), 821 791 .muxmask = usb0_upli_drvbus_muxmask, 792 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 822 793 .funcmask = BIT(18), 823 794 .funcval = 0, 824 795 }; ··· 836 805 static const struct sirfsoc_padmux usb1_utmi_drvbus_padmux = { 837 806 .muxmask_counts = ARRAY_SIZE(usb1_utmi_drvbus_muxmask), 838 807 .muxmask = usb1_utmi_drvbus_muxmask, 808 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 839 809 .funcmask = BIT(11), 840 810 .funcval = BIT(11), /* refer to PAD_UTMI_DRVVBUS1_ENABLE */ 841 811 }; 842 812 843 813 static const unsigned usb1_utmi_drvbus_pins[] = { 28 }; 814 + 815 + static const struct sirfsoc_padmux usb1_dp_dn_padmux = { 816 + .muxmask_counts = 0, 817 + .ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, 818 + .funcmask = BIT(2), 819 + .funcval = BIT(2), 820 + }; 821 + 822 + static const unsigned usb1_dp_dn_pins[] = { 103, 104 }; 823 + 824 + static const struct sirfsoc_padmux uart1_route_io_usb1_padmux = { 825 + .muxmask_counts = 0, 826 + .ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, 827 + .funcmask = BIT(2), 828 + .funcval = 0, 829 + }; 830 + 831 + static const unsigned uart1_route_io_usb1_pins[] = { 103, 104 }; 844 832 845 833 static const struct sirfsoc_muxmask pulse_count_muxmask[] = { 846 834 { ··· 909 859 SIRFSOC_PIN_GROUP("sdmmc5grp", sdmmc5_pins), 910 860 SIRFSOC_PIN_GROUP("usb0_upli_drvbusgrp", usb0_upli_drvbus_pins), 911 861 SIRFSOC_PIN_GROUP("usb1_utmi_drvbusgrp", usb1_utmi_drvbus_pins), 862 + SIRFSOC_PIN_GROUP("usb1_dp_dngrp", usb1_dp_dn_pins), 863 + SIRFSOC_PIN_GROUP("uart1_route_io_usb1grp", uart1_route_io_usb1_pins), 912 864 SIRFSOC_PIN_GROUP("pulse_countgrp", pulse_count_pins), 913 865 SIRFSOC_PIN_GROUP("i2sgrp", i2s_pins), 914 866 SIRFSOC_PIN_GROUP("i2s_no_dingrp", i2s_no_din_pins), ··· 955 903 static const char * const sdmmc2_nowpgrp[] = { "sdmmc2_nowpgrp" }; 956 904 static const char * const usb0_upli_drvbusgrp[] = { "usb0_upli_drvbusgrp" }; 957 905 static const char * const usb1_utmi_drvbusgrp[] = { "usb1_utmi_drvbusgrp" }; 906 + static const char * const usb1_dp_dngrp[] = { "usb1_dp_dngrp" }; 907 + static const char * const uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" }; 958 908 static const char * const pulse_countgrp[] = { "pulse_countgrp" }; 959 909 static const char * const i2sgrp[] = { "i2sgrp" }; 960 910 static const char * const i2s_no_dingrp[] = { "i2s_no_dingrp" }; ··· 1003 949 SIRFSOC_PMX_FUNCTION("sdmmc2_nowp", sdmmc2_nowpgrp, sdmmc2_nowp_padmux), 1004 950 SIRFSOC_PMX_FUNCTION("usb0_upli_drvbus", usb0_upli_drvbusgrp, usb0_upli_drvbus_padmux), 1005 951 SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus", usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux), 952 + SIRFSOC_PMX_FUNCTION("usb1_dp_dn", usb1_dp_dngrp, usb1_dp_dn_padmux), 953 + SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1", uart1_route_io_usb1grp, uart1_route_io_usb1_padmux), 1006 954 SIRFSOC_PMX_FUNCTION("pulse_count", pulse_countgrp, pulse_count_padmux), 1007 955 SIRFSOC_PMX_FUNCTION("i2s", i2sgrp, i2s_padmux), 1008 956 SIRFSOC_PMX_FUNCTION("i2s_no_din", i2s_no_dingrp, i2s_no_din_padmux),
+115
drivers/pinctrl/sirf/pinctrl-prima2.c
··· 126 126 PINCTRL_PIN(112, "x_ldd[13]"), 127 127 PINCTRL_PIN(113, "x_ldd[14]"), 128 128 PINCTRL_PIN(114, "x_ldd[15]"), 129 + 130 + PINCTRL_PIN(115, "x_usb1_dp"), 131 + PINCTRL_PIN(116, "x_usb1_dn"), 129 132 }; 130 133 131 134 static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = { ··· 146 143 static const struct sirfsoc_padmux lcd_16bits_padmux = { 147 144 .muxmask_counts = ARRAY_SIZE(lcd_16bits_sirfsoc_muxmask), 148 145 .muxmask = lcd_16bits_sirfsoc_muxmask, 146 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 149 147 .funcmask = BIT(4), 150 148 .funcval = 0, 151 149 }; ··· 172 168 static const struct sirfsoc_padmux lcd_18bits_padmux = { 173 169 .muxmask_counts = ARRAY_SIZE(lcd_18bits_muxmask), 174 170 .muxmask = lcd_18bits_muxmask, 171 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 175 172 .funcmask = BIT(4), 176 173 .funcval = 0, 177 174 }; ··· 198 193 static const struct sirfsoc_padmux lcd_24bits_padmux = { 199 194 .muxmask_counts = ARRAY_SIZE(lcd_24bits_muxmask), 200 195 .muxmask = lcd_24bits_muxmask, 196 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 201 197 .funcmask = BIT(4), 202 198 .funcval = 0, 203 199 }; ··· 224 218 static const struct sirfsoc_padmux lcdrom_padmux = { 225 219 .muxmask_counts = ARRAY_SIZE(lcdrom_muxmask), 226 220 .muxmask = lcdrom_muxmask, 221 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 227 222 .funcmask = BIT(4), 228 223 .funcval = BIT(4), 229 224 }; ··· 245 238 static const struct sirfsoc_padmux uart0_padmux = { 246 239 .muxmask_counts = ARRAY_SIZE(uart0_muxmask), 247 240 .muxmask = uart0_muxmask, 241 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 248 242 .funcmask = BIT(9), 249 243 .funcval = BIT(9), 250 244 }; ··· 290 282 static const struct sirfsoc_padmux uart2_padmux = { 291 283 .muxmask_counts = ARRAY_SIZE(uart2_muxmask), 292 284 .muxmask = uart2_muxmask, 285 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 293 286 .funcmask = BIT(10), 294 287 .funcval = BIT(10), 295 288 }; ··· 324 315 static const struct sirfsoc_padmux sdmmc3_padmux = { 325 316 .muxmask_counts = ARRAY_SIZE(sdmmc3_muxmask), 326 317 .muxmask = sdmmc3_muxmask, 318 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 327 319 .funcmask = BIT(7), 328 320 .funcval = 0, 329 321 }; ··· 341 331 static const struct sirfsoc_padmux spi0_padmux = { 342 332 .muxmask_counts = ARRAY_SIZE(spi0_muxmask), 343 333 .muxmask = spi0_muxmask, 334 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 344 335 .funcmask = BIT(7), 345 336 .funcval = BIT(7), 346 337 }; ··· 372 361 static const struct sirfsoc_padmux cko1_padmux = { 373 362 .muxmask_counts = ARRAY_SIZE(cko1_muxmask), 374 363 .muxmask = cko1_muxmask, 364 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 375 365 .funcmask = BIT(3), 376 366 .funcval = 0, 377 367 }; ··· 391 379 static const struct sirfsoc_padmux i2s_padmux = { 392 380 .muxmask_counts = ARRAY_SIZE(i2s_muxmask), 393 381 .muxmask = i2s_muxmask, 382 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 394 383 .funcmask = BIT(3) | BIT(9), 395 384 .funcval = BIT(3), 396 385 }; ··· 408 395 static const struct sirfsoc_padmux ac97_padmux = { 409 396 .muxmask_counts = ARRAY_SIZE(ac97_muxmask), 410 397 .muxmask = ac97_muxmask, 398 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 411 399 .funcmask = BIT(8), 412 400 .funcval = 0, 413 401 }; ··· 425 411 static const struct sirfsoc_padmux spi1_padmux = { 426 412 .muxmask_counts = ARRAY_SIZE(spi1_muxmask), 427 413 .muxmask = spi1_muxmask, 414 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 428 415 .funcmask = BIT(8), 429 416 .funcval = BIT(8), 430 417 }; ··· 456 441 static const struct sirfsoc_padmux gps_padmux = { 457 442 .muxmask_counts = ARRAY_SIZE(gps_muxmask), 458 443 .muxmask = gps_muxmask, 444 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 459 445 .funcmask = BIT(12) | BIT(13) | BIT(14), 460 446 .funcval = BIT(12), 461 447 }; ··· 479 463 static const struct sirfsoc_padmux sdmmc5_padmux = { 480 464 .muxmask_counts = ARRAY_SIZE(sdmmc5_muxmask), 481 465 .muxmask = sdmmc5_muxmask, 466 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 482 467 .funcmask = BIT(13) | BIT(14), 483 468 .funcval = BIT(13) | BIT(14), 484 469 }; ··· 496 479 static const struct sirfsoc_padmux usp0_padmux = { 497 480 .muxmask_counts = ARRAY_SIZE(usp0_muxmask), 498 481 .muxmask = usp0_muxmask, 482 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 499 483 .funcmask = BIT(1) | BIT(2) | BIT(6) | BIT(9), 500 484 .funcval = 0, 501 485 }; 502 486 503 487 static const unsigned usp0_pins[] = { 51, 52, 53, 54, 55 }; 488 + 489 + static const struct sirfsoc_muxmask usp0_uart_nostreamctrl_muxmask[] = { 490 + { 491 + .group = 1, 492 + .mask = BIT(20) | BIT(21), 493 + }, 494 + }; 495 + 496 + static const struct sirfsoc_padmux usp0_uart_nostreamctrl_padmux = { 497 + .muxmask_counts = ARRAY_SIZE(usp0_uart_nostreamctrl_muxmask), 498 + .muxmask = usp0_uart_nostreamctrl_muxmask, 499 + }; 500 + 501 + static const unsigned usp0_uart_nostreamctrl_pins[] = { 52, 53 }; 504 502 505 503 static const struct sirfsoc_muxmask usp1_muxmask[] = { 506 504 { ··· 527 495 static const struct sirfsoc_padmux usp1_padmux = { 528 496 .muxmask_counts = ARRAY_SIZE(usp1_muxmask), 529 497 .muxmask = usp1_muxmask, 498 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 530 499 .funcmask = BIT(1) | BIT(9) | BIT(10) | BIT(11), 531 500 .funcval = 0, 532 501 }; 533 502 534 503 static const unsigned usp1_pins[] = { 56, 57, 58, 59, 60 }; 504 + 505 + static const struct sirfsoc_muxmask usp1_uart_nostreamctrl_muxmask[] = { 506 + { 507 + .group = 1, 508 + .mask = BIT(25) | BIT(26), 509 + }, 510 + }; 511 + 512 + static const struct sirfsoc_padmux usp1_uart_nostreamctrl_padmux = { 513 + .muxmask_counts = ARRAY_SIZE(usp1_uart_nostreamctrl_muxmask), 514 + .muxmask = usp1_uart_nostreamctrl_muxmask, 515 + }; 516 + 517 + static const unsigned usp1_uart_nostreamctrl_pins[] = { 57, 58 }; 535 518 536 519 static const struct sirfsoc_muxmask usp2_muxmask[] = { 537 520 { ··· 561 514 static const struct sirfsoc_padmux usp2_padmux = { 562 515 .muxmask_counts = ARRAY_SIZE(usp2_muxmask), 563 516 .muxmask = usp2_muxmask, 517 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 564 518 .funcmask = BIT(13) | BIT(14), 565 519 .funcval = 0, 566 520 }; 567 521 568 522 static const unsigned usp2_pins[] = { 61, 62, 63, 64, 65 }; 523 + 524 + static const struct sirfsoc_muxmask usp2_uart_nostreamctrl_muxmask[] = { 525 + { 526 + .group = 1, 527 + .mask = BIT(30) | BIT(31), 528 + }, 529 + }; 530 + 531 + static const struct sirfsoc_padmux usp2_uart_nostreamctrl_padmux = { 532 + .muxmask_counts = ARRAY_SIZE(usp2_uart_nostreamctrl_muxmask), 533 + .muxmask = usp2_uart_nostreamctrl_muxmask, 534 + }; 535 + 536 + static const unsigned usp2_uart_nostreamctrl_pins[] = { 62, 63 }; 569 537 570 538 static const struct sirfsoc_muxmask nand_muxmask[] = { 571 539 { ··· 592 530 static const struct sirfsoc_padmux nand_padmux = { 593 531 .muxmask_counts = ARRAY_SIZE(nand_muxmask), 594 532 .muxmask = nand_muxmask, 533 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 595 534 .funcmask = BIT(5), 596 535 .funcval = 0, 597 536 }; ··· 601 538 602 539 static const struct sirfsoc_padmux sdmmc0_padmux = { 603 540 .muxmask_counts = 0, 541 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 604 542 .funcmask = BIT(5), 605 543 .funcval = 0, 606 544 }; ··· 618 554 static const struct sirfsoc_padmux sdmmc2_padmux = { 619 555 .muxmask_counts = ARRAY_SIZE(sdmmc2_muxmask), 620 556 .muxmask = sdmmc2_muxmask, 557 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 621 558 .funcmask = BIT(5), 622 559 .funcval = BIT(5), 623 560 }; ··· 651 586 static const struct sirfsoc_padmux vip_padmux = { 652 587 .muxmask_counts = ARRAY_SIZE(vip_muxmask), 653 588 .muxmask = vip_muxmask, 589 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 654 590 .funcmask = BIT(0), 655 591 .funcval = 0, 656 592 }; ··· 701 635 static const struct sirfsoc_padmux viprom_padmux = { 702 636 .muxmask_counts = ARRAY_SIZE(viprom_muxmask), 703 637 .muxmask = viprom_muxmask, 638 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 704 639 .funcmask = BIT(0), 705 640 .funcval = BIT(0), 706 641 }; ··· 718 651 static const struct sirfsoc_padmux pwm0_padmux = { 719 652 .muxmask_counts = ARRAY_SIZE(pwm0_muxmask), 720 653 .muxmask = pwm0_muxmask, 654 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 721 655 .funcmask = BIT(12), 722 656 .funcval = 0, 723 657 }; ··· 790 722 static const struct sirfsoc_padmux usb0_utmi_drvbus_padmux = { 791 723 .muxmask_counts = ARRAY_SIZE(usb0_utmi_drvbus_muxmask), 792 724 .muxmask = usb0_utmi_drvbus_muxmask, 725 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 793 726 .funcmask = BIT(6), 794 727 .funcval = BIT(6), /* refer to PAD_UTMI_DRVVBUS0_ENABLE */ 795 728 }; ··· 807 738 static const struct sirfsoc_padmux usb1_utmi_drvbus_padmux = { 808 739 .muxmask_counts = ARRAY_SIZE(usb1_utmi_drvbus_muxmask), 809 740 .muxmask = usb1_utmi_drvbus_muxmask, 741 + .ctrlreg = SIRFSOC_RSC_PIN_MUX, 810 742 .funcmask = BIT(11), 811 743 .funcval = BIT(11), /* refer to PAD_UTMI_DRVVBUS1_ENABLE */ 812 744 }; 813 745 814 746 static const unsigned usb1_utmi_drvbus_pins[] = { 59 }; 747 + 748 + static const struct sirfsoc_padmux usb1_dp_dn_padmux = { 749 + .muxmask_counts = 0, 750 + .ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, 751 + .funcmask = BIT(2), 752 + .funcval = BIT(2), 753 + }; 754 + 755 + static const unsigned usb1_dp_dn_pins[] = { 115, 116 }; 756 + 757 + static const struct sirfsoc_padmux uart1_route_io_usb1_padmux = { 758 + .muxmask_counts = 0, 759 + .ctrlreg = SIRFSOC_RSC_USB_UART_SHARE, 760 + .funcmask = BIT(2), 761 + .funcval = 0, 762 + }; 763 + 764 + static const unsigned uart1_route_io_usb1_pins[] = { 115, 116 }; 815 765 816 766 static const struct sirfsoc_muxmask pulse_count_muxmask[] = { 817 767 { ··· 852 764 SIRFSOC_PIN_GROUP("lcd_24bitsgrp", lcd_24bits_pins), 853 765 SIRFSOC_PIN_GROUP("lcdrom_grp", lcdrom_pins), 854 766 SIRFSOC_PIN_GROUP("uart0grp", uart0_pins), 767 + SIRFSOC_PIN_GROUP("uart0_nostreamctrlgrp", uart0_nostreamctrl_pins), 855 768 SIRFSOC_PIN_GROUP("uart1grp", uart1_pins), 856 769 SIRFSOC_PIN_GROUP("uart2grp", uart2_pins), 857 770 SIRFSOC_PIN_GROUP("uart2_nostreamctrlgrp", uart2_nostreamctrl_pins), 858 771 SIRFSOC_PIN_GROUP("usp0grp", usp0_pins), 772 + SIRFSOC_PIN_GROUP("usp0_uart_nostreamctrl_grp", 773 + usp0_uart_nostreamctrl_pins), 859 774 SIRFSOC_PIN_GROUP("usp1grp", usp1_pins), 775 + SIRFSOC_PIN_GROUP("usp1_uart_nostreamctrl_grp", 776 + usp1_uart_nostreamctrl_pins), 860 777 SIRFSOC_PIN_GROUP("usp2grp", usp2_pins), 778 + SIRFSOC_PIN_GROUP("usp2_uart_nostreamctrl_grp", 779 + usp2_uart_nostreamctrl_pins), 861 780 SIRFSOC_PIN_GROUP("i2c0grp", i2c0_pins), 862 781 SIRFSOC_PIN_GROUP("i2c1grp", i2c1_pins), 863 782 SIRFSOC_PIN_GROUP("pwm0grp", pwm0_pins), ··· 884 789 SIRFSOC_PIN_GROUP("sdmmc5grp", sdmmc5_pins), 885 790 SIRFSOC_PIN_GROUP("usb0_utmi_drvbusgrp", usb0_utmi_drvbus_pins), 886 791 SIRFSOC_PIN_GROUP("usb1_utmi_drvbusgrp", usb1_utmi_drvbus_pins), 792 + SIRFSOC_PIN_GROUP("usb1_dp_dngrp", usb1_dp_dn_pins), 793 + SIRFSOC_PIN_GROUP("uart1_route_io_usb1grp", uart1_route_io_usb1_pins), 887 794 SIRFSOC_PIN_GROUP("pulse_countgrp", pulse_count_pins), 888 795 SIRFSOC_PIN_GROUP("i2sgrp", i2s_pins), 889 796 SIRFSOC_PIN_GROUP("ac97grp", ac97_pins), ··· 900 803 static const char * const lcd_24bitsgrp[] = { "lcd_24bitsgrp" }; 901 804 static const char * const lcdromgrp[] = { "lcdromgrp" }; 902 805 static const char * const uart0grp[] = { "uart0grp" }; 806 + static const char * const uart0_nostreamctrlgrp[] = { "uart0_nostreamctrlgrp" }; 903 807 static const char * const uart1grp[] = { "uart1grp" }; 904 808 static const char * const uart2grp[] = { "uart2grp" }; 905 809 static const char * const uart2_nostreamctrlgrp[] = { "uart2_nostreamctrlgrp" }; 906 810 static const char * const usp0grp[] = { "usp0grp" }; 811 + static const char * const usp0_uart_nostreamctrl_grp[] = 812 + { "usp0_uart_nostreamctrl_grp" }; 907 813 static const char * const usp1grp[] = { "usp1grp" }; 814 + static const char * const usp1_uart_nostreamctrl_grp[] = 815 + { "usp1_uart_nostreamctrl_grp" }; 908 816 static const char * const usp2grp[] = { "usp2grp" }; 817 + static const char * const usp2_uart_nostreamctrl_grp[] = 818 + { "usp2_uart_nostreamctrl_grp" }; 909 819 static const char * const i2c0grp[] = { "i2c0grp" }; 910 820 static const char * const i2c1grp[] = { "i2c1grp" }; 911 821 static const char * const pwm0grp[] = { "pwm0grp" }; ··· 932 828 static const char * const sdmmc5grp[] = { "sdmmc5grp" }; 933 829 static const char * const usb0_utmi_drvbusgrp[] = { "usb0_utmi_drvbusgrp" }; 934 830 static const char * const usb1_utmi_drvbusgrp[] = { "usb1_utmi_drvbusgrp" }; 831 + static const char * const usb1_dp_dngrp[] = { "usb1_dp_dngrp" }; 832 + static const char * const uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" }; 935 833 static const char * const pulse_countgrp[] = { "pulse_countgrp" }; 936 834 static const char * const i2sgrp[] = { "i2sgrp" }; 937 835 static const char * const ac97grp[] = { "ac97grp" }; ··· 948 842 SIRFSOC_PMX_FUNCTION("lcd_24bits", lcd_24bitsgrp, lcd_24bits_padmux), 949 843 SIRFSOC_PMX_FUNCTION("lcdrom", lcdromgrp, lcdrom_padmux), 950 844 SIRFSOC_PMX_FUNCTION("uart0", uart0grp, uart0_padmux), 845 + SIRFSOC_PMX_FUNCTION("uart0_nostreamctrl", uart0_nostreamctrlgrp, uart0_nostreamctrl_padmux), 951 846 SIRFSOC_PMX_FUNCTION("uart1", uart1grp, uart1_padmux), 952 847 SIRFSOC_PMX_FUNCTION("uart2", uart2grp, uart2_padmux), 953 848 SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl", uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux), 954 849 SIRFSOC_PMX_FUNCTION("usp0", usp0grp, usp0_padmux), 850 + SIRFSOC_PMX_FUNCTION("usp0_uart_nostreamctrl", 851 + usp0_uart_nostreamctrl_grp, usp0_uart_nostreamctrl_padmux), 955 852 SIRFSOC_PMX_FUNCTION("usp1", usp1grp, usp1_padmux), 853 + SIRFSOC_PMX_FUNCTION("usp1_uart_nostreamctrl", 854 + usp1_uart_nostreamctrl_grp, usp1_uart_nostreamctrl_padmux), 956 855 SIRFSOC_PMX_FUNCTION("usp2", usp2grp, usp2_padmux), 856 + SIRFSOC_PMX_FUNCTION("usp2_uart_nostreamctrl", 857 + usp2_uart_nostreamctrl_grp, usp2_uart_nostreamctrl_padmux), 957 858 SIRFSOC_PMX_FUNCTION("i2c0", i2c0grp, i2c0_padmux), 958 859 SIRFSOC_PMX_FUNCTION("i2c1", i2c1grp, i2c1_padmux), 959 860 SIRFSOC_PMX_FUNCTION("pwm0", pwm0grp, pwm0_padmux), ··· 980 867 SIRFSOC_PMX_FUNCTION("sdmmc5", sdmmc5grp, sdmmc5_padmux), 981 868 SIRFSOC_PMX_FUNCTION("usb0_utmi_drvbus", usb0_utmi_drvbusgrp, usb0_utmi_drvbus_padmux), 982 869 SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus", usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux), 870 + SIRFSOC_PMX_FUNCTION("usb1_dp_dn", usb1_dp_dngrp, usb1_dp_dn_padmux), 871 + SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1", uart1_route_io_usb1grp, uart1_route_io_usb1_padmux), 983 872 SIRFSOC_PMX_FUNCTION("pulse_count", pulse_countgrp, pulse_count_padmux), 984 873 SIRFSOC_PMX_FUNCTION("i2s", i2sgrp, i2s_padmux), 985 874 SIRFSOC_PMX_FUNCTION("ac97", ac97grp, ac97_padmux),
+4 -4
drivers/pinctrl/sirf/pinctrl-sirf.c
··· 166 166 167 167 if (mux->funcmask && enable) { 168 168 u32 func_en_val; 169 + 169 170 func_en_val = 170 - readl(spmx->rsc_virtbase + SIRFSOC_RSC_PIN_MUX); 171 + readl(spmx->rsc_virtbase + mux->ctrlreg); 171 172 func_en_val = 172 - (func_en_val & ~mux->funcmask) | (mux-> 173 - funcval); 174 - writel(func_en_val, spmx->rsc_virtbase + SIRFSOC_RSC_PIN_MUX); 173 + (func_en_val & ~mux->funcmask) | (mux->funcval); 174 + writel(func_en_val, spmx->rsc_virtbase + mux->ctrlreg); 175 175 } 176 176 } 177 177
+4 -2
drivers/pinctrl/sirf/pinctrl-sirf.h
··· 9 9 #ifndef __PINMUX_SIRF_H__ 10 10 #define __PINMUX_SIRF_H__ 11 11 12 - #define SIRFSOC_NUM_PADS 622 13 - #define SIRFSOC_RSC_PIN_MUX 0x4 12 + #define SIRFSOC_NUM_PADS 622 13 + #define SIRFSOC_RSC_USB_UART_SHARE 0 14 + #define SIRFSOC_RSC_PIN_MUX 0x4 14 15 15 16 #define SIRFSOC_GPIO_PAD_EN(g) ((g)*0x100 + 0x84) 16 17 #define SIRFSOC_GPIO_PAD_EN_CLR(g) ((g)*0x100 + 0x90) ··· 62 61 unsigned long muxmask_counts; 63 62 const struct sirfsoc_muxmask *muxmask; 64 63 /* RSC_PIN_MUX set */ 64 + unsigned long ctrlreg; 65 65 unsigned long funcmask; 66 66 unsigned long funcval; 67 67 };
+1 -1
drivers/pinctrl/spear/pinctrl-plgpio.c
··· 735 735 .owner = THIS_MODULE, 736 736 .name = "spear-plgpio", 737 737 .pm = &plgpio_dev_pm_ops, 738 - .of_match_table = of_match_ptr(plgpio_of_match), 738 + .of_match_table = plgpio_of_match, 739 739 }, 740 740 }; 741 741
+10
include/asm-generic/gpio.h
··· 228 228 int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, 229 229 unsigned int gpio_offset, unsigned int pin_offset, 230 230 unsigned int npins); 231 + int gpiochip_add_pingroup_range(struct gpio_chip *chip, 232 + struct pinctrl_dev *pctldev, 233 + unsigned int gpio_offset, const char *pin_group); 231 234 void gpiochip_remove_pin_ranges(struct gpio_chip *chip); 232 235 233 236 #else ··· 239 236 gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, 240 237 unsigned int gpio_offset, unsigned int pin_offset, 241 238 unsigned int npins) 239 + { 240 + return 0; 241 + } 242 + static inline int 243 + gpiochip_add_pingroup_range(struct gpio_chip *chip, 244 + struct pinctrl_dev *pctldev, 245 + unsigned int gpio_offset, const char *pin_group) 242 246 { 243 247 return 0; 244 248 }
+1 -1
include/dt-bindings/pinctrl/at91.h
··· 16 16 #define AT91_PINCTRL_PULL_DOWN (1 << 3) 17 17 #define AT91_PINCTRL_DIS_SCHMIT (1 << 4) 18 18 #define AT91_PINCTRL_DEBOUNCE (1 << 16) 19 - #define AT91_PINCTRL_DEBOUNCE_VA(x) (x << 17) 19 + #define AT91_PINCTRL_DEBOUNCE_VAL(x) (x << 17) 20 20 21 21 #define AT91_PINCTRL_PULL_UP_DEGLITCH (AT91_PINCTRL_PULL_UP | AT91_PINCTRL_DEGLITCH) 22 22
+10
include/linux/gpio.h
··· 80 80 #include <linux/types.h> 81 81 #include <linux/errno.h> 82 82 #include <linux/bug.h> 83 + #include <linux/pinctrl/pinctrl.h> 83 84 84 85 struct device; 85 86 struct gpio_chip; ··· 216 215 gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name, 217 216 unsigned int gpio_offset, unsigned int pin_offset, 218 217 unsigned int npins) 218 + { 219 + WARN_ON(1); 220 + return -EINVAL; 221 + } 222 + 223 + static inline int 224 + gpiochip_add_pingroup_range(struct gpio_chip *chip, 225 + struct pinctrl_dev *pctldev, 226 + unsigned int gpio_offset, const char *pin_group) 219 227 { 220 228 WARN_ON(1); 221 229 return -EINVAL;
+3
include/linux/pinctrl/pinctrl.h
··· 144 144 extern struct pinctrl_gpio_range * 145 145 pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev, 146 146 unsigned int pin); 147 + extern int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 148 + const char *pin_group, const unsigned **pins, 149 + unsigned *num_pins); 147 150 148 151 #ifdef CONFIG_OF 149 152 extern struct pinctrl_dev *of_pinctrl_get(struct device_node *np);
+40
include/linux/platform_data/pinctrl-adi2.h
··· 1 + /* 2 + * Pinctrl Driver for ADI GPIO2 controller 3 + * 4 + * Copyright 2007-2013 Analog Devices Inc. 5 + * 6 + * Licensed under the GPLv2 or later 7 + */ 8 + 9 + 10 + #ifndef PINCTRL_ADI2_H 11 + #define PINCTRL_ADI2_H 12 + 13 + #include <linux/io.h> 14 + #include <linux/platform_device.h> 15 + 16 + /** 17 + * struct adi_pinctrl_gpio_platform_data - Pinctrl gpio platform data 18 + * for ADI GPIO2 device. 19 + * 20 + * @port_gpio_base: Optional global GPIO index of the GPIO bank. 21 + * 0 means driver decides. 22 + * @port_pin_base: Pin index of the pin controller device. 23 + * @port_width: PIN number of the GPIO bank device 24 + * @pint_id: GPIO PINT device id that this GPIO bank should map to. 25 + * @pint_assign: The 32-bit GPIO PINT registers can be divided into 2 parts. A 26 + * GPIO bank can be mapped into either low 16 bits[0] or high 16 27 + * bits[1] of each PINT register. 28 + * @pint_map: GIOP bank mapping code in PINT device 29 + */ 30 + struct adi_pinctrl_gpio_platform_data { 31 + unsigned int port_gpio_base; 32 + unsigned int port_pin_base; 33 + unsigned int port_width; 34 + u8 pinctrl_id; 35 + u8 pint_id; 36 + bool pint_assign; 37 + u8 pint_map; 38 + }; 39 + 40 + #endif