Merge tag 'pinctrl-v3.18-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Oct 2014 00:56:28 +0000 (20:56 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 8 Oct 2014 00:56:28 +0000 (20:56 -0400)
Pull pin control changes from Linus Walleij:
 "This is the bulk of pin control changes for the v3.18 development
  series:

   - New drivers for the Freescale i.MX21, Qualcomm APQ8084 pin
     controllers.

   - Incremental new features on the Rockchip, atlas 6, OMAP, AM437x,
     APQ8064, prima2, AT91, Tegra, i.MX, Berlin and Nomadik.

   - Push Freescale drivers down into their own subdirectory.

   - Assorted sprays of syntax and semantic fixes"

* tag 'pinctrl-v3.18-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: (48 commits)
  pinctrl: specify bindings for pins and groups
  pinctrl: nomadik: improve GPIO debug prints
  pinctrl: abx500: refactor DT parser to take two paths
  pinctrl: abx500: use helpers for map allocation/free
  pinctrl: alter device tree bindings for functions
  pinctrl: nomadik: refactor DT parser to take two paths
  pinctrl: nomadik: use utils map free function
  pinctrl: nomadik: use util function to reserve maps
  pinctrl: qcom: use restart_notifier mechanism for ps_hold
  pinctrl: sh-pfc: sh73a0: Remove unnecessary SoC data allocation
  pinctrl: berlin: fix the dt_free_map function
  pinctrl: at91: disable PD or PU before enabling PU or PD
  pinctrl: st: remove gpiochip in failure cases
  pinctrl: at91: Fix error handling while doing gpiochio_irqchip_add
  pinctrl: at91: Fix failure path in at91_gpio_probe path
  pinctrl: lantiq: Release gpiochip resources in fail case
  pinctrl: imx: detect uninitialized pins
  pinctrl: tegra: Add MIPI pad control
  pinctrl: at91: Switch to using managed clk_get
  pinctrl: adi2: Remove duplicate gpiochip_remove_pin_ranges
  ...

94 files changed:
Documentation/devicetree/bindings/pinctrl/atmel,at91-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/nvidia,tegra124-pinmux.txt
Documentation/devicetree/bindings/pinctrl/pinctrl-bindings.txt
Documentation/devicetree/bindings/pinctrl/qcom,apq8064-pinctrl.txt
Documentation/devicetree/bindings/pinctrl/qcom,apq8084-pinctrl.txt [new file with mode: 0644]
Documentation/devicetree/bindings/pinctrl/rockchip,pinctrl.txt
Documentation/devicetree/bindings/pinctrl/ti,omap-pinctrl.txt [new file with mode: 0644]
Documentation/pinctrl.txt
arch/arm/mach-at91/include/mach/at91_pio.h
drivers/pinctrl/Kconfig
drivers/pinctrl/Makefile
drivers/pinctrl/berlin/berlin.c
drivers/pinctrl/freescale/Kconfig [new file with mode: 0644]
drivers/pinctrl/freescale/Makefile [new file with mode: 0644]
drivers/pinctrl/freescale/pinctrl-imx.c [moved from drivers/pinctrl/pinctrl-imx.c with 97% similarity]
drivers/pinctrl/freescale/pinctrl-imx.h [moved from drivers/pinctrl/pinctrl-imx.h with 96% similarity]
drivers/pinctrl/freescale/pinctrl-imx1-core.c [moved from drivers/pinctrl/pinctrl-imx1-core.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx1.c [moved from drivers/pinctrl/pinctrl-imx1.c with 100% similarity]
drivers/pinctrl/freescale/pinctrl-imx1.h [moved from drivers/pinctrl/pinctrl-imx1.h with 100% similarity]
drivers/pinctrl/freescale/pinctrl-imx21.c [new file with mode: 0644]
drivers/pinctrl/freescale/pinctrl-imx23.c [moved from drivers/pinctrl/pinctrl-imx23.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx25.c [moved from drivers/pinctrl/pinctrl-imx25.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx27.c [moved from drivers/pinctrl/pinctrl-imx27.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx28.c [moved from drivers/pinctrl/pinctrl-imx28.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx35.c [moved from drivers/pinctrl/pinctrl-imx35.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx50.c [moved from drivers/pinctrl/pinctrl-imx50.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx51.c [moved from drivers/pinctrl/pinctrl-imx51.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx53.c [moved from drivers/pinctrl/pinctrl-imx53.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx6dl.c [moved from drivers/pinctrl/pinctrl-imx6dl.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx6q.c [moved from drivers/pinctrl/pinctrl-imx6q.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx6sl.c [moved from drivers/pinctrl/pinctrl-imx6sl.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-imx6sx.c [moved from drivers/pinctrl/pinctrl-imx6sx.c with 99% similarity]
drivers/pinctrl/freescale/pinctrl-mxs.c [moved from drivers/pinctrl/pinctrl-mxs.c with 98% similarity]
drivers/pinctrl/freescale/pinctrl-mxs.h [moved from drivers/pinctrl/pinctrl-mxs.h with 100% similarity]
drivers/pinctrl/freescale/pinctrl-vf610.c [moved from drivers/pinctrl/pinctrl-vf610.c with 99% similarity]
drivers/pinctrl/mvebu/pinctrl-mvebu.c
drivers/pinctrl/nomadik/pinctrl-abx500.c
drivers/pinctrl/nomadik/pinctrl-nomadik.c
drivers/pinctrl/pinctrl-adi2.c
drivers/pinctrl/pinctrl-as3722.c
drivers/pinctrl/pinctrl-at91.c
drivers/pinctrl/pinctrl-bcm281xx.c
drivers/pinctrl/pinctrl-bcm2835.c
drivers/pinctrl/pinctrl-lantiq.c
drivers/pinctrl/pinctrl-palmas.c
drivers/pinctrl/pinctrl-rockchip.c
drivers/pinctrl/pinctrl-single.c
drivers/pinctrl/pinctrl-st.c
drivers/pinctrl/pinctrl-tb10x.c
drivers/pinctrl/pinctrl-tegra-xusb.c
drivers/pinctrl/pinctrl-tegra.c
drivers/pinctrl/pinctrl-tegra114.c
drivers/pinctrl/pinctrl-tegra124.c
drivers/pinctrl/pinctrl-tegra20.c
drivers/pinctrl/pinctrl-tegra30.c
drivers/pinctrl/pinctrl-tz1090-pdc.c
drivers/pinctrl/pinctrl-tz1090.c
drivers/pinctrl/pinctrl-u300.c
drivers/pinctrl/pinctrl-xway.c
drivers/pinctrl/pinmux.c
drivers/pinctrl/qcom/Kconfig
drivers/pinctrl/qcom/Makefile
drivers/pinctrl/qcom/pinctrl-apq8064.c
drivers/pinctrl/qcom/pinctrl-apq8084.c [new file with mode: 0644]
drivers/pinctrl/qcom/pinctrl-ipq8064.c
drivers/pinctrl/qcom/pinctrl-msm.c
drivers/pinctrl/qcom/pinctrl-msm.h
drivers/pinctrl/qcom/pinctrl-msm8960.c
drivers/pinctrl/qcom/pinctrl-msm8x74.c
drivers/pinctrl/samsung/pinctrl-exynos5440.c
drivers/pinctrl/samsung/pinctrl-samsung.c
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/sh-pfc/core.h
drivers/pinctrl/sh-pfc/pfc-r8a73a4.c
drivers/pinctrl/sh-pfc/pfc-r8a7740.c
drivers/pinctrl/sh-pfc/pfc-sh7372.c
drivers/pinctrl/sh-pfc/pfc-sh73a0.c
drivers/pinctrl/sh-pfc/pinctrl.c
drivers/pinctrl/sh-pfc/sh_pfc.h
drivers/pinctrl/sirf/pinctrl-atlas6.c
drivers/pinctrl/sirf/pinctrl-prima2.c
drivers/pinctrl/sirf/pinctrl-sirf.c
drivers/pinctrl/spear/pinctrl-spear.c
drivers/pinctrl/spear/pinctrl-spear1310.c
drivers/pinctrl/spear/pinctrl-spear1340.c
drivers/pinctrl/spear/pinctrl-spear300.c
drivers/pinctrl/spear/pinctrl-spear310.c
drivers/pinctrl/spear/pinctrl-spear320.c
drivers/pinctrl/sunxi/pinctrl-sunxi.c
drivers/pinctrl/vt8500/pinctrl-wmt.c
include/dt-bindings/pinctrl/at91.h
include/dt-bindings/pinctrl/rockchip.h
include/linux/pinctrl/pinconf-generic.h
include/linux/pinctrl/pinmux.h

index 02ab5ab..b7a93e8 100644 (file)
@@ -19,6 +19,7 @@ such as pull-up, multi drive, etc.
 
 Required properties for iomux controller:
 - compatible: "atmel,at91rm9200-pinctrl" or "atmel,at91sam9x5-pinctrl"
+               or "atmel,sama5d3-pinctrl"
 - atmel,mux-mask: array of mask (periph per bank) to describe if a pin can be
   configured in this periph mode. All the periph and bank need to be describe.
 
@@ -85,13 +86,20 @@ Required properties for pin configuration node:
   PIN_BANK 0 is pioA, PIN_BANK 1 is pioB...
 
 Bits used for CONFIG:
-PULL_UP                (1 << 0): indicate this pin need a pull up.
-MULTIDRIVE     (1 << 1): indicate this pin need to be configured as multidrive.
-DEGLITCH       (1 << 2): indicate this pin need deglitch.
-PULL_DOWN      (1 << 3): indicate this pin need a pull down.
-DIS_SCHMIT     (1 << 4): indicate this pin need to disable schmit trigger.
-DEBOUNCE       (1 << 16): indicate this pin need debounce.
-DEBOUNCE_VAL   (0x3fff << 17): debounce val.
+PULL_UP                (1 << 0): indicate this pin needs a pull up.
+MULTIDRIVE     (1 << 1): indicate this pin needs to be configured as multi-drive.
+                       Multi-drive is equivalent to open-drain type output.
+DEGLITCH       (1 << 2): indicate this pin needs deglitch.
+PULL_DOWN      (1 << 3): indicate this pin needs a pull down.
+DIS_SCHMIT     (1 << 4): indicate this pin needs to the disable schmitt trigger.
+DRIVE_STRENGTH (3 << 5): indicate the drive strength of the pin using the
+                       following values:
+                               00 - No change (reset state value kept)
+                               01 - Low
+                               10 - Medium
+                               11 - High
+DEBOUNCE       (1 << 16): indicate this pin needs debounce.
+DEBOUNCE_VAL   (0x3fff << 17): debounce value.
 
 NOTE:
 Some requirements for using atmel,at91rm9200-pinctrl binding:
index 6464bf7..189814e 100644 (file)
@@ -10,6 +10,7 @@ Required properties:
 - reg: Should contain a list of base address and size pairs for:
     -- first entry - the drive strength and pad control registers.
     -- second entry - the pinmux registers
+    -- third entry - the MIPI_PAD_CTRL register
 
 Tegra124 adds the following optional properties for pin configuration subnodes.
 The macros for options are defined in the
@@ -91,6 +92,12 @@ Valid values for pin and group names are:
     dbg, sdio3, spi, uaa, uab, uart2, uart3, sdio1, ddc, gma, gme, gmf, gmg,
     gmh, owr, uda, gpv, dev3, cec, usb_vbus_en, ao3, ao0, hv0, sdio4, ao4.
 
+  MIPI pad control groups:
+
+    These support only the nvidia,function property.
+
+    dsi_b
+
 Valid values for nvidia,functions are:
 
   blink, cec, cldvfs, clk12, cpu, dap, dap1, dap2, dev3, displaya,
@@ -101,14 +108,15 @@ Valid values for nvidia,functions are:
   sdmmc4, soc, spdif, spi1, spi2, spi3, spi4, spi5, spi6, trace, uarta,
   uartb, uartc, uartd, ulpi, usb, vgp1, vgp2, vgp3, vgp4, vgp5, vgp6,
   vi, vi_alt1, vi_alt3, vimclk2, vimclk2_alt, sata, ccla, pe0, pe, pe1,
-  dp, rtck, sys, clk tmds.
+  dp, rtck, sys, clk tmds, csi, dsi_b
 
 Example:
 
        pinmux: pinmux {
                compatible = "nvidia,tegra124-pinmux";
-               reg = <0x70000868 0x164         /* Pad control registers */
-                      0x70003000 0x434>;       /* PinMux registers */
+               reg = <0x0 0x70000868 0x0 0x164>, /* Pad control registers */
+                     <0x0 0x70003000 0x0 0x434>, /* Mux registers */
+                     <0x0 0x70000820 0x0 0x8>;   /* MIPI pad control */
        };
 
 Example pinmux entries:
index fa40a17..98eb94d 100644 (file)
@@ -127,6 +127,24 @@ whether there is any interaction between the child and intermediate parent
 nodes, is again defined entirely by the binding for the individual pin
 controller device.
 
+== Generic pin multiplexing node content ==
+
+pin multiplexing nodes:
+
+function               - the mux function to select
+groups                 - the list of groups to select with this function
+
+Example:
+
+state_0_node_a {
+       function = "uart0";
+       groups = "u0rxtx", "u0rtscts";
+};
+state_1_node_a {
+       function = "spi0";
+       groups = "spi0pins";
+};
+
 == Generic pin configuration node content ==
 
 Many data items that are represented in a pin configuration node are common
@@ -139,8 +157,12 @@ structure of the DT nodes that contain these properties.
 Supported generic properties are:
 
 pins                   - the list of pins that properties in the node
-                         apply to
-function               - the mux function to select
+                         apply to (either this or "group" has to be
+                         specified)
+group                  - the group to apply the properties to, if the driver
+                         supports configuration of whole groups rather than
+                         individual pins (either this or "pins" has to be
+                         specified)
 bias-disable           - disable any pin bias
 bias-high-impedance    - high impedance mode ("third-state", "floating")
 bias-bus-hold          - latch weakly
@@ -163,6 +185,21 @@ output-low         - set the pin to output mode with low level
 output-high            - set the pin to output mode with high level
 slew-rate              - set the slew rate
 
+For example:
+
+state_0_node_a {
+       pins = "GPIO0_AJ5", "GPIO2_AH4"; /* CTS+RXD */
+       bias-pull-up;
+};
+state_1_node_a {
+       pins = "GPIO1_AJ3", "GPIO3_AH3"; /* RTS+TXD */
+       output-high;
+};
+state_2_node_a {
+       group = "foo-group";
+       bias-pull-up;
+};
+
 Some of the generic properties take arguments. For those that do, the
 arguments are described below.
 
@@ -170,15 +207,6 @@ arguments are described below.
   binding for the hardware defines:
   - Whether the entries are integers or strings, and their meaning.
 
-- function takes a list of function names/IDs as a required argument. The
-  specific binding for the hardware defines:
-  - Whether the entries are integers or strings, and their meaning.
-  - Whether only a single entry is allowed (which is applied to all entries
-    in the pins property), or whether there may alternatively be one entry per
-    entry in the pins property, in which case the list lengths must match, and
-    for each list index i, the function at list index i is applied to the pin
-    at list index i.
-
 - bias-pull-up, -down and -pin-default take as optional argument on hardware
   supporting it the pull strength in Ohm. bias-disable will disable the pull.
 
index 92fae82..2fb90b3 100644 (file)
@@ -50,7 +50,7 @@ Valid values for function are:
   gsbi4_cam_i2c, gsbi5, gsbi5_spi_cs1, gsbi5_spi_cs2, gsbi5_spi_cs3, gsbi6,
   gsbi6_spi_cs1, gsbi6_spi_cs2, gsbi6_spi_cs3, gsbi7, gsbi7_spi_cs1,
   gsbi7_spi_cs2, gsbi7_spi_cs3, gsbi_cam_i2c, hdmi, mi2s, riva_bt, riva_fm,
-  riva_wlan, sdc2, sdc4, slimbus, spkr_i2s, tsif1, tsif2, usb2_hsic,
+  riva_wlan, sdc2, sdc4, slimbus, spkr_i2s, tsif1, tsif2, usb2_hsic, ps_hold
 
 Example:
 
diff --git a/Documentation/devicetree/bindings/pinctrl/qcom,apq8084-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/qcom,apq8084-pinctrl.txt
new file mode 100644 (file)
index 0000000..ffafa19
--- /dev/null
@@ -0,0 +1,179 @@
+Qualcomm APQ8084 TLMM block
+
+This binding describes the Top Level Mode Multiplexer block found in the
+MSM8960 platform.
+
+- compatible:
+       Usage: required
+       Value type: <string>
+       Definition: must be "qcom,apq8084-pinctrl"
+
+- reg:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: the base address and size of the TLMM register space.
+
+- interrupts:
+       Usage: required
+       Value type: <prop-encoded-array>
+       Definition: should specify the TLMM summary IRQ.
+
+- interrupt-controller:
+       Usage: required
+       Value type: <none>
+       Definition: identifies this node as an interrupt controller
+
+- #interrupt-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 2. Specifying the pin number and flags, as defined
+                   in <dt-bindings/interrupt-controller/irq.h>
+
+- gpio-controller:
+       Usage: required
+       Value type: <none>
+       Definition: identifies this node as a gpio controller
+
+- #gpio-cells:
+       Usage: required
+       Value type: <u32>
+       Definition: must be 2. Specifying the pin number and flags, as defined
+                   in <dt-bindings/gpio/gpio.h>
+
+Please refer to ../gpio/gpio.txt and ../interrupt-controller/interrupts.txt for
+a general description of GPIO and interrupt bindings.
+
+Please refer to pinctrl-bindings.txt in this directory for details of the
+common pinctrl bindings used by client devices, including the meaning of the
+phrase "pin configuration node".
+
+The pin configuration nodes act as a container for an abitrary number of
+subnodes. Each of these subnodes represents some desired configuration for a
+pin, a group, or a list of pins or groups. This configuration can include the
+mux function to select on those pin(s)/group(s), and various pin configuration
+parameters, such as pull-up, drive strength, etc.
+
+
+PIN CONFIGURATION NODES:
+
+The name of each subnode is not important; all subnodes should be enumerated
+and processed purely based on their content.
+
+Each subnode only affects those parameters that are explicitly listed. In
+other words, a subnode that lists a mux function but no pin configuration
+parameters implies no information about any pin configuration parameters.
+Similarly, a pin subnode that describes a pullup parameter implies no
+information about e.g. the mux function.
+
+
+The following generic properties as defined in pinctrl-bindings.txt are valid
+to specify in a pin configuration subnode:
+
+- pins:
+       Usage: required
+       Value type: <string-array>
+       Definition: List of gpio pins affected by the properties specified in
+                   this subnode.  Valid pins are:
+                   gpio0-gpio146,
+                   sdc1_clk,
+                   sdc1_cmd,
+                   sdc1_data
+                   sdc2_clk,
+                   sdc2_cmd,
+                   sdc2_data
+
+- function:
+       Usage: required
+       Value type: <string>
+       Definition: Specify the alternative function to be configured for the
+                   specified pins. Functions are only valid for gpio pins.
+                   Valid values are:
+                   adsp_ext, audio_ref, blsp_i2c1, blsp_i2c2, blsp_i2c3,
+                   blsp_i2c4, blsp_i2c5, blsp_i2c6, blsp_i2c7, blsp_i2c8,
+                   blsp_i2c9, blsp_i2c10, blsp_i2c11, blsp_i2c12,
+                   blsp_spi1, blsp_spi2, blsp_spi3, blsp_spi4, blsp_spi5,
+                   blsp_spi6, blsp_spi7, blsp_spi8, blsp_spi9, blsp_spi10,
+                   blsp_spi11, blsp_spi12, blsp_uart1, blsp_uart2, blsp_uart3,
+                   blsp_uart4, blsp_uart5, blsp_uart6, blsp_uart7, blsp_uart8,
+                   blsp_uart9, blsp_uart10, blsp_uart11, blsp_uart12,
+                   blsp_uim1, blsp_uim2, blsp_uim3, blsp_uim4, blsp_uim5,
+                   blsp_uim6, blsp_uim7, blsp_uim8, blsp_uim9, blsp_uim10,
+                   blsp_uim11, blsp_uim12, cam_mclk0, cam_mclk1, cam_mclk2,
+                   cam_mclk3, cci_async, cci_async_in0, cci_i2c0, cci_i2c1,
+                   cci_timer0, cci_timer1, cci_timer2, cci_timer3, cci_timer4,
+                   edp_hpd, gcc_gp1, gcc_gp2, gcc_gp3, gcc_obt, gcc_vtt,i
+                   gp_mn, gp_pdm0, gp_pdm1, gp_pdm2, gp0_clk, gp1_clk, gpio,
+                   hdmi_cec, hdmi_ddc, hdmi_dtest, hdmi_hpd, hdmi_rcv, hsic,
+                   ldo_en, ldo_update, mdp_vsync, pci_e0, pci_e0_n, pci_e0_rst,
+                   pci_e1, pci_e1_rst, pci_e1_rst_n, pci_e1_clkreq_n, pri_mi2s,
+                   qua_mi2s, sata_act, sata_devsleep, sata_devsleep_n,
+                   sd_write, sdc_emmc_mode, sdc3, sdc4, sec_mi2s, slimbus,
+                   spdif_tx, spkr_i2s, spkr_i2s_ws, spss_geni, ter_mi2s, tsif1,
+                   tsif2, uim, uim_batt_alarm
+
+- bias-disable:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as no pull.
+
+- bias-pull-down:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as pull down.
+
+- bias-pull-up:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins should be configued as pull up.
+
+- output-high:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins are configured in output mode, driven
+                   high.
+                   Not valid for sdc pins.
+
+- output-low:
+       Usage: optional
+       Value type: <none>
+       Definition: The specified pins are configured in output mode, driven
+                   low.
+                   Not valid for sdc pins.
+
+- drive-strength:
+       Usage: optional
+       Value type: <u32>
+       Definition: Selects the drive strength for the specified pins, in mA.
+                   Valid values are: 2, 4, 6, 8, 10, 12, 14 and 16
+
+Example:
+
+       tlmm: pinctrl@fd510000 {
+               compatible = "qcom,apq8084-pinctrl";
+               reg = <0xfd510000 0x4000>;
+
+               gpio-controller;
+               #gpio-cells = <2>;
+               interrupt-controller;
+               #interrupt-cells = <2>;
+               interrupts = <0 208 0>;
+
+               uart2: uart2-default {
+                       mux {
+                               pins = "gpio4", "gpio5";
+                               function = "blsp_uart2";
+                       };
+
+                       tx {
+                               pins = "gpio4";
+                               drive-strength = <4>;
+                               bias-disable;
+                       };
+
+                       rx {
+                               pins = "gpio5";
+                               drive-strength = <2>;
+                               bias-pull-up;
+                       };
+               };
+       };
index 4658b69..388b213 100644 (file)
@@ -2,8 +2,8 @@
 
 The Rockchip Pinmux Controller, enables the IC
 to share one PAD to several functional blocks. The sharing is done by
-multiplexing the PAD input/output signals. For each PAD there are up to
-muxing options with option 0 being the use as a GPIO.
+multiplexing the PAD input/output signals. For each PAD there are several
+muxing options with option 0 being the use as a GPIO.
 
 Please refer to pinctrl-bindings.txt in this directory for details of the
 common pinctrl bindings used by client devices, including the meaning of the
@@ -58,7 +58,7 @@ Deprecated properties for gpio sub nodes:
 Required properties for pin configuration node:
   - rockchip,pins: 3 integers array, represents a group of pins mux and config
     setting. The format is rockchip,pins = <PIN_BANK PIN_BANK_IDX MUX &phandle>.
-    The MUX 0 means gpio and MUX 1 to 3 mean the specific device function.
+    The MUX 0 means gpio and MUX 1 to N mean the specific device function.
     The phandle of a node containing the generic pinconfig options
     to use, as described in pinctrl-bindings.txt in this directory.
 
diff --git a/Documentation/devicetree/bindings/pinctrl/ti,omap-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/ti,omap-pinctrl.txt
new file mode 100644 (file)
index 0000000..88c8027
--- /dev/null
@@ -0,0 +1,13 @@
+OMAP Pinctrl definitions
+
+Required properties:
+- compatible : Should be one of:
+  "ti,omap2420-padconf" - OMAP2420 compatible pinctrl
+  "ti,omap2430-padconf" - OMAP2430 compatible pinctrl
+  "ti,omap3-padconf" - OMAP3 compatible pinctrl
+  "ti,omap4-padconf" - OMAP4 compatible pinctrl
+  "ti,omap5-padconf" - OMAP5 compatible pinctrl
+  "ti,dra7-padconf" - DRA7 compatible pinctrl
+  "ti,am437-padconf" - AM437x compatible pinctrl
+
+See Documentation/devicetree/bindings/pinctrl/pinctrl-single.txt for further details.
index 23f1590..b8f2147 100644 (file)
@@ -702,7 +702,7 @@ static int foo_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-int foo_enable(struct pinctrl_dev *pctldev, unsigned selector,
+int foo_set_mux(struct pinctrl_dev *pctldev, unsigned selector,
                unsigned group)
 {
        u8 regbit = (1 << selector + group);
@@ -711,21 +711,11 @@ int foo_enable(struct pinctrl_dev *pctldev, unsigned selector,
        return 0;
 }
 
-void foo_disable(struct pinctrl_dev *pctldev, unsigned selector,
-               unsigned group)
-{
-       u8 regbit = (1 << selector + group);
-
-       writeb((readb(MUX) & ~(regbit)), MUX)
-       return 0;
-}
-
 struct pinmux_ops foo_pmxops = {
        .get_functions_count = foo_get_functions_count,
        .get_function_name = foo_get_fname,
        .get_function_groups = foo_get_groups,
-       .enable = foo_enable,
-       .disable = foo_disable,
+       .set_mux = foo_set_mux,
 };
 
 /* Pinmux operations are handled by some pin controller */
index 732b11c..7b73662 100644 (file)
 #define ABCDSR_PERIPH_C        0x2
 #define ABCDSR_PERIPH_D        0x3
 
+#define SAMA5D3_PIO_DRIVER1            0x118  /*PIO Driver 1 register offset*/
+#define SAMA5D3_PIO_DRIVER2            0x11C  /*PIO Driver 2 register offset*/
+
+#define AT91SAM9X5_PIO_DRIVER1 0x114  /*PIO Driver 1 register offset*/
+#define AT91SAM9X5_PIO_DRIVER2 0x118  /*PIO Driver 2 register offset*/
+
 #endif
index bfd2c2e..64d06b5 100644 (file)
@@ -97,95 +97,6 @@ config PINCTRL_BCM281XX
          BCM28145, and BCM28155 SoCs.  This driver requires the pinctrl
          framework.  GPIO is provided by a separate GPIO driver.
 
-config PINCTRL_IMX
-       bool
-       select PINMUX
-       select PINCONF
-
-config PINCTRL_IMX1_CORE
-       bool
-       select PINMUX
-       select PINCONF
-
-config PINCTRL_IMX1
-       bool "IMX1 pinctrl driver"
-       depends on SOC_IMX1
-       select PINCTRL_IMX1_CORE
-       help
-         Say Y here to enable the imx1 pinctrl driver
-
-config PINCTRL_IMX27
-       bool "IMX27 pinctrl driver"
-       depends on SOC_IMX27
-       select PINCTRL_IMX1_CORE
-       help
-         Say Y here to enable the imx27 pinctrl driver
-
-
-config PINCTRL_IMX25
-        bool "IMX25 pinctrl driver"
-        depends on OF
-        depends on SOC_IMX25
-        select PINCTRL_IMX
-        help
-          Say Y here to enable the imx25 pinctrl driver
-
-config PINCTRL_IMX35
-       bool "IMX35 pinctrl driver"
-       depends on SOC_IMX35
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx35 pinctrl driver
-
-config PINCTRL_IMX50
-       bool "IMX50 pinctrl driver"
-       depends on SOC_IMX50
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx50 pinctrl driver
-
-config PINCTRL_IMX51
-       bool "IMX51 pinctrl driver"
-       depends on SOC_IMX51
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx51 pinctrl driver
-
-config PINCTRL_IMX53
-       bool "IMX53 pinctrl driver"
-       depends on SOC_IMX53
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx53 pinctrl driver
-
-config PINCTRL_IMX6Q
-       bool "IMX6Q/DL pinctrl driver"
-       depends on SOC_IMX6Q
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx6q/dl pinctrl driver
-
-config PINCTRL_IMX6SL
-       bool "IMX6SL pinctrl driver"
-       depends on SOC_IMX6SL
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx6sl pinctrl driver
-
-config PINCTRL_IMX6SX
-       bool "IMX6SX pinctrl driver"
-       depends on SOC_IMX6SX
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the imx6sx pinctrl driver
-
-config PINCTRL_VF610
-       bool "Freescale Vybrid VF610 pinctrl driver"
-       depends on SOC_VF610
-       select PINCTRL_IMX
-       help
-         Say Y here to enable the Freescale Vybrid VF610 pinctrl driver
-
 config PINCTRL_LANTIQ
        bool
        depends on LANTIQ
@@ -197,19 +108,6 @@ config PINCTRL_FALCON
        depends on SOC_FALCON
        depends on PINCTRL_LANTIQ
 
-config PINCTRL_MXS
-       bool
-       select PINMUX
-       select PINCONF
-
-config PINCTRL_IMX23
-       bool
-       select PINCTRL_MXS
-
-config PINCTRL_IMX28
-       bool
-       select PINCTRL_MXS
-
 config PINCTRL_ROCKCHIP
        bool
        select PINMUX
@@ -306,6 +204,7 @@ config PINCTRL_PALMAS
          TPS65913, TPS80036 etc.
 
 source "drivers/pinctrl/berlin/Kconfig"
+source "drivers/pinctrl/freescale/Kconfig"
 source "drivers/pinctrl/mvebu/Kconfig"
 source "drivers/pinctrl/nomadik/Kconfig"
 source "drivers/pinctrl/qcom/Kconfig"
index 05d2275..51f52d3 100644 (file)
@@ -17,23 +17,7 @@ obj-$(CONFIG_PINCTRL_AT91)   += pinctrl-at91.o
 obj-$(CONFIG_PINCTRL_BCM2835)  += pinctrl-bcm2835.o
 obj-$(CONFIG_PINCTRL_BAYTRAIL) += pinctrl-baytrail.o
 obj-$(CONFIG_PINCTRL_BCM281XX) += pinctrl-bcm281xx.o
-obj-$(CONFIG_PINCTRL_IMX)      += pinctrl-imx.o
-obj-$(CONFIG_PINCTRL_IMX1_CORE)        += pinctrl-imx1-core.o
-obj-$(CONFIG_PINCTRL_IMX1)     += pinctrl-imx1.o
-obj-$(CONFIG_PINCTRL_IMX27)    += pinctrl-imx27.o
-obj-$(CONFIG_PINCTRL_IMX35)    += pinctrl-imx35.o
-obj-$(CONFIG_PINCTRL_IMX50)    += pinctrl-imx50.o
-obj-$(CONFIG_PINCTRL_IMX51)    += pinctrl-imx51.o
-obj-$(CONFIG_PINCTRL_IMX53)    += pinctrl-imx53.o
-obj-$(CONFIG_PINCTRL_IMX6Q)    += pinctrl-imx6q.o
-obj-$(CONFIG_PINCTRL_IMX6Q)    += pinctrl-imx6dl.o
-obj-$(CONFIG_PINCTRL_IMX6SL)   += pinctrl-imx6sl.o
-obj-$(CONFIG_PINCTRL_IMX6SX)   += pinctrl-imx6sx.o
 obj-$(CONFIG_PINCTRL_FALCON)   += pinctrl-falcon.o
-obj-$(CONFIG_PINCTRL_MXS)      += pinctrl-mxs.o
-obj-$(CONFIG_PINCTRL_IMX23)    += pinctrl-imx23.o
-obj-$(CONFIG_PINCTRL_IMX25)    += pinctrl-imx25.o
-obj-$(CONFIG_PINCTRL_IMX28)    += pinctrl-imx28.o
 obj-$(CONFIG_PINCTRL_PALMAS)   += pinctrl-palmas.o
 obj-$(CONFIG_PINCTRL_ROCKCHIP) += pinctrl-rockchip.o
 obj-$(CONFIG_PINCTRL_SINGLE)   += pinctrl-single.o
@@ -52,15 +36,14 @@ obj-$(CONFIG_PINCTRL_XWAY)  += pinctrl-xway.o
 obj-$(CONFIG_PINCTRL_LANTIQ)   += pinctrl-lantiq.o
 obj-$(CONFIG_PINCTRL_TB10X)    += pinctrl-tb10x.o
 obj-$(CONFIG_PINCTRL_ST)       += pinctrl-st.o
-obj-$(CONFIG_PINCTRL_VF610)    += pinctrl-vf610.o
 
 obj-$(CONFIG_ARCH_BERLIN)      += berlin/
+obj-y                          += freescale/
 obj-$(CONFIG_PLAT_ORION)        += mvebu/
 obj-y                          += nomadik/
 obj-$(CONFIG_ARCH_QCOM)                += qcom/
-obj-$(CONFIG_PLAT_SAMSUNG)     += samsung/
-obj-$(CONFIG_ARCH_SHMOBILE)    += sh-pfc/
-obj-$(CONFIG_SUPERH)           += sh-pfc/
+obj-$(CONFIG_PINCTRL_SAMSUNG)  += samsung/
+obj-$(CONFIG_PINCTRL_SH_PFC)   += sh-pfc/
 obj-$(CONFIG_PLAT_SPEAR)       += spear/
 obj-$(CONFIG_ARCH_SUNXI)       += sunxi/
 obj-$(CONFIG_ARCH_VT8500)      += vt8500/
index 86db223..7f0b0f9 100644 (file)
@@ -99,30 +99,11 @@ static int berlin_pinctrl_dt_node_to_map(struct pinctrl_dev *pctrl_dev,
        return 0;
 }
 
-static void berlin_pinctrl_dt_free_map(struct pinctrl_dev *pctrl_dev,
-                                      struct pinctrl_map *map,
-                                      unsigned nmaps)
-{
-       int i;
-
-       for (i = 0; i < nmaps; i++) {
-               if (map[i].type == PIN_MAP_TYPE_MUX_GROUP) {
-                       kfree(map[i].data.mux.group);
-
-                       /* a function can be applied to multiple groups */
-                       if (i == 0)
-                               kfree(map[i].data.mux.function);
-               }
-       }
-
-       kfree(map);
-}
-
 static const struct pinctrl_ops berlin_pinctrl_ops = {
        .get_groups_count       = &berlin_pinctrl_get_group_count,
        .get_group_name         = &berlin_pinctrl_get_group_name,
        .dt_node_to_map         = &berlin_pinctrl_dt_node_to_map,
-       .dt_free_map            = &berlin_pinctrl_dt_free_map,
+       .dt_free_map            = &pinctrl_utils_dt_free_map,
 };
 
 static int berlin_pinmux_get_functions_count(struct pinctrl_dev *pctrl_dev)
@@ -170,9 +151,9 @@ berlin_pinctrl_find_function_by_name(struct berlin_pinctrl *pctrl,
        return NULL;
 }
 
-static int berlin_pinmux_enable(struct pinctrl_dev *pctrl_dev,
-                               unsigned function,
-                               unsigned group)
+static int berlin_pinmux_set(struct pinctrl_dev *pctrl_dev,
+                            unsigned function,
+                            unsigned group)
 {
        struct berlin_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctrl_dev);
        const struct berlin_desc_group *group_desc = pctrl->desc->groups + group;
@@ -197,7 +178,7 @@ static const struct pinmux_ops berlin_pinmux_ops = {
        .get_functions_count    = &berlin_pinmux_get_functions_count,
        .get_function_name      = &berlin_pinmux_get_function_name,
        .get_function_groups    = &berlin_pinmux_get_function_groups,
-       .enable                 = &berlin_pinmux_enable,
+       .set_mux                = &berlin_pinmux_set,
 };
 
 static int berlin_pinctrl_add_function(struct berlin_pinctrl *pctrl,
diff --git a/drivers/pinctrl/freescale/Kconfig b/drivers/pinctrl/freescale/Kconfig
new file mode 100644 (file)
index 0000000..16aac38
--- /dev/null
@@ -0,0 +1,108 @@
+config PINCTRL_IMX
+       bool
+       select PINMUX
+       select PINCONF
+
+config PINCTRL_IMX1_CORE
+       bool
+       select PINMUX
+       select PINCONF
+
+config PINCTRL_IMX1
+       bool "IMX1 pinctrl driver"
+       depends on SOC_IMX1
+       select PINCTRL_IMX1_CORE
+       help
+         Say Y here to enable the imx1 pinctrl driver
+
+config PINCTRL_IMX21
+       bool "i.MX21 pinctrl driver"
+       depends on SOC_IMX21
+       select PINCTRL_IMX1_CORE
+       help
+         Say Y here to enable the i.MX21 pinctrl driver
+
+config PINCTRL_IMX27
+       bool "IMX27 pinctrl driver"
+       depends on SOC_IMX27
+       select PINCTRL_IMX1_CORE
+       help
+         Say Y here to enable the imx27 pinctrl driver
+
+
+config PINCTRL_IMX25
+        bool "IMX25 pinctrl driver"
+        depends on OF
+        depends on SOC_IMX25
+        select PINCTRL_IMX
+        help
+          Say Y here to enable the imx25 pinctrl driver
+
+config PINCTRL_IMX35
+       bool "IMX35 pinctrl driver"
+       depends on SOC_IMX35
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx35 pinctrl driver
+
+config PINCTRL_IMX50
+       bool "IMX50 pinctrl driver"
+       depends on SOC_IMX50
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx50 pinctrl driver
+
+config PINCTRL_IMX51
+       bool "IMX51 pinctrl driver"
+       depends on SOC_IMX51
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx51 pinctrl driver
+
+config PINCTRL_IMX53
+       bool "IMX53 pinctrl driver"
+       depends on SOC_IMX53
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx53 pinctrl driver
+
+config PINCTRL_IMX6Q
+       bool "IMX6Q/DL pinctrl driver"
+       depends on SOC_IMX6Q
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx6q/dl pinctrl driver
+
+config PINCTRL_IMX6SL
+       bool "IMX6SL pinctrl driver"
+       depends on SOC_IMX6SL
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx6sl pinctrl driver
+
+config PINCTRL_IMX6SX
+       bool "IMX6SX pinctrl driver"
+       depends on SOC_IMX6SX
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the imx6sx pinctrl driver
+
+config PINCTRL_VF610
+       bool "Freescale Vybrid VF610 pinctrl driver"
+       depends on SOC_VF610
+       select PINCTRL_IMX
+       help
+         Say Y here to enable the Freescale Vybrid VF610 pinctrl driver
+
+config PINCTRL_MXS
+       bool
+       select PINMUX
+       select PINCONF
+
+config PINCTRL_IMX23
+       bool
+       select PINCTRL_MXS
+
+config PINCTRL_IMX28
+       bool
+       select PINCTRL_MXS
diff --git a/drivers/pinctrl/freescale/Makefile b/drivers/pinctrl/freescale/Makefile
new file mode 100644 (file)
index 0000000..bba73c2
--- /dev/null
@@ -0,0 +1,19 @@
+# Freescale pin control drivers
+obj-$(CONFIG_PINCTRL_IMX)      += pinctrl-imx.o
+obj-$(CONFIG_PINCTRL_IMX1_CORE)        += pinctrl-imx1-core.o
+obj-$(CONFIG_PINCTRL_IMX1)     += pinctrl-imx1.o
+obj-$(CONFIG_PINCTRL_IMX21)    += pinctrl-imx21.o
+obj-$(CONFIG_PINCTRL_IMX27)    += pinctrl-imx27.o
+obj-$(CONFIG_PINCTRL_IMX35)    += pinctrl-imx35.o
+obj-$(CONFIG_PINCTRL_IMX50)    += pinctrl-imx50.o
+obj-$(CONFIG_PINCTRL_IMX51)    += pinctrl-imx51.o
+obj-$(CONFIG_PINCTRL_IMX53)    += pinctrl-imx53.o
+obj-$(CONFIG_PINCTRL_IMX6Q)    += pinctrl-imx6q.o
+obj-$(CONFIG_PINCTRL_IMX6Q)    += pinctrl-imx6dl.o
+obj-$(CONFIG_PINCTRL_IMX6SL)   += pinctrl-imx6sl.o
+obj-$(CONFIG_PINCTRL_IMX6SX)   += pinctrl-imx6sx.o
+obj-$(CONFIG_PINCTRL_VF610)    += pinctrl-vf610.o
+obj-$(CONFIG_PINCTRL_MXS)      += pinctrl-mxs.o
+obj-$(CONFIG_PINCTRL_IMX23)    += pinctrl-imx23.o
+obj-$(CONFIG_PINCTRL_IMX25)    += pinctrl-imx25.o
+obj-$(CONFIG_PINCTRL_IMX28)    += pinctrl-imx28.o
similarity index 97%
rename from drivers/pinctrl/pinctrl-imx.c
rename to drivers/pinctrl/freescale/pinctrl-imx.c
index 946d594..f244676 100644 (file)
@@ -24,7 +24,7 @@
 #include <linux/pinctrl/pinmux.h>
 #include <linux/slab.h>
 
-#include "core.h"
+#include "../core.h"
 #include "pinctrl-imx.h"
 
 /* The bits in CONFIG cell defined in binding doc*/
@@ -179,8 +179,8 @@ static const struct pinctrl_ops imx_pctrl_ops = {
 
 };
 
-static int imx_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                          unsigned group)
+static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
+                      unsigned group)
 {
        struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
        const struct imx_pinctrl_soc_info *info = ipctl->info;
@@ -204,7 +204,7 @@ static int imx_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
                pin_id = pin->pin;
                pin_reg = &info->pin_regs[pin_id];
 
-               if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->mux_reg) {
+               if (pin_reg->mux_reg == -1) {
                        dev_err(ipctl->dev, "Pin(%s) does not support mux function\n",
                                info->pins[pin_id].name);
                        return -EINVAL;
@@ -298,7 +298,7 @@ static const struct pinmux_ops imx_pmx_ops = {
        .get_functions_count = imx_pmx_get_funcs_count,
        .get_function_name = imx_pmx_get_func_name,
        .get_function_groups = imx_pmx_get_groups,
-       .enable = imx_pmx_enable,
+       .set_mux = imx_pmx_set,
 };
 
 static int imx_pinconf_get(struct pinctrl_dev *pctldev,
@@ -308,7 +308,7 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev,
        const struct imx_pinctrl_soc_info *info = ipctl->info;
        const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
 
-       if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->conf_reg) {
+       if (pin_reg->conf_reg == -1) {
                dev_err(info->dev, "Pin(%s) does not support config function\n",
                        info->pins[pin_id].name);
                return -EINVAL;
@@ -331,7 +331,7 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev,
        const struct imx_pin_reg *pin_reg = &info->pin_regs[pin_id];
        int i;
 
-       if (!(info->flags & ZERO_OFFSET_VALID) && !pin_reg->conf_reg) {
+       if (pin_reg->conf_reg == -1) {
                dev_err(info->dev, "Pin(%s) does not support config function\n",
                        info->pins[pin_id].name);
                return -EINVAL;
@@ -586,10 +586,11 @@ int imx_pinctrl_probe(struct platform_device *pdev,
        if (!ipctl)
                return -ENOMEM;
 
-       info->pin_regs = devm_kzalloc(&pdev->dev, sizeof(*info->pin_regs) *
+       info->pin_regs = devm_kmalloc(&pdev->dev, sizeof(*info->pin_regs) *
                                      info->npins, GFP_KERNEL);
        if (!info->pin_regs)
                return -ENOMEM;
+       memset(info->pin_regs, 0xff, sizeof(*info->pin_regs) * info->npins);
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        ipctl->base = devm_ioremap_resource(&pdev->dev, res);
similarity index 96%
rename from drivers/pinctrl/pinctrl-imx.h
rename to drivers/pinctrl/freescale/pinctrl-imx.h
index db408b0..49e55d3 100644 (file)
@@ -67,8 +67,8 @@ struct imx_pmx_func {
  * @conf_reg: config register offset
  */
 struct imx_pin_reg {
-       u16 mux_reg;
-       u16 conf_reg;
+       s16 mux_reg;
+       s16 conf_reg;
 };
 
 struct imx_pinctrl_soc_info {
@@ -83,8 +83,7 @@ struct imx_pinctrl_soc_info {
        unsigned int flags;
 };
 
-#define ZERO_OFFSET_VALID      0x1
-#define SHARE_MUX_CONF_REG     0x2
+#define SHARE_MUX_CONF_REG     0x1
 
 #define NO_MUX         0x0
 #define NO_PAD         0x0
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx1-core.c
rename to drivers/pinctrl/freescale/pinctrl-imx1-core.c
index 4834207..5ac59fb 100644 (file)
@@ -28,7 +28,7 @@
 #include <linux/pinctrl/pinmux.h>
 #include <linux/slab.h>
 
-#include "core.h"
+#include "../core.h"
 #include "pinctrl-imx1.h"
 
 struct imx1_pinctrl {
@@ -298,8 +298,8 @@ static const struct pinctrl_ops imx1_pctrl_ops = {
 
 };
 
-static int imx1_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                          unsigned group)
+static int imx1_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
+                       unsigned group)
 {
        struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
        const struct imx1_pinctrl_soc_info *info = ipctl->info;
@@ -385,7 +385,7 @@ static const struct pinmux_ops imx1_pmx_ops = {
        .get_functions_count = imx1_pmx_get_funcs_count,
        .get_function_name = imx1_pmx_get_func_name,
        .get_function_groups = imx1_pmx_get_groups,
-       .enable = imx1_pmx_enable,
+       .set_mux = imx1_pmx_set,
 };
 
 static int imx1_pinconf_get(struct pinctrl_dev *pctldev,
diff --git a/drivers/pinctrl/freescale/pinctrl-imx21.c b/drivers/pinctrl/freescale/pinctrl-imx21.c
new file mode 100644 (file)
index 0000000..1b3b231
--- /dev/null
@@ -0,0 +1,342 @@
+/*
+ * i.MX21 pinctrl driver based on imx pinmux core
+ *
+ * Copyright (C) 2014 Alexander Shiyan <shc_work@mail.ru>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-imx1.h"
+
+#define PAD_ID(port, pin)      ((port) * 32 + (pin))
+#define PA     0
+#define PB     1
+#define PC     2
+#define PD     3
+#define PE     4
+#define PF     5
+
+enum imx21_pads {
+       MX21_PAD_LSCLK          = PAD_ID(PA, 5),
+       MX21_PAD_LD0            = PAD_ID(PA, 6),
+       MX21_PAD_LD1            = PAD_ID(PA, 7),
+       MX21_PAD_LD2            = PAD_ID(PA, 8),
+       MX21_PAD_LD3            = PAD_ID(PA, 9),
+       MX21_PAD_LD4            = PAD_ID(PA, 10),
+       MX21_PAD_LD5            = PAD_ID(PA, 11),
+       MX21_PAD_LD6            = PAD_ID(PA, 12),
+       MX21_PAD_LD7            = PAD_ID(PA, 13),
+       MX21_PAD_LD8            = PAD_ID(PA, 14),
+       MX21_PAD_LD9            = PAD_ID(PA, 15),
+       MX21_PAD_LD10           = PAD_ID(PA, 16),
+       MX21_PAD_LD11           = PAD_ID(PA, 17),
+       MX21_PAD_LD12           = PAD_ID(PA, 18),
+       MX21_PAD_LD13           = PAD_ID(PA, 19),
+       MX21_PAD_LD14           = PAD_ID(PA, 20),
+       MX21_PAD_LD15           = PAD_ID(PA, 21),
+       MX21_PAD_LD16           = PAD_ID(PA, 22),
+       MX21_PAD_LD17           = PAD_ID(PA, 23),
+       MX21_PAD_REV            = PAD_ID(PA, 24),
+       MX21_PAD_CLS            = PAD_ID(PA, 25),
+       MX21_PAD_PS             = PAD_ID(PA, 26),
+       MX21_PAD_SPL_SPR        = PAD_ID(PA, 27),
+       MX21_PAD_HSYNC          = PAD_ID(PA, 28),
+       MX21_PAD_VSYNC          = PAD_ID(PA, 29),
+       MX21_PAD_CONTRAST       = PAD_ID(PA, 30),
+       MX21_PAD_OE_ACD         = PAD_ID(PA, 31),
+       MX21_PAD_SD2_D0         = PAD_ID(PB, 4),
+       MX21_PAD_SD2_D1         = PAD_ID(PB, 5),
+       MX21_PAD_SD2_D2         = PAD_ID(PB, 6),
+       MX21_PAD_SD2_D3         = PAD_ID(PB, 7),
+       MX21_PAD_SD2_CMD        = PAD_ID(PB, 8),
+       MX21_PAD_SD2_CLK        = PAD_ID(PB, 9),
+       MX21_PAD_CSI_D0         = PAD_ID(PB, 10),
+       MX21_PAD_CSI_D1         = PAD_ID(PB, 11),
+       MX21_PAD_CSI_D2         = PAD_ID(PB, 12),
+       MX21_PAD_CSI_D3         = PAD_ID(PB, 13),
+       MX21_PAD_CSI_D4         = PAD_ID(PB, 14),
+       MX21_PAD_CSI_MCLK       = PAD_ID(PB, 15),
+       MX21_PAD_CSI_PIXCLK     = PAD_ID(PB, 16),
+       MX21_PAD_CSI_D5         = PAD_ID(PB, 17),
+       MX21_PAD_CSI_D6         = PAD_ID(PB, 18),
+       MX21_PAD_CSI_D7         = PAD_ID(PB, 19),
+       MX21_PAD_CSI_VSYNC      = PAD_ID(PB, 20),
+       MX21_PAD_CSI_HSYNC      = PAD_ID(PB, 21),
+       MX21_PAD_USB_BYP        = PAD_ID(PB, 22),
+       MX21_PAD_USB_PWR        = PAD_ID(PB, 23),
+       MX21_PAD_USB_OC         = PAD_ID(PB, 24),
+       MX21_PAD_USBH_ON        = PAD_ID(PB, 25),
+       MX21_PAD_USBH1_FS       = PAD_ID(PB, 26),
+       MX21_PAD_USBH1_OE       = PAD_ID(PB, 27),
+       MX21_PAD_USBH1_TXDM     = PAD_ID(PB, 28),
+       MX21_PAD_USBH1_TXDP     = PAD_ID(PB, 29),
+       MX21_PAD_USBH1_RXDM     = PAD_ID(PB, 30),
+       MX21_PAD_USBH1_RXDP     = PAD_ID(PB, 31),
+       MX21_PAD_USBG_SDA       = PAD_ID(PC, 5),
+       MX21_PAD_USBG_SCL       = PAD_ID(PC, 6),
+       MX21_PAD_USBG_ON        = PAD_ID(PC, 7),
+       MX21_PAD_USBG_FS        = PAD_ID(PC, 8),
+       MX21_PAD_USBG_OE        = PAD_ID(PC, 9),
+       MX21_PAD_USBG_TXDM      = PAD_ID(PC, 10),
+       MX21_PAD_USBG_TXDP      = PAD_ID(PC, 11),
+       MX21_PAD_USBG_RXDM      = PAD_ID(PC, 12),
+       MX21_PAD_USBG_RXDP      = PAD_ID(PC, 13),
+       MX21_PAD_TOUT           = PAD_ID(PC, 14),
+       MX21_PAD_TIN            = PAD_ID(PC, 15),
+       MX21_PAD_SAP_FS         = PAD_ID(PC, 16),
+       MX21_PAD_SAP_RXD        = PAD_ID(PC, 17),
+       MX21_PAD_SAP_TXD        = PAD_ID(PC, 18),
+       MX21_PAD_SAP_CLK        = PAD_ID(PC, 19),
+       MX21_PAD_SSI1_FS        = PAD_ID(PC, 20),
+       MX21_PAD_SSI1_RXD       = PAD_ID(PC, 21),
+       MX21_PAD_SSI1_TXD       = PAD_ID(PC, 22),
+       MX21_PAD_SSI1_CLK       = PAD_ID(PC, 23),
+       MX21_PAD_SSI2_FS        = PAD_ID(PC, 24),
+       MX21_PAD_SSI2_RXD       = PAD_ID(PC, 25),
+       MX21_PAD_SSI2_TXD       = PAD_ID(PC, 26),
+       MX21_PAD_SSI2_CLK       = PAD_ID(PC, 27),
+       MX21_PAD_SSI3_FS        = PAD_ID(PC, 28),
+       MX21_PAD_SSI3_RXD       = PAD_ID(PC, 29),
+       MX21_PAD_SSI3_TXD       = PAD_ID(PC, 30),
+       MX21_PAD_SSI3_CLK       = PAD_ID(PC, 31),
+       MX21_PAD_I2C_DATA       = PAD_ID(PD, 17),
+       MX21_PAD_I2C_CLK        = PAD_ID(PD, 18),
+       MX21_PAD_CSPI2_SS2      = PAD_ID(PD, 19),
+       MX21_PAD_CSPI2_SS1      = PAD_ID(PD, 20),
+       MX21_PAD_CSPI2_SS0      = PAD_ID(PD, 21),
+       MX21_PAD_CSPI2_SCLK     = PAD_ID(PD, 22),
+       MX21_PAD_CSPI2_MISO     = PAD_ID(PD, 23),
+       MX21_PAD_CSPI2_MOSI     = PAD_ID(PD, 24),
+       MX21_PAD_CSPI1_RDY      = PAD_ID(PD, 25),
+       MX21_PAD_CSPI1_SS2      = PAD_ID(PD, 26),
+       MX21_PAD_CSPI1_SS1      = PAD_ID(PD, 27),
+       MX21_PAD_CSPI1_SS0      = PAD_ID(PD, 28),
+       MX21_PAD_CSPI1_SCLK     = PAD_ID(PD, 29),
+       MX21_PAD_CSPI1_MISO     = PAD_ID(PD, 30),
+       MX21_PAD_CSPI1_MOSI     = PAD_ID(PD, 31),
+       MX21_PAD_TEST_WB2       = PAD_ID(PE, 0),
+       MX21_PAD_TEST_WB1       = PAD_ID(PE, 1),
+       MX21_PAD_TEST_WB0       = PAD_ID(PE, 2),
+       MX21_PAD_UART2_CTS      = PAD_ID(PE, 3),
+       MX21_PAD_UART2_RTS      = PAD_ID(PE, 4),
+       MX21_PAD_PWMO           = PAD_ID(PE, 5),
+       MX21_PAD_UART2_TXD      = PAD_ID(PE, 6),
+       MX21_PAD_UART2_RXD      = PAD_ID(PE, 7),
+       MX21_PAD_UART3_TXD      = PAD_ID(PE, 8),
+       MX21_PAD_UART3_RXD      = PAD_ID(PE, 9),
+       MX21_PAD_UART3_CTS      = PAD_ID(PE, 10),
+       MX21_PAD_UART3_RTS      = PAD_ID(PE, 11),
+       MX21_PAD_UART1_TXD      = PAD_ID(PE, 12),
+       MX21_PAD_UART1_RXD      = PAD_ID(PE, 13),
+       MX21_PAD_UART1_CTS      = PAD_ID(PE, 14),
+       MX21_PAD_UART1_RTS      = PAD_ID(PE, 15),
+       MX21_PAD_RTCK           = PAD_ID(PE, 16),
+       MX21_PAD_RESET_OUT      = PAD_ID(PE, 17),
+       MX21_PAD_SD1_D0         = PAD_ID(PE, 18),
+       MX21_PAD_SD1_D1         = PAD_ID(PE, 19),
+       MX21_PAD_SD1_D2         = PAD_ID(PE, 20),
+       MX21_PAD_SD1_D3         = PAD_ID(PE, 21),
+       MX21_PAD_SD1_CMD        = PAD_ID(PE, 22),
+       MX21_PAD_SD1_CLK        = PAD_ID(PE, 23),
+       MX21_PAD_NFRB           = PAD_ID(PF, 0),
+       MX21_PAD_NFCE           = PAD_ID(PF, 1),
+       MX21_PAD_NFWP           = PAD_ID(PF, 2),
+       MX21_PAD_NFCLE          = PAD_ID(PF, 3),
+       MX21_PAD_NFALE          = PAD_ID(PF, 4),
+       MX21_PAD_NFRE           = PAD_ID(PF, 5),
+       MX21_PAD_NFWE           = PAD_ID(PF, 6),
+       MX21_PAD_NFIO0          = PAD_ID(PF, 7),
+       MX21_PAD_NFIO1          = PAD_ID(PF, 8),
+       MX21_PAD_NFIO2          = PAD_ID(PF, 9),
+       MX21_PAD_NFIO3          = PAD_ID(PF, 10),
+       MX21_PAD_NFIO4          = PAD_ID(PF, 11),
+       MX21_PAD_NFIO5          = PAD_ID(PF, 12),
+       MX21_PAD_NFIO6          = PAD_ID(PF, 13),
+       MX21_PAD_NFIO7          = PAD_ID(PF, 14),
+       MX21_PAD_CLKO           = PAD_ID(PF, 15),
+       MX21_PAD_RESERVED       = PAD_ID(PF, 16),
+       MX21_PAD_CS4            = PAD_ID(PF, 21),
+       MX21_PAD_CS5            = PAD_ID(PF, 22),
+};
+
+/* Pad names for the pinmux subsystem */
+static const struct pinctrl_pin_desc imx21_pinctrl_pads[] = {
+       IMX_PINCTRL_PIN(MX21_PAD_LSCLK),
+       IMX_PINCTRL_PIN(MX21_PAD_LD0),
+       IMX_PINCTRL_PIN(MX21_PAD_LD1),
+       IMX_PINCTRL_PIN(MX21_PAD_LD2),
+       IMX_PINCTRL_PIN(MX21_PAD_LD3),
+       IMX_PINCTRL_PIN(MX21_PAD_LD4),
+       IMX_PINCTRL_PIN(MX21_PAD_LD5),
+       IMX_PINCTRL_PIN(MX21_PAD_LD6),
+       IMX_PINCTRL_PIN(MX21_PAD_LD7),
+       IMX_PINCTRL_PIN(MX21_PAD_LD8),
+       IMX_PINCTRL_PIN(MX21_PAD_LD9),
+       IMX_PINCTRL_PIN(MX21_PAD_LD10),
+       IMX_PINCTRL_PIN(MX21_PAD_LD11),
+       IMX_PINCTRL_PIN(MX21_PAD_LD12),
+       IMX_PINCTRL_PIN(MX21_PAD_LD13),
+       IMX_PINCTRL_PIN(MX21_PAD_LD14),
+       IMX_PINCTRL_PIN(MX21_PAD_LD15),
+       IMX_PINCTRL_PIN(MX21_PAD_LD16),
+       IMX_PINCTRL_PIN(MX21_PAD_LD17),
+       IMX_PINCTRL_PIN(MX21_PAD_REV),
+       IMX_PINCTRL_PIN(MX21_PAD_CLS),
+       IMX_PINCTRL_PIN(MX21_PAD_PS),
+       IMX_PINCTRL_PIN(MX21_PAD_SPL_SPR),
+       IMX_PINCTRL_PIN(MX21_PAD_HSYNC),
+       IMX_PINCTRL_PIN(MX21_PAD_VSYNC),
+       IMX_PINCTRL_PIN(MX21_PAD_CONTRAST),
+       IMX_PINCTRL_PIN(MX21_PAD_OE_ACD),
+       IMX_PINCTRL_PIN(MX21_PAD_SD2_D0),
+       IMX_PINCTRL_PIN(MX21_PAD_SD2_D1),
+       IMX_PINCTRL_PIN(MX21_PAD_SD2_D2),
+       IMX_PINCTRL_PIN(MX21_PAD_SD2_D3),
+       IMX_PINCTRL_PIN(MX21_PAD_SD2_CMD),
+       IMX_PINCTRL_PIN(MX21_PAD_SD2_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D0),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D1),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D2),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D3),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D4),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_MCLK),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_PIXCLK),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D5),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D6),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_D7),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_VSYNC),
+       IMX_PINCTRL_PIN(MX21_PAD_CSI_HSYNC),
+       IMX_PINCTRL_PIN(MX21_PAD_USB_BYP),
+       IMX_PINCTRL_PIN(MX21_PAD_USB_PWR),
+       IMX_PINCTRL_PIN(MX21_PAD_USB_OC),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH_ON),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH1_FS),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH1_OE),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH1_TXDM),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH1_TXDP),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH1_RXDM),
+       IMX_PINCTRL_PIN(MX21_PAD_USBH1_RXDP),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_SDA),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_SCL),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_ON),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_FS),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_OE),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_TXDM),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_TXDP),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_RXDM),
+       IMX_PINCTRL_PIN(MX21_PAD_USBG_RXDP),
+       IMX_PINCTRL_PIN(MX21_PAD_TOUT),
+       IMX_PINCTRL_PIN(MX21_PAD_TIN),
+       IMX_PINCTRL_PIN(MX21_PAD_SAP_FS),
+       IMX_PINCTRL_PIN(MX21_PAD_SAP_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SAP_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SAP_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI1_FS),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI1_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI1_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI1_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI2_FS),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI2_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI2_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI2_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI3_FS),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI3_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI3_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_SSI3_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_I2C_DATA),
+       IMX_PINCTRL_PIN(MX21_PAD_I2C_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI2_SS2),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI2_SS1),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI2_SS0),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI2_SCLK),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI2_MISO),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI2_MOSI),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_RDY),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_SS2),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_SS1),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_SS0),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_SCLK),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_MISO),
+       IMX_PINCTRL_PIN(MX21_PAD_CSPI1_MOSI),
+       IMX_PINCTRL_PIN(MX21_PAD_TEST_WB2),
+       IMX_PINCTRL_PIN(MX21_PAD_TEST_WB1),
+       IMX_PINCTRL_PIN(MX21_PAD_TEST_WB0),
+       IMX_PINCTRL_PIN(MX21_PAD_UART2_CTS),
+       IMX_PINCTRL_PIN(MX21_PAD_UART2_RTS),
+       IMX_PINCTRL_PIN(MX21_PAD_PWMO),
+       IMX_PINCTRL_PIN(MX21_PAD_UART2_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_UART2_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_UART3_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_UART3_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_UART3_CTS),
+       IMX_PINCTRL_PIN(MX21_PAD_UART3_RTS),
+       IMX_PINCTRL_PIN(MX21_PAD_UART1_TXD),
+       IMX_PINCTRL_PIN(MX21_PAD_UART1_RXD),
+       IMX_PINCTRL_PIN(MX21_PAD_UART1_CTS),
+       IMX_PINCTRL_PIN(MX21_PAD_UART1_RTS),
+       IMX_PINCTRL_PIN(MX21_PAD_RTCK),
+       IMX_PINCTRL_PIN(MX21_PAD_RESET_OUT),
+       IMX_PINCTRL_PIN(MX21_PAD_SD1_D0),
+       IMX_PINCTRL_PIN(MX21_PAD_SD1_D1),
+       IMX_PINCTRL_PIN(MX21_PAD_SD1_D2),
+       IMX_PINCTRL_PIN(MX21_PAD_SD1_D3),
+       IMX_PINCTRL_PIN(MX21_PAD_SD1_CMD),
+       IMX_PINCTRL_PIN(MX21_PAD_SD1_CLK),
+       IMX_PINCTRL_PIN(MX21_PAD_NFRB),
+       IMX_PINCTRL_PIN(MX21_PAD_NFCE),
+       IMX_PINCTRL_PIN(MX21_PAD_NFWP),
+       IMX_PINCTRL_PIN(MX21_PAD_NFCLE),
+       IMX_PINCTRL_PIN(MX21_PAD_NFALE),
+       IMX_PINCTRL_PIN(MX21_PAD_NFRE),
+       IMX_PINCTRL_PIN(MX21_PAD_NFWE),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO0),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO1),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO2),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO3),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO4),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO5),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO6),
+       IMX_PINCTRL_PIN(MX21_PAD_NFIO7),
+       IMX_PINCTRL_PIN(MX21_PAD_CLKO),
+       IMX_PINCTRL_PIN(MX21_PAD_RESERVED),
+       IMX_PINCTRL_PIN(MX21_PAD_CS4),
+       IMX_PINCTRL_PIN(MX21_PAD_CS5),
+};
+
+static struct imx1_pinctrl_soc_info imx21_pinctrl_info = {
+       .pins   = imx21_pinctrl_pads,
+       .npins  = ARRAY_SIZE(imx21_pinctrl_pads),
+};
+
+static int __init imx21_pinctrl_probe(struct platform_device *pdev)
+{
+       return imx1_pinctrl_core_probe(pdev, &imx21_pinctrl_info);
+}
+
+static const struct of_device_id imx21_pinctrl_of_match[] = {
+       { .compatible = "fsl,imx21-iomuxc", },
+       { }
+};
+MODULE_DEVICE_TABLE(of, imx21_pinctrl_of_match);
+
+static struct platform_driver imx21_pinctrl_driver = {
+       .driver = {
+               .name           = "imx21-pinctrl",
+               .owner          = THIS_MODULE,
+               .of_match_table = imx21_pinctrl_of_match,
+       },
+       .remove = imx1_pinctrl_core_remove,
+};
+module_platform_driver_probe(imx21_pinctrl_driver, imx21_pinctrl_probe);
+
+MODULE_AUTHOR("Alexander Shiyan <shc_work@mail.ru>");
+MODULE_DESCRIPTION("Freescale i.MX21 pinctrl driver");
+MODULE_LICENSE("GPL");
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx23.c
rename to drivers/pinctrl/freescale/pinctrl-imx23.c
index e76d75c..df79096 100644 (file)
@@ -272,7 +272,7 @@ static int imx23_pinctrl_probe(struct platform_device *pdev)
        return mxs_pinctrl_probe(pdev, &imx23_pinctrl_data);
 }
 
-static struct of_device_id imx23_pinctrl_of_match[] = {
+static const struct of_device_id imx23_pinctrl_of_match[] = {
        { .compatible = "fsl,imx23-pinctrl", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx25.c
rename to drivers/pinctrl/freescale/pinctrl-imx25.c
index 1aae1b6..550e6d7 100644 (file)
@@ -315,7 +315,7 @@ static struct imx_pinctrl_soc_info imx25_pinctrl_info = {
        .npins = ARRAY_SIZE(imx25_pinctrl_pads),
 };
 
-static struct of_device_id imx25_pinctrl_of_match[] = {
+static const struct of_device_id imx25_pinctrl_of_match[] = {
        { .compatible = "fsl,imx25-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx27.c
rename to drivers/pinctrl/freescale/pinctrl-imx27.c
index f8dfefb..945ecca 100644 (file)
@@ -389,7 +389,7 @@ static struct imx1_pinctrl_soc_info imx27_pinctrl_info = {
        .npins = ARRAY_SIZE(imx27_pinctrl_pads),
 };
 
-static struct of_device_id imx27_pinctrl_of_match[] = {
+static const struct of_device_id imx27_pinctrl_of_match[] = {
        { .compatible = "fsl,imx27-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx28.c
rename to drivers/pinctrl/freescale/pinctrl-imx28.c
index 79c9c8d..3bd45da 100644 (file)
@@ -388,7 +388,7 @@ static int imx28_pinctrl_probe(struct platform_device *pdev)
        return mxs_pinctrl_probe(pdev, &imx28_pinctrl_data);
 }
 
-static struct of_device_id imx28_pinctrl_of_match[] = {
+static const struct of_device_id imx28_pinctrl_of_match[] = {
        { .compatible = "fsl,imx28-pinctrl", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx35.c
rename to drivers/pinctrl/freescale/pinctrl-imx35.c
index 278a04a..6bfbcd0 100644 (file)
@@ -1005,7 +1005,7 @@ static struct imx_pinctrl_soc_info imx35_pinctrl_info = {
        .npins = ARRAY_SIZE(imx35_pinctrl_pads),
 };
 
-static struct of_device_id imx35_pinctrl_of_match[] = {
+static const struct of_device_id imx35_pinctrl_of_match[] = {
        { .compatible = "fsl,imx35-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx50.c
rename to drivers/pinctrl/freescale/pinctrl-imx50.c
index b06feed..e8bd604 100644 (file)
@@ -391,7 +391,7 @@ static struct imx_pinctrl_soc_info imx50_pinctrl_info = {
        .npins = ARRAY_SIZE(imx50_pinctrl_pads),
 };
 
-static struct of_device_id imx50_pinctrl_of_match[] = {
+static const struct of_device_id imx50_pinctrl_of_match[] = {
        { .compatible = "fsl,imx50-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx51.c
rename to drivers/pinctrl/freescale/pinctrl-imx51.c
index 19ab182..b818051 100644 (file)
@@ -768,7 +768,7 @@ static struct imx_pinctrl_soc_info imx51_pinctrl_info = {
        .npins = ARRAY_SIZE(imx51_pinctrl_pads),
 };
 
-static struct of_device_id imx51_pinctrl_of_match[] = {
+static const struct of_device_id imx51_pinctrl_of_match[] = {
        { .compatible = "fsl,imx51-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx53.c
rename to drivers/pinctrl/freescale/pinctrl-imx53.c
index f8d45c4..1884d53 100644 (file)
@@ -454,7 +454,7 @@ static struct imx_pinctrl_soc_info imx53_pinctrl_info = {
        .npins = ARRAY_SIZE(imx53_pinctrl_pads),
 };
 
-static struct of_device_id imx53_pinctrl_of_match[] = {
+static const struct of_device_id imx53_pinctrl_of_match[] = {
        { .compatible = "fsl,imx53-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx6dl.c
rename to drivers/pinctrl/freescale/pinctrl-imx6dl.c
index db2a148..656c4b0 100644 (file)
@@ -460,7 +460,7 @@ static struct imx_pinctrl_soc_info imx6dl_pinctrl_info = {
        .npins = ARRAY_SIZE(imx6dl_pinctrl_pads),
 };
 
-static struct of_device_id imx6dl_pinctrl_of_match[] = {
+static const struct of_device_id imx6dl_pinctrl_of_match[] = {
        { .compatible = "fsl,imx6dl-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx6q.c
rename to drivers/pinctrl/freescale/pinctrl-imx6q.c
index 8eb5ac1..59bb5b4 100644 (file)
@@ -466,7 +466,7 @@ static struct imx_pinctrl_soc_info imx6q_pinctrl_info = {
        .npins = ARRAY_SIZE(imx6q_pinctrl_pads),
 };
 
-static struct of_device_id imx6q_pinctrl_of_match[] = {
+static const struct of_device_id imx6q_pinctrl_of_match[] = {
        { .compatible = "fsl,imx6q-iomuxc", },
        { /* sentinel */ }
 };
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx6sl.c
rename to drivers/pinctrl/freescale/pinctrl-imx6sl.c
index f21b738..e0924bd 100644 (file)
@@ -366,10 +366,11 @@ static struct imx_pinctrl_soc_info imx6sl_pinctrl_info = {
        .npins = ARRAY_SIZE(imx6sl_pinctrl_pads),
 };
 
-static struct of_device_id imx6sl_pinctrl_of_match[] = {
+static const struct of_device_id imx6sl_pinctrl_of_match[] = {
        { .compatible = "fsl,imx6sl-iomuxc", },
        { /* sentinel */ }
 };
+MODULE_DEVICE_TABLE(of, imx6sl_pinctrl_of_match);
 
 static int imx6sl_pinctrl_probe(struct platform_device *pdev)
 {
similarity index 99%
rename from drivers/pinctrl/pinctrl-imx6sx.c
rename to drivers/pinctrl/freescale/pinctrl-imx6sx.c
index 09758a5..840344c 100644 (file)
@@ -370,7 +370,7 @@ static struct imx_pinctrl_soc_info imx6sx_pinctrl_info = {
        .npins = ARRAY_SIZE(imx6sx_pinctrl_pads),
 };
 
-static struct of_device_id imx6sx_pinctrl_of_match[] = {
+static const struct of_device_id imx6sx_pinctrl_of_match[] = {
        { .compatible = "fsl,imx6sx-iomuxc", },
        { /* sentinel */ }
 };
similarity index 98%
rename from drivers/pinctrl/pinctrl-mxs.c
rename to drivers/pinctrl/freescale/pinctrl-mxs.c
index 40c76f2..f98c6bb 100644 (file)
@@ -21,7 +21,7 @@
 #include <linux/pinctrl/pinmux.h>
 #include <linux/platform_device.h>
 #include <linux/slab.h>
-#include "core.h"
+#include "../core.h"
 #include "pinctrl-mxs.h"
 
 #define SUFFIX_LEN     4
@@ -195,8 +195,8 @@ static int mxs_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int mxs_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                             unsigned group)
+static int mxs_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned selector,
+                              unsigned group)
 {
        struct mxs_pinctrl_data *d = pinctrl_dev_get_drvdata(pctldev);
        struct mxs_group *g = &d->soc->groups[group];
@@ -223,7 +223,7 @@ static const struct pinmux_ops mxs_pinmux_ops = {
        .get_functions_count = mxs_pinctrl_get_funcs_count,
        .get_function_name = mxs_pinctrl_get_func_name,
        .get_function_groups = mxs_pinctrl_get_func_groups,
-       .enable = mxs_pinctrl_enable,
+       .set_mux = mxs_pinctrl_set_mux,
 };
 
 static int mxs_pinconf_get(struct pinctrl_dev *pctldev,
similarity index 99%
rename from drivers/pinctrl/pinctrl-vf610.c
rename to drivers/pinctrl/freescale/pinctrl-vf610.c
index bddd913..b788e15 100644 (file)
@@ -299,7 +299,7 @@ static const struct pinctrl_pin_desc vf610_pinctrl_pads[] = {
 static struct imx_pinctrl_soc_info vf610_pinctrl_info = {
        .pins = vf610_pinctrl_pads,
        .npins = ARRAY_SIZE(vf610_pinctrl_pads),
-       .flags = ZERO_OFFSET_VALID | SHARE_MUX_CONF_REG,
+       .flags = SHARE_MUX_CONF_REG,
 };
 
 static struct of_device_id vf610_pinctrl_of_match[] = {
index 9908374..f3b426c 100644 (file)
@@ -259,8 +259,8 @@ static int mvebu_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned fid,
        return 0;
 }
 
-static int mvebu_pinmux_enable(struct pinctrl_dev *pctldev, unsigned fid,
-                       unsigned gid)
+static int mvebu_pinmux_set(struct pinctrl_dev *pctldev, unsigned fid,
+                           unsigned gid)
 {
        struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
        struct mvebu_pinctrl_function *func = &pctl->functions[fid];
@@ -344,7 +344,7 @@ static const struct pinmux_ops mvebu_pinmux_ops = {
        .get_function_groups = mvebu_pinmux_get_groups,
        .gpio_request_enable = mvebu_pinmux_gpio_request_enable,
        .gpio_set_direction = mvebu_pinmux_gpio_set_direction,
-       .enable = mvebu_pinmux_enable,
+       .set_mux = mvebu_pinmux_set,
 };
 
 static int mvebu_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
index 8c6fd8d..47f4931 100644 (file)
@@ -34,6 +34,7 @@
 #include "pinctrl-abx500.h"
 #include "../core.h"
 #include "../pinconf.h"
+#include "../pinctrl-utils.h"
 
 /*
  * The AB9540 and AB8540 GPIO support are extended versions
@@ -708,8 +709,8 @@ static int abx500_pmx_get_func_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int abx500_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,
-                            unsigned group)
+static int abx500_pmx_set(struct pinctrl_dev *pctldev, unsigned function,
+                         unsigned group)
 {
        struct abx500_pinctrl *pct = pinctrl_dev_get_drvdata(pctldev);
        struct gpio_chip *chip = &pct->chip;
@@ -783,7 +784,7 @@ static const struct pinmux_ops abx500_pinmux_ops = {
        .get_functions_count = abx500_pmx_get_funcs_cnt,
        .get_function_name = abx500_pmx_get_func_name,
        .get_function_groups = abx500_pmx_get_func_groups,
-       .enable = abx500_pmx_enable,
+       .set_mux = abx500_pmx_set,
        .gpio_request_enable = abx500_gpio_request_enable,
        .gpio_disable_free = abx500_gpio_disable_free,
 };
@@ -826,41 +827,6 @@ static void abx500_pin_dbg_show(struct pinctrl_dev *pctldev,
                                 chip->base + offset - 1);
 }
 
-static void abx500_dt_free_map(struct pinctrl_dev *pctldev,
-               struct pinctrl_map *map, unsigned num_maps)
-{
-       int i;
-
-       for (i = 0; i < num_maps; i++)
-               if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
-                       kfree(map[i].data.configs.configs);
-       kfree(map);
-}
-
-static int abx500_dt_reserve_map(struct pinctrl_map **map,
-               unsigned *reserved_maps,
-               unsigned *num_maps,
-               unsigned reserve)
-{
-       unsigned old_num = *reserved_maps;
-       unsigned new_num = *num_maps + reserve;
-       struct pinctrl_map *new_map;
-
-       if (old_num >= new_num)
-               return 0;
-
-       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
-       if (!new_map)
-               return -ENOMEM;
-
-       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
-
-       *map = new_map;
-       *reserved_maps = new_num;
-
-       return 0;
-}
-
 static int abx500_dt_add_map_mux(struct pinctrl_map **map,
                unsigned *reserved_maps,
                unsigned *num_maps, const char *group,
@@ -926,19 +892,32 @@ static int abx500_dt_subnode_to_map(struct pinctrl_dev *pctldev,
        unsigned long *configs;
        unsigned int nconfigs = 0;
        bool has_config = 0;
-       unsigned reserve = 0;
        struct property *prop;
        const char *group, *gpio_name;
        struct device_node *np_config;
 
        ret = of_property_read_string(np, "ste,function", &function);
-       if (ret >= 0)
-               reserve = 1;
+       if (ret >= 0) {
+               ret = of_property_count_strings(np, "ste,pins");
+               if (ret < 0)
+                       goto exit;
+
+               ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps,
+                                               num_maps, ret);
+               if (ret < 0)
+                       goto exit;
+
+               of_property_for_each_string(np, "ste,pins", prop, group) {
+                       ret = abx500_dt_add_map_mux(map, reserved_maps,
+                                       num_maps, group, function);
+                       if (ret < 0)
+                               goto exit;
+               }
+       }
 
        ret = pinconf_generic_parse_dt_config(np, &configs, &nconfigs);
        if (nconfigs)
                has_config = 1;
-
        np_config = of_parse_phandle(np, "ste,config", 0);
        if (np_config) {
                ret = pinconf_generic_parse_dt_config(np_config, &configs,
@@ -947,28 +926,18 @@ static int abx500_dt_subnode_to_map(struct pinctrl_dev *pctldev,
                        goto exit;
                has_config |= nconfigs;
        }
+       if (has_config) {
+               ret = of_property_count_strings(np, "ste,pins");
+               if (ret < 0)
+                       goto exit;
 
-       ret = of_property_count_strings(np, "ste,pins");
-       if (ret < 0)
-               goto exit;
-
-       if (has_config)
-               reserve++;
-
-       reserve *= ret;
-
-       ret = abx500_dt_reserve_map(map, reserved_maps, num_maps, reserve);
-       if (ret < 0)
-               goto exit;
+               ret = pinctrl_utils_reserve_map(pctldev, map,
+                                               reserved_maps,
+                                               num_maps, ret);
+               if (ret < 0)
+                       goto exit;
 
-       of_property_for_each_string(np, "ste,pins", prop, group) {
-               if (function) {
-                       ret = abx500_dt_add_map_mux(map, reserved_maps,
-                                       num_maps, group, function);
-                       if (ret < 0)
-                               goto exit;
-               }
-               if (has_config) {
+               of_property_for_each_string(np, "ste,pins", prop, group) {
                        gpio_name = abx500_find_pin_name(pctldev, group);
 
                        ret = abx500_dt_add_map_configs(map, reserved_maps,
@@ -976,8 +945,8 @@ static int abx500_dt_subnode_to_map(struct pinctrl_dev *pctldev,
                        if (ret < 0)
                                goto exit;
                }
-
        }
+
 exit:
        return ret;
 }
@@ -998,7 +967,7 @@ static int abx500_dt_node_to_map(struct pinctrl_dev *pctldev,
                ret = abx500_dt_subnode_to_map(pctldev, np, map,
                                &reserved_maps, num_maps);
                if (ret < 0) {
-                       abx500_dt_free_map(pctldev, *map, *num_maps);
+                       pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
                        return ret;
                }
        }
@@ -1012,7 +981,7 @@ static const struct pinctrl_ops abx500_pinctrl_ops = {
        .get_group_pins = abx500_get_group_pins,
        .pin_dbg_show = abx500_pin_dbg_show,
        .dt_node_to_map = abx500_dt_node_to_map,
-       .dt_free_map = abx500_dt_free_map,
+       .dt_free_map = pinctrl_utils_dt_free_map,
 };
 
 static int abx500_pin_config_get(struct pinctrl_dev *pctldev,
index e7cab07..3c29d91 100644 (file)
@@ -32,6 +32,7 @@
 #include <linux/pinctrl/consumer.h>
 #include "pinctrl-nomadik.h"
 #include "../core.h"
+#include "../pinctrl-utils.h"
 
 /*
  * The GPIO module in the Nomadik family of Systems-on-Chip is an
@@ -985,6 +986,7 @@ static void nmk_gpio_dbg_show_one(struct seq_file *s,
                container_of(chip, struct nmk_gpio_chip, chip);
        int mode;
        bool is_out;
+       bool data_out;
        bool pull;
        u32 bit = 1 << offset;
        const char *modes[] = {
@@ -997,28 +999,41 @@ static void nmk_gpio_dbg_show_one(struct seq_file *s,
                [NMK_GPIO_ALT_C+3]      = "altC3",
                [NMK_GPIO_ALT_C+4]      = "altC4",
        };
+       const char *pulls[] = {
+               "none     ",
+               "pull down",
+               "pull up  ",
+       };
 
        clk_enable(nmk_chip->clk);
        is_out = !!(readl(nmk_chip->addr + NMK_GPIO_DIR) & bit);
        pull = !(readl(nmk_chip->addr + NMK_GPIO_PDIS) & bit);
+       data_out = !!(readl(nmk_chip->addr + NMK_GPIO_DAT) & bit);
        mode = nmk_gpio_get_mode(gpio);
        if ((mode == NMK_GPIO_ALT_C) && pctldev)
                mode = nmk_prcm_gpiocr_get_mode(pctldev, gpio);
 
-       seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s %s",
-                  gpio, label ?: "(none)",
-                  is_out ? "out" : "in ",
-                  chip->get
-                  ? (chip->get(chip, offset) ? "hi" : "lo")
-                  : "?  ",
-                  (mode < 0) ? "unknown" : modes[mode],
-                  pull ? "pull" : "none");
-
-       if (!is_out) {
+       if (is_out) {
+               seq_printf(s, " gpio-%-3d (%-20.20s) out %s        %s",
+                          gpio,
+                          label ?: "(none)",
+                          data_out ? "hi" : "lo",
+                          (mode < 0) ? "unknown" : modes[mode]);
+       } else {
                int irq = gpio_to_irq(gpio);
                struct irq_desc *desc = irq_to_desc(irq);
+               int pullidx = 0;
 
-               /* This races with request_irq(), set_irq_type(),
+               if (pull)
+                       pullidx = data_out ? 1 : 2;
+
+               seq_printf(s, " gpio-%-3d (%-20.20s) in  %s %s",
+                          gpio,
+                          label ?: "(none)",
+                          pulls[pullidx],
+                          (mode < 0) ? "unknown" : modes[mode]);
+               /*
+                * This races with request_irq(), set_irq_type(),
                 * and set_irq_wake() ... but those are "rare".
                 */
                if (irq > 0 && desc && desc->action) {
@@ -1338,39 +1353,6 @@ static void nmk_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
        nmk_gpio_dbg_show_one(s, pctldev, chip, offset - chip->base, offset);
 }
 
-static void nmk_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
-               struct pinctrl_map *map, unsigned num_maps)
-{
-       int i;
-
-       for (i = 0; i < num_maps; i++)
-               if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
-                       kfree(map[i].data.configs.configs);
-       kfree(map);
-}
-
-static int nmk_dt_reserve_map(struct pinctrl_map **map, unsigned *reserved_maps,
-               unsigned *num_maps, unsigned reserve)
-{
-       unsigned old_num = *reserved_maps;
-       unsigned new_num = *num_maps + reserve;
-       struct pinctrl_map *new_map;
-
-       if (old_num >= new_num)
-               return 0;
-
-       new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
-       if (!new_map)
-               return -ENOMEM;
-
-       memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
-
-       *map = new_map;
-       *reserved_maps = new_num;
-
-       return 0;
-}
-
 static int nmk_dt_add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps,
                unsigned *num_maps, const char *group,
                const char *function)
@@ -1537,51 +1519,55 @@ static int nmk_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev,
        const char *function = NULL;
        unsigned long configs = 0;
        bool has_config = 0;
-       unsigned reserve = 0;
        struct property *prop;
        const char *group, *gpio_name;
        struct device_node *np_config;
 
        ret = of_property_read_string(np, "ste,function", &function);
-       if (ret >= 0)
-               reserve = 1;
-
-       has_config = nmk_pinctrl_dt_get_config(np, &configs);
-
-       np_config = of_parse_phandle(np, "ste,config", 0);
-       if (np_config)
-               has_config |= nmk_pinctrl_dt_get_config(np_config, &configs);
-
-       ret = of_property_count_strings(np, "ste,pins");
-       if (ret < 0)
-               goto exit;
-
-       if (has_config)
-               reserve++;
-
-       reserve *= ret;
-
-       ret = nmk_dt_reserve_map(map, reserved_maps, num_maps, reserve);
-       if (ret < 0)
-               goto exit;
-
-       of_property_for_each_string(np, "ste,pins", prop, group) {
-               if (function) {
+       if (ret >= 0) {
+               ret = of_property_count_strings(np, "ste,pins");
+               if (ret < 0)
+                       goto exit;
+
+               ret = pinctrl_utils_reserve_map(pctldev, map,
+                                               reserved_maps,
+                                               num_maps, ret);
+               if (ret < 0)
+                       goto exit;
+
+               of_property_for_each_string(np, "ste,pins", prop, group) {
                        ret = nmk_dt_add_map_mux(map, reserved_maps, num_maps,
                                          group, function);
                        if (ret < 0)
                                goto exit;
                }
-               if (has_config) {
+       }
+
+       has_config = nmk_pinctrl_dt_get_config(np, &configs);
+       np_config = of_parse_phandle(np, "ste,config", 0);
+       if (np_config)
+               has_config |= nmk_pinctrl_dt_get_config(np_config, &configs);
+       if (has_config) {
+               ret = of_property_count_strings(np, "ste,pins");
+               if (ret < 0)
+                       goto exit;
+               ret = pinctrl_utils_reserve_map(pctldev, map,
+                                               reserved_maps,
+                                               num_maps, ret);
+               if (ret < 0)
+                       goto exit;
+
+               of_property_for_each_string(np, "ste,pins", prop, group) {
                        gpio_name = nmk_find_pin_name(pctldev, group);
 
-                       ret = nmk_dt_add_map_configs(map, reserved_maps, num_maps,
-                                             gpio_name, &configs, 1);
+                       ret = nmk_dt_add_map_configs(map, reserved_maps,
+                                                    num_maps,
+                                                    gpio_name, &configs, 1);
                        if (ret < 0)
                                goto exit;
                }
-
        }
+
 exit:
        return ret;
 }
@@ -1602,7 +1588,7 @@ static int nmk_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
                ret = nmk_pinctrl_dt_subnode_to_map(pctldev, np, map,
                                &reserved_maps, num_maps);
                if (ret < 0) {
-                       nmk_pinctrl_dt_free_map(pctldev, *map, *num_maps);
+                       pinctrl_utils_dt_free_map(pctldev, *map, *num_maps);
                        return ret;
                }
        }
@@ -1616,7 +1602,7 @@ static const struct pinctrl_ops nmk_pinctrl_ops = {
        .get_group_pins = nmk_get_group_pins,
        .pin_dbg_show = nmk_pin_dbg_show,
        .dt_node_to_map = nmk_pinctrl_dt_node_to_map,
-       .dt_free_map = nmk_pinctrl_dt_free_map,
+       .dt_free_map = pinctrl_utils_dt_free_map,
 };
 
 static int nmk_pmx_get_funcs_cnt(struct pinctrl_dev *pctldev)
@@ -1647,8 +1633,8 @@ static int nmk_pmx_get_func_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int nmk_pmx_enable(struct pinctrl_dev *pctldev, unsigned function,
-                         unsigned group)
+static int nmk_pmx_set(struct pinctrl_dev *pctldev, unsigned function,
+                      unsigned group)
 {
        struct nmk_pinctrl *npct = pinctrl_dev_get_drvdata(pctldev);
        const struct nmk_pingroup *g;
@@ -1810,7 +1796,7 @@ static const struct pinmux_ops nmk_pinmux_ops = {
        .get_functions_count = nmk_pmx_get_funcs_cnt,
        .get_function_name = nmk_pmx_get_func_name,
        .get_function_groups = nmk_pmx_get_func_groups,
-       .enable = nmk_pmx_enable,
+       .set_mux = nmk_pmx_set,
        .gpio_request_enable = nmk_gpio_request_enable,
        .gpio_disable_free = nmk_gpio_disable_free,
 };
index b092b93..8434439 100644 (file)
@@ -619,8 +619,8 @@ static struct pinctrl_ops adi_pctrl_ops = {
        .get_group_pins = adi_get_group_pins,
 };
 
-static int adi_pinmux_enable(struct pinctrl_dev *pctldev, unsigned func_id,
-       unsigned group_id)
+static int adi_pinmux_set(struct pinctrl_dev *pctldev, unsigned func_id,
+                         unsigned group_id)
 {
        struct adi_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctldev);
        struct gpio_port *port;
@@ -698,7 +698,7 @@ static int adi_pinmux_request_gpio(struct pinctrl_dev *pctldev,
 }
 
 static struct pinmux_ops adi_pinmux_ops = {
-       .enable = adi_pinmux_enable,
+       .set_mux = adi_pinmux_set,
        .get_functions_count = adi_pinmux_get_funcs_count,
        .get_function_name = adi_pinmux_get_func_name,
        .get_function_groups = adi_pinmux_get_groups,
@@ -1041,7 +1041,6 @@ static int adi_gpio_remove(struct platform_device *pdev)
        u8 offset;
 
        list_del(&port->node);
-       gpiochip_remove_pin_ranges(&port->chip);
        gpiochip_remove(&port->chip);
        if (port->pint) {
                for (offset = 0; offset < port->width; offset++)
index 0e4ec91..1f790a4 100644 (file)
@@ -230,7 +230,7 @@ static int as3722_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int as3722_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
+static int as3722_pinctrl_set(struct pinctrl_dev *pctldev, unsigned function,
                unsigned group)
 {
        struct as3722_pctrl_info *as_pci = pinctrl_dev_get_drvdata(pctldev);
@@ -327,7 +327,7 @@ static const struct pinmux_ops as3722_pinmux_ops = {
        .get_functions_count    = as3722_pinctrl_get_funcs_count,
        .get_function_name      = as3722_pinctrl_get_func_name,
        .get_function_groups    = as3722_pinctrl_get_func_groups,
-       .enable                 = as3722_pinctrl_enable,
+       .set_mux                = as3722_pinctrl_set,
        .gpio_request_enable    = as3722_pinctrl_gpio_request_enable,
        .gpio_set_direction     = as3722_pinctrl_gpio_set_direction,
 };
index 60464a2..354a81d 100644 (file)
@@ -58,10 +58,27 @@ static int gpio_banks;
 #define DEGLITCH       (1 << 2)
 #define PULL_DOWN      (1 << 3)
 #define DIS_SCHMIT     (1 << 4)
+#define DRIVE_STRENGTH_SHIFT   5
+#define DRIVE_STRENGTH_MASK            0x3
+#define DRIVE_STRENGTH   (DRIVE_STRENGTH_MASK << DRIVE_STRENGTH_SHIFT)
 #define DEBOUNCE       (1 << 16)
 #define DEBOUNCE_VAL_SHIFT     17
 #define DEBOUNCE_VAL   (0x3fff << DEBOUNCE_VAL_SHIFT)
 
+/**
+ * These defines will translated the dt binding settings to our internal
+ * settings. They are not necessarily the same value as the register setting.
+ * The actual drive strength current of low, medium and high must be looked up
+ * from the corresponding device datasheet. This value is different for pins
+ * that are even in the same banks. It is also dependent on VCC.
+ * DRIVE_STRENGTH_DEFAULT is just a placeholder to avoid changing the drive
+ * strength when there is no dt config for it.
+ */
+#define DRIVE_STRENGTH_DEFAULT         (0 << DRIVE_STRENGTH_SHIFT)
+#define DRIVE_STRENGTH_LOW          (1 << DRIVE_STRENGTH_SHIFT)
+#define DRIVE_STRENGTH_MED          (2 << DRIVE_STRENGTH_SHIFT)
+#define DRIVE_STRENGTH_HI           (3 << DRIVE_STRENGTH_SHIFT)
+
 /**
  * struct at91_pmx_func - describes AT91 pinmux functions
  * @name: the name of this specific function
@@ -148,6 +165,9 @@ struct at91_pinctrl_mux_ops {
        void (*set_pulldown)(void __iomem *pio, unsigned mask, bool is_on);
        bool (*get_schmitt_trig)(void __iomem *pio, unsigned pin);
        void (*disable_schmitt_trig)(void __iomem *pio, unsigned mask);
+       unsigned (*get_drivestrength)(void __iomem *pio, unsigned pin);
+       void (*set_drivestrength)(void __iomem *pio, unsigned pin,
+                                       u32 strength);
        /* irq */
        int (*irq_type)(struct irq_data *d, unsigned type);
 };
@@ -315,6 +335,30 @@ static unsigned pin_to_mask(unsigned int pin)
        return 1 << pin;
 }
 
+static unsigned two_bit_pin_value_shift_amount(unsigned int pin)
+{
+       /* return the shift value for a pin for "two bit" per pin registers,
+        * i.e. drive strength */
+       return 2*((pin >= MAX_NB_GPIO_PER_BANK/2)
+                       ? pin - MAX_NB_GPIO_PER_BANK/2 : pin);
+}
+
+static unsigned sama5d3_get_drive_register(unsigned int pin)
+{
+       /* drive strength is split between two registers
+        * with two bits per pin */
+       return (pin >= MAX_NB_GPIO_PER_BANK/2)
+                       ? SAMA5D3_PIO_DRIVER2 : SAMA5D3_PIO_DRIVER1;
+}
+
+static unsigned at91sam9x5_get_drive_register(unsigned int pin)
+{
+       /* drive strength is split between two registers
+        * with two bits per pin */
+       return (pin >= MAX_NB_GPIO_PER_BANK/2)
+                       ? AT91SAM9X5_PIO_DRIVER2 : AT91SAM9X5_PIO_DRIVER1;
+}
+
 static void at91_mux_disable_interrupt(void __iomem *pio, unsigned mask)
 {
        writel_relaxed(mask, pio + PIO_IDR);
@@ -327,6 +371,9 @@ static unsigned at91_mux_get_pullup(void __iomem *pio, unsigned pin)
 
 static void at91_mux_set_pullup(void __iomem *pio, unsigned mask, bool on)
 {
+       if (on)
+               writel_relaxed(mask, pio + PIO_PPDDR);
+
        writel_relaxed(mask, pio + (on ? PIO_PUER : PIO_PUDR));
 }
 
@@ -455,6 +502,9 @@ static bool at91_mux_pio3_get_pulldown(void __iomem *pio, unsigned pin)
 
 static void at91_mux_pio3_set_pulldown(void __iomem *pio, unsigned mask, bool is_on)
 {
+       if (is_on)
+               __raw_writel(mask, pio + PIO_PUDR);
+
        __raw_writel(mask, pio + (is_on ? PIO_PPDER : PIO_PPDDR));
 }
 
@@ -468,6 +518,79 @@ static bool at91_mux_pio3_get_schmitt_trig(void __iomem *pio, unsigned pin)
        return (__raw_readl(pio + PIO_SCHMITT) >> pin) & 0x1;
 }
 
+static inline u32 read_drive_strength(void __iomem *reg, unsigned pin)
+{
+       unsigned tmp = __raw_readl(reg);
+
+       tmp = tmp >> two_bit_pin_value_shift_amount(pin);
+
+       return tmp & DRIVE_STRENGTH_MASK;
+}
+
+static unsigned at91_mux_sama5d3_get_drivestrength(void __iomem *pio,
+                                                       unsigned pin)
+{
+       unsigned tmp = read_drive_strength(pio +
+                                       sama5d3_get_drive_register(pin), pin);
+
+       /* SAMA5 strength is 1:1 with our defines,
+        * except 0 is equivalent to low per datasheet */
+       if (!tmp)
+               tmp = DRIVE_STRENGTH_LOW;
+
+       return tmp;
+}
+
+static unsigned at91_mux_sam9x5_get_drivestrength(void __iomem *pio,
+                                                       unsigned pin)
+{
+       unsigned tmp = read_drive_strength(pio +
+                               at91sam9x5_get_drive_register(pin), pin);
+
+       /* strength is inverse in SAM9x5s hardware with the pinctrl defines
+        * hardware: 0 = hi, 1 = med, 2 = low, 3 = rsvd */
+       tmp = DRIVE_STRENGTH_HI - tmp;
+
+       return tmp;
+}
+
+static void set_drive_strength(void __iomem *reg, unsigned pin, u32 strength)
+{
+       unsigned tmp = __raw_readl(reg);
+       unsigned shift = two_bit_pin_value_shift_amount(pin);
+
+       tmp &= ~(DRIVE_STRENGTH_MASK  <<  shift);
+       tmp |= strength << shift;
+
+       __raw_writel(tmp, reg);
+}
+
+static void at91_mux_sama5d3_set_drivestrength(void __iomem *pio, unsigned pin,
+                                               u32 setting)
+{
+       /* do nothing if setting is zero */
+       if (!setting)
+               return;
+
+       /* strength is 1 to 1 with setting for SAMA5 */
+       set_drive_strength(pio + sama5d3_get_drive_register(pin), pin, setting);
+}
+
+static void at91_mux_sam9x5_set_drivestrength(void __iomem *pio, unsigned pin,
+                                               u32 setting)
+{
+       /* do nothing if setting is zero */
+       if (!setting)
+               return;
+
+       /* strength is inverse on SAM9x5s with our defines
+        * 0 = hi, 1 = med, 2 = low, 3 = rsvd */
+       setting = DRIVE_STRENGTH_HI - setting;
+
+       set_drive_strength(pio + at91sam9x5_get_drive_register(pin), pin,
+                               setting);
+}
+
 static struct at91_pinctrl_mux_ops at91rm9200_ops = {
        .get_periph     = at91_mux_get_periph,
        .mux_A_periph   = at91_mux_set_A_periph,
@@ -491,6 +614,27 @@ static struct at91_pinctrl_mux_ops at91sam9x5_ops = {
        .set_pulldown   = at91_mux_pio3_set_pulldown,
        .get_schmitt_trig = at91_mux_pio3_get_schmitt_trig,
        .disable_schmitt_trig = at91_mux_pio3_disable_schmitt_trig,
+       .get_drivestrength = at91_mux_sam9x5_get_drivestrength,
+       .set_drivestrength = at91_mux_sam9x5_set_drivestrength,
+       .irq_type       = alt_gpio_irq_type,
+};
+
+static struct at91_pinctrl_mux_ops sama5d3_ops = {
+       .get_periph     = at91_mux_pio3_get_periph,
+       .mux_A_periph   = at91_mux_pio3_set_A_periph,
+       .mux_B_periph   = at91_mux_pio3_set_B_periph,
+       .mux_C_periph   = at91_mux_pio3_set_C_periph,
+       .mux_D_periph   = at91_mux_pio3_set_D_periph,
+       .get_deglitch   = at91_mux_pio3_get_deglitch,
+       .set_deglitch   = at91_mux_pio3_set_deglitch,
+       .get_debounce   = at91_mux_pio3_get_debounce,
+       .set_debounce   = at91_mux_pio3_set_debounce,
+       .get_pulldown   = at91_mux_pio3_get_pulldown,
+       .set_pulldown   = at91_mux_pio3_set_pulldown,
+       .get_schmitt_trig = at91_mux_pio3_get_schmitt_trig,
+       .disable_schmitt_trig = at91_mux_pio3_disable_schmitt_trig,
+       .get_drivestrength = at91_mux_sama5d3_get_drivestrength,
+       .set_drivestrength = at91_mux_sama5d3_set_drivestrength,
        .irq_type       = alt_gpio_irq_type,
 };
 
@@ -554,8 +698,8 @@ static void at91_mux_gpio_enable(void __iomem *pio, unsigned mask, bool input)
        writel_relaxed(mask, pio + (input ? PIO_ODR : PIO_OER));
 }
 
-static int at91_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                          unsigned group)
+static int at91_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
+                       unsigned group)
 {
        struct at91_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
        const struct at91_pmx_pin *pins_conf = info->groups[group].pins_conf;
@@ -684,7 +828,7 @@ static const struct pinmux_ops at91_pmx_ops = {
        .get_functions_count    = at91_pmx_get_funcs_count,
        .get_function_name      = at91_pmx_get_func_name,
        .get_function_groups    = at91_pmx_get_groups,
-       .enable                 = at91_pmx_enable,
+       .set_mux                = at91_pmx_set,
        .gpio_request_enable    = at91_gpio_request_enable,
        .gpio_disable_free      = at91_gpio_disable_free,
 };
@@ -716,6 +860,9 @@ static int at91_pinconf_get(struct pinctrl_dev *pctldev,
                *config |= PULL_DOWN;
        if (info->ops->get_schmitt_trig && info->ops->get_schmitt_trig(pio, pin))
                *config |= DIS_SCHMIT;
+       if (info->ops->get_drivestrength)
+               *config |= (info->ops->get_drivestrength(pio, pin)
+                               << DRIVE_STRENGTH_SHIFT);
 
        return 0;
 }
@@ -729,6 +876,7 @@ static int at91_pinconf_set(struct pinctrl_dev *pctldev,
        void __iomem *pio;
        int i;
        unsigned long config;
+       unsigned pin;
 
        for (i = 0; i < num_configs; i++) {
                config = configs[i];
@@ -737,7 +885,8 @@ static int at91_pinconf_set(struct pinctrl_dev *pctldev,
                        "%s:%d, pin_id=%d, config=0x%lx",
                        __func__, __LINE__, pin_id, config);
                pio = pin_to_controller(info, pin_to_bank(pin_id));
-               mask = pin_to_mask(pin_id % MAX_NB_GPIO_PER_BANK);
+               pin = pin_id % MAX_NB_GPIO_PER_BANK;
+               mask = pin_to_mask(pin);
 
                if (config & PULL_UP && config & PULL_DOWN)
                        return -EINVAL;
@@ -753,6 +902,10 @@ static int at91_pinconf_set(struct pinctrl_dev *pctldev,
                        info->ops->set_pulldown(pio, mask, config & PULL_DOWN);
                if (info->ops->disable_schmitt_trig && config & DIS_SCHMIT)
                        info->ops->disable_schmitt_trig(pio, mask);
+               if (info->ops->set_drivestrength)
+                       info->ops->set_drivestrength(pio, pin,
+                               (config & DRIVE_STRENGTH)
+                                       >> DRIVE_STRENGTH_SHIFT);
 
        } /* for each config */
 
@@ -768,6 +921,15 @@ static int at91_pinconf_set(struct pinctrl_dev *pctldev,
        }                                       \
 } while (0)
 
+#define DBG_SHOW_FLAG_MASKED(mask,flag) do {   \
+       if ((config & mask) == flag) {          \
+               if (num_conf)                   \
+                       seq_puts(s, "|");       \
+               seq_puts(s, #flag);             \
+               num_conf++;                     \
+       }                                       \
+} while (0)
+
 static void at91_pinconf_dbg_show(struct pinctrl_dev *pctldev,
                                   struct seq_file *s, unsigned pin_id)
 {
@@ -781,6 +943,9 @@ static void at91_pinconf_dbg_show(struct pinctrl_dev *pctldev,
        DBG_SHOW_FLAG(PULL_DOWN);
        DBG_SHOW_FLAG(DIS_SCHMIT);
        DBG_SHOW_FLAG(DEGLITCH);
+       DBG_SHOW_FLAG_MASKED(DRIVE_STRENGTH, DRIVE_STRENGTH_LOW);
+       DBG_SHOW_FLAG_MASKED(DRIVE_STRENGTH, DRIVE_STRENGTH_MED);
+       DBG_SHOW_FLAG_MASKED(DRIVE_STRENGTH, DRIVE_STRENGTH_HI);
        DBG_SHOW_FLAG(DEBOUNCE);
        if (config & DEBOUNCE) {
                val = config >> DEBOUNCE_VAL_SHIFT;
@@ -945,6 +1110,7 @@ static int at91_pinctrl_parse_functions(struct device_node *np,
 }
 
 static struct of_device_id at91_pinctrl_of_match[] = {
+       { .compatible = "atmel,sama5d3-pinctrl", .data = &sama5d3_ops },
        { .compatible = "atmel,at91sam9x5-pinctrl", .data = &at91sam9x5_ops },
        { .compatible = "atmel,at91rm9200-pinctrl", .data = &at91rm9200_ops },
        { /* sentinel */ }
@@ -1445,7 +1611,7 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)
        /* now it may re-trigger */
 }
 
-static int at91_gpio_of_irq_setup(struct device_node *node,
+static int at91_gpio_of_irq_setup(struct platform_device *pdev,
                                  struct at91_gpio_chip *at91_gpio)
 {
        struct at91_gpio_chip   *prev = NULL;
@@ -1470,9 +1636,11 @@ static int at91_gpio_of_irq_setup(struct device_node *node,
                                   0,
                                   handle_edge_irq,
                                   IRQ_TYPE_EDGE_BOTH);
-       if (ret)
-               panic("at91_gpio.%d: couldn't allocate irq domain (DT).\n",
+       if (ret) {
+               dev_err(&pdev->dev, "at91_gpio.%d: Couldn't add irqchip to gpiochip.\n",
                        at91_gpio->pioc_idx);
+               return ret;
+       }
 
        /* Setup chained handler */
        if (at91_gpio->pioc_idx)
@@ -1575,19 +1743,22 @@ static int at91_gpio_probe(struct platform_device *pdev)
        at91_chip->pioc_virq = irq;
        at91_chip->pioc_idx = alias_idx;
 
-       at91_chip->clock = clk_get(&pdev->dev, NULL);
+       at91_chip->clock = devm_clk_get(&pdev->dev, NULL);
        if (IS_ERR(at91_chip->clock)) {
                dev_err(&pdev->dev, "failed to get clock, ignoring.\n");
+               ret = PTR_ERR(at91_chip->clock);
                goto err;
        }
 
-       if (clk_prepare(at91_chip->clock))
-               goto clk_prep_err;
+       ret = clk_prepare(at91_chip->clock);
+       if (ret)
+               goto clk_prepare_err;
 
        /* enable PIO controller's clock */
-       if (clk_enable(at91_chip->clock)) {
+       ret = clk_enable(at91_chip->clock);
+       if (ret) {
                dev_err(&pdev->dev, "failed to enable clock, ignoring.\n");
-               goto clk_err;
+               goto clk_enable_err;
        }
 
        at91_chip->chip = at91_gpio_template;
@@ -1612,7 +1783,7 @@ static int at91_gpio_probe(struct platform_device *pdev)
 
        if (!names) {
                ret = -ENOMEM;
-               goto clk_err;
+               goto clk_enable_err;
        }
 
        for (i = 0; i < chip->ngpio; i++)
@@ -1630,23 +1801,28 @@ static int at91_gpio_probe(struct platform_device *pdev)
 
        ret = gpiochip_add(chip);
        if (ret)
-               goto clk_err;
+               goto gpiochip_add_err;
 
        gpio_chips[alias_idx] = at91_chip;
        gpio_banks = max(gpio_banks, alias_idx + 1);
 
        at91_gpio_probe_fixup();
 
-       at91_gpio_of_irq_setup(np, at91_chip);
+       ret = at91_gpio_of_irq_setup(pdev, at91_chip);
+       if (ret)
+               goto irq_setup_err;
 
        dev_info(&pdev->dev, "at address %p\n", at91_chip->regbase);
 
        return 0;
 
-clk_err:
+irq_setup_err:
+       gpiochip_remove(chip);
+gpiochip_add_err:
+       clk_disable(at91_chip->clock);
+clk_enable_err:
        clk_unprepare(at91_chip->clock);
-clk_prep_err:
-       clk_put(at91_chip->clock);
+clk_prepare_err:
 err:
        dev_err(&pdev->dev, "Failure %i for GPIO %i\n", ret, alias_idx);
 
index c5ca9e6..a26e0c2 100644 (file)
@@ -1055,9 +1055,9 @@ static int bcm281xx_pinctrl_get_fcn_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int bcm281xx_pinmux_enable(struct pinctrl_dev *pctldev,
-                                 unsigned function,
-                                 unsigned group)
+static int bcm281xx_pinmux_set(struct pinctrl_dev *pctldev,
+                              unsigned function,
+                              unsigned group)
 {
        struct bcm281xx_pinctrl_data *pdata = pinctrl_dev_get_drvdata(pctldev);
        const struct bcm281xx_pin_function *f = &pdata->functions[function];
@@ -1084,7 +1084,7 @@ static struct pinmux_ops bcm281xx_pinctrl_pinmux_ops = {
        .get_functions_count = bcm281xx_pinctrl_get_fcns_count,
        .get_function_name = bcm281xx_pinctrl_get_fcn_name,
        .get_function_groups = bcm281xx_pinctrl_get_fcn_groups,
-       .enable = bcm281xx_pinmux_enable,
+       .set_mux = bcm281xx_pinmux_set,
 };
 
 static int bcm281xx_pinctrl_pin_config_get(struct pinctrl_dev *pctldev,
index 5bcfd7a..eabba02 100644 (file)
@@ -830,7 +830,7 @@ static int bcm2835_pmx_get_function_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int bcm2835_pmx_enable(struct pinctrl_dev *pctldev,
+static int bcm2835_pmx_set(struct pinctrl_dev *pctldev,
                unsigned func_selector,
                unsigned group_selector)
 {
@@ -869,7 +869,7 @@ static const struct pinmux_ops bcm2835_pmx_ops = {
        .get_functions_count = bcm2835_pmx_get_functions_count,
        .get_function_name = bcm2835_pmx_get_function_name,
        .get_function_groups = bcm2835_pmx_get_function_groups,
-       .enable = bcm2835_pmx_enable,
+       .set_mux = bcm2835_pmx_set,
        .gpio_disable_free = bcm2835_pmx_gpio_disable_free,
        .gpio_set_direction = bcm2835_pmx_gpio_set_direction,
 };
index d22ca25..296e5b3 100644 (file)
@@ -257,9 +257,9 @@ static int match_group_mux(const struct ltq_pin_group *grp,
        return ret;
 }
 
-static int ltq_pmx_enable(struct pinctrl_dev *pctrldev,
-                               unsigned func,
-                               unsigned group)
+static int ltq_pmx_set(struct pinctrl_dev *pctrldev,
+                      unsigned func,
+                      unsigned group)
 {
        struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev);
        const struct ltq_pin_group *pin_grp = &info->grps[group];
@@ -316,7 +316,7 @@ static const struct pinmux_ops ltq_pmx_ops = {
        .get_functions_count    = ltq_pmx_func_count,
        .get_function_name      = ltq_pmx_func_name,
        .get_function_groups    = ltq_pmx_get_groups,
-       .enable                 = ltq_pmx_enable,
+       .set_mux                = ltq_pmx_set,
        .gpio_request_enable    = ltq_pmx_gpio_request_enable,
 };
 
index f13d0e7..e3079d3 100644 (file)
@@ -685,7 +685,8 @@ static int palmas_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int palmas_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
+static int palmas_pinctrl_set_mux(struct pinctrl_dev *pctldev,
+               unsigned function,
                unsigned group)
 {
        struct palmas_pctrl_chip_info *pci = pinctrl_dev_get_drvdata(pctldev);
@@ -742,7 +743,7 @@ static const struct pinmux_ops palmas_pinmux_ops = {
        .get_functions_count = palmas_pinctrl_get_funcs_count,
        .get_function_name = palmas_pinctrl_get_func_name,
        .get_function_groups = palmas_pinctrl_get_func_groups,
-       .enable = palmas_pinctrl_enable,
+       .set_mux = palmas_pinctrl_set_mux,
 };
 
 static int palmas_pinconf_get(struct pinctrl_dev *pctldev,
index 0c372a3..016f457 100644 (file)
@@ -816,8 +816,8 @@ static int rockchip_pmx_get_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int rockchip_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                                                           unsigned group)
+static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
+                           unsigned group)
 {
        struct rockchip_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
        const unsigned int *pins = info->groups[group].pins;
@@ -892,7 +892,7 @@ static const struct pinmux_ops rockchip_pmx_ops = {
        .get_functions_count    = rockchip_pmx_get_funcs_count,
        .get_function_name      = rockchip_pmx_get_func_name,
        .get_function_groups    = rockchip_pmx_get_groups,
-       .enable                 = rockchip_pmx_enable,
+       .set_mux                = rockchip_pmx_set,
        .gpio_set_direction     = rockchip_pmx_gpio_set_direction,
 };
 
index 95dd9cf..fb94b77 100644 (file)
@@ -447,7 +447,7 @@ static int pcs_get_function(struct pinctrl_dev *pctldev, unsigned pin,
        return 0;
 }
 
-static int pcs_enable(struct pinctrl_dev *pctldev, unsigned fselector,
+static int pcs_set_mux(struct pinctrl_dev *pctldev, unsigned fselector,
        unsigned group)
 {
        struct pcs_device *pcs;
@@ -519,7 +519,7 @@ static const struct pinmux_ops pcs_pinmux_ops = {
        .get_functions_count = pcs_get_functions_count,
        .get_function_name = pcs_get_function_name,
        .get_function_groups = pcs_get_function_groups,
-       .enable = pcs_enable,
+       .set_mux = pcs_set_mux,
        .gpio_request_enable = pcs_request_gpio,
 };
 
@@ -1981,6 +1981,18 @@ static const struct pcs_soc_data pinctrl_single_omap_wkup = {
        .irq_status_mask = (1 << 15),   /* OMAP_WAKEUP_EVENT */
 };
 
+static const struct pcs_soc_data pinctrl_single_dra7 = {
+       .flags = PCS_QUIRK_SHARED_IRQ,
+       .irq_enable_mask = (1 << 24),   /* WAKEUPENABLE */
+       .irq_status_mask = (1 << 25),   /* WAKEUPEVENT */
+};
+
+static const struct pcs_soc_data pinctrl_single_am437x = {
+       .flags = PCS_QUIRK_SHARED_IRQ,
+       .irq_enable_mask = (1 << 29),   /* OMAP_WAKEUP_EN */
+       .irq_status_mask = (1 << 30),   /* OMAP_WAKEUP_EVENT */
+};
+
 static const struct pcs_soc_data pinctrl_single = {
 };
 
@@ -1992,6 +2004,8 @@ static struct of_device_id pcs_of_match[] = {
        { .compatible = "ti,omap3-padconf", .data = &pinctrl_single_omap_wkup },
        { .compatible = "ti,omap4-padconf", .data = &pinctrl_single_omap_wkup },
        { .compatible = "ti,omap5-padconf", .data = &pinctrl_single_omap_wkup },
+       { .compatible = "ti,dra7-padconf", .data = &pinctrl_single_dra7 },
+       { .compatible = "ti,am437-padconf", .data = &pinctrl_single_am437x },
        { .compatible = "pinctrl-single", .data = &pinctrl_single },
        { .compatible = "pinconf-single", .data = &pinconf_single },
        { },
index 5475374..4b1792a 100644 (file)
@@ -914,8 +914,8 @@ static struct st_pio_control *st_get_pio_control(
        return &bank->pc;
 }
 
-static int st_pmx_enable(struct pinctrl_dev *pctldev, unsigned fselector,
-               unsigned group)
+static int st_pmx_set_mux(struct pinctrl_dev *pctldev, unsigned fselector,
+                       unsigned group)
 {
        struct st_pinctrl *info = pinctrl_dev_get_drvdata(pctldev);
        struct st_pinconf *conf = info->groups[group].pin_conf;
@@ -951,7 +951,7 @@ static struct pinmux_ops st_pmxops = {
        .get_functions_count    = st_pmx_get_funcs_count,
        .get_function_name      = st_pmx_get_fname,
        .get_function_groups    = st_pmx_get_groups,
-       .enable                 = st_pmx_enable,
+       .set_mux                = st_pmx_set_mux,
        .gpio_set_direction     = st_pmx_set_gpio_direction,
 };
 
@@ -1517,6 +1517,7 @@ static int st_gpiolib_register_bank(struct st_pinctrl *info,
                                           0, handle_simple_irq,
                                           IRQ_TYPE_LEVEL_LOW);
                if (err) {
+                       gpiochip_remove(&bank->gpio_chip);
                        dev_info(dev, "could not add irqchip\n");
                        return err;
                }
index 71c5d4f..3b9bfcf 100644 (file)
@@ -697,7 +697,7 @@ static void tb10x_gpio_disable_free(struct pinctrl_dev *pctl,
        mutex_unlock(&state->mutex);
 }
 
-static int tb10x_pctl_enable(struct pinctrl_dev *pctl,
+static int tb10x_pctl_set_mux(struct pinctrl_dev *pctl,
                        unsigned func_selector, unsigned group_selector)
 {
        struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
@@ -744,7 +744,7 @@ static struct pinmux_ops tb10x_pinmux_ops = {
        .get_function_groups = tb10x_get_function_groups,
        .gpio_request_enable = tb10x_gpio_request_enable,
        .gpio_disable_free = tb10x_gpio_disable_free,
-       .enable = tb10x_pctl_enable,
+       .set_mux = tb10x_pctl_set_mux,
 };
 
 static struct pinctrl_desc tb10x_pindesc = {
index e641b42..1631ec9 100644 (file)
@@ -281,9 +281,9 @@ static int tegra_xusb_padctl_get_function_groups(struct pinctrl_dev *pinctrl,
        return 0;
 }
 
-static int tegra_xusb_padctl_pinmux_enable(struct pinctrl_dev *pinctrl,
-                                          unsigned int function,
-                                          unsigned int group)
+static int tegra_xusb_padctl_pinmux_set(struct pinctrl_dev *pinctrl,
+                                       unsigned int function,
+                                       unsigned int group)
 {
        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
        const struct tegra_xusb_padctl_lane *lane;
@@ -311,7 +311,7 @@ static const struct pinmux_ops tegra_xusb_padctl_pinmux_ops = {
        .get_functions_count = tegra_xusb_padctl_get_functions_count,
        .get_function_name = tegra_xusb_padctl_get_function_name,
        .get_function_groups = tegra_xusb_padctl_get_function_groups,
-       .enable = tegra_xusb_padctl_pinmux_enable,
+       .set_mux = tegra_xusb_padctl_pinmux_set,
 };
 
 static int tegra_xusb_padctl_pinconf_group_get(struct pinctrl_dev *pinctrl,
index 150af55..e5949d5 100644 (file)
@@ -262,8 +262,9 @@ static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int tegra_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
-                              unsigned group)
+static int tegra_pinctrl_set_mux(struct pinctrl_dev *pctldev,
+                                unsigned function,
+                                unsigned group)
 {
        struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
        const struct tegra_pingroup *g;
@@ -294,7 +295,7 @@ static const struct pinmux_ops tegra_pinmux_ops = {
        .get_functions_count = tegra_pinctrl_get_funcs_count,
        .get_function_name = tegra_pinctrl_get_func_name,
        .get_function_groups = tegra_pinctrl_get_func_groups,
-       .enable = tegra_pinctrl_enable,
+       .set_mux = tegra_pinctrl_set_mux,
 };
 
 static int tegra_pinconf_reg(struct tegra_pmx *pmx,
index 33614ba..a3db85b 100644 (file)
@@ -1850,7 +1850,7 @@ static int tegra114_pinctrl_probe(struct platform_device *pdev)
        return tegra_pinctrl_probe(pdev, &tegra114_pinctrl);
 }
 
-static struct of_device_id tegra114_pinctrl_of_match[] = {
+static const struct of_device_id tegra114_pinctrl_of_match[] = {
        { .compatible = "nvidia,tegra114-pinmux", },
        { },
 };
index e80797e..2f9b75c 100644 (file)
 #define TEGRA_PIN_OWR                          _PIN(5)
 #define TEGRA_PIN_CLK_32K_IN                   _PIN(6)
 #define TEGRA_PIN_JTAG_RTCK                    _PIN(7)
+#define TEGRA_PIN_DSI_B_CLK_P                  _PIN(8)
+#define TEGRA_PIN_DSI_B_CLK_N                  _PIN(9)
+#define TEGRA_PIN_DSI_B_D0_P                   _PIN(10)
+#define TEGRA_PIN_DSI_B_D0_N                   _PIN(11)
+#define TEGRA_PIN_DSI_B_D1_P                   _PIN(12)
+#define TEGRA_PIN_DSI_B_D1_N                   _PIN(13)
+#define TEGRA_PIN_DSI_B_D2_P                   _PIN(14)
+#define TEGRA_PIN_DSI_B_D2_N                   _PIN(15)
+#define TEGRA_PIN_DSI_B_D3_P                   _PIN(16)
+#define TEGRA_PIN_DSI_B_D3_N                   _PIN(17)
 
 static const struct pinctrl_pin_desc tegra124_pins[] = {
        PINCTRL_PIN(TEGRA_PIN_CLK_32K_OUT_PA0, "CLK_32K_OUT PA0"),
@@ -417,6 +427,16 @@ static const struct pinctrl_pin_desc tegra124_pins[] = {
        PINCTRL_PIN(TEGRA_PIN_OWR, "OWR"),
        PINCTRL_PIN(TEGRA_PIN_CLK_32K_IN, "CLK_32K_IN"),
        PINCTRL_PIN(TEGRA_PIN_JTAG_RTCK, "JTAG_RTCK"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_CLK_P, "DSI_B_CLK_P"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_CLK_N, "DSI_B_CLK_N"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D0_P, "DSI_B_D0_P"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D0_N, "DSI_B_D0_N"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D1_P, "DSI_B_D1_P"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D1_N, "DSI_B_D1_N"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D2_P, "DSI_B_D2_P"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D2_N, "DSI_B_D2_N"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D3_P, "DSI_B_D3_P"),
+       PINCTRL_PIN(TEGRA_PIN_DSI_B_D3_N, "DSI_B_D3_N"),
 };
 
 static const unsigned clk_32k_out_pa0_pins[] = {
@@ -1495,6 +1515,19 @@ static const unsigned drive_ao4_pins[] = {
        TEGRA_PIN_JTAG_RTCK,
 };
 
+static const unsigned mipi_pad_ctrl_dsi_b_pins[] = {
+       TEGRA_PIN_DSI_B_CLK_P,
+       TEGRA_PIN_DSI_B_CLK_N,
+       TEGRA_PIN_DSI_B_D0_P,
+       TEGRA_PIN_DSI_B_D0_N,
+       TEGRA_PIN_DSI_B_D1_P,
+       TEGRA_PIN_DSI_B_D1_N,
+       TEGRA_PIN_DSI_B_D2_P,
+       TEGRA_PIN_DSI_B_D2_N,
+       TEGRA_PIN_DSI_B_D3_P,
+       TEGRA_PIN_DSI_B_D3_N,
+};
+
 enum tegra_mux {
        TEGRA_MUX_BLINK,
        TEGRA_MUX_CCLA,
@@ -1580,6 +1613,8 @@ enum tegra_mux {
        TEGRA_MUX_VI_ALT3,
        TEGRA_MUX_VIMCLK2,
        TEGRA_MUX_VIMCLK2_ALT,
+       TEGRA_MUX_CSI,
+       TEGRA_MUX_DSI_B,
 };
 
 #define FUNCTION(fname)                                        \
@@ -1672,10 +1707,13 @@ static struct tegra_function tegra124_functions[] = {
        FUNCTION(vi_alt3),
        FUNCTION(vimclk2),
        FUNCTION(vimclk2_alt),
+       FUNCTION(csi),
+       FUNCTION(dsi_b),
 };
 
 #define DRV_PINGROUP_REG_A             0x868   /* bank 0 */
 #define PINGROUP_REG_A                 0x3000  /* bank 1 */
+#define MIPI_PAD_CTRL_PINGROUP_REG_A   0x820   /* bank 2 */
 
 #define PINGROUP_REG(r)                        ((r) - PINGROUP_REG_A)
 
@@ -1744,6 +1782,32 @@ static struct tegra_function tegra124_functions[] = {
                .drvtype_bit = PINGROUP_BIT_##drvtype(6),               \
        }
 
+#define MIPI_PAD_CTRL_PINGROUP_REG_Y(r)        ((r) - MIPI_PAD_CTRL_PINGROUP_REG_A)
+
+#define MIPI_PAD_CTRL_PINGROUP(pg_name, r, b, f0, f1)                  \
+       {                                                               \
+               .name = "mipi_pad_ctrl_" #pg_name,                      \
+               .pins = mipi_pad_ctrl_##pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(mipi_pad_ctrl_##pg_name##_pins),    \
+               .funcs = {                                              \
+                       TEGRA_MUX_ ## f0,                               \
+                       TEGRA_MUX_ ## f1,                               \
+                       TEGRA_MUX_RSVD3,                                \
+                       TEGRA_MUX_RSVD4,                                \
+               },                                                      \
+               .mux_reg = MIPI_PAD_CTRL_PINGROUP_REG_Y(r),             \
+               .mux_bank = 2,                                          \
+               .mux_bit = b,                                           \
+               .pupd_reg = -1,                                         \
+               .tri_reg = -1,                                          \
+               .einput_bit = -1,                                       \
+               .odrain_bit = -1,                                       \
+               .lock_bit = -1,                                         \
+               .ioreset_bit = -1,                                      \
+               .rcv_sel_bit = -1,                                      \
+               .drv_reg = -1,                                          \
+       }
+
 static const struct tegra_pingroup tegra124_groups[] = {
        /*       pg_name,                f0,         f1,         f2,           f3,          r,      od, ior, rcv_sel */
        PINGROUP(ulpi_data0_po1,         SPI3,       HSI,        UARTA,        ULPI,        0x3000, N,   N,  N),
@@ -1979,6 +2043,9 @@ static const struct tegra_pingroup tegra124_groups[] = {
        DRV_PINGROUP(hv0,         0x9b4,  2,  3,  4,  12,  5,  -1, -1,  28,  2,  -1, -1,  N),
        DRV_PINGROUP(sdio4,       0x9c4,  2,  3,  4,  12,  5,  20,  5,  28,  2,  30,  2,  N),
        DRV_PINGROUP(ao4,         0x9c8,  2,  3,  4,  12,  7,  20,  7,  28,  2,  30,  2,  Y),
+
+       /*                     pg_name, r      b  f0,  f1 */
+       MIPI_PAD_CTRL_PINGROUP(dsi_b,   0x820, 1, CSI, DSI_B)
 };
 
 static const struct tegra_pinctrl_soc_data tegra124_pinctrl = {
@@ -1996,7 +2063,7 @@ static int tegra124_pinctrl_probe(struct platform_device *pdev)
        return tegra_pinctrl_probe(pdev, &tegra124_pinctrl);
 }
 
-static struct of_device_id tegra124_pinctrl_of_match[] = {
+static const struct of_device_id tegra124_pinctrl_of_match[] = {
        { .compatible = "nvidia,tegra124-pinmux", },
        { },
 };
index 7563ebc..c9805d2 100644 (file)
@@ -2228,7 +2228,7 @@ static int tegra20_pinctrl_probe(struct platform_device *pdev)
        return tegra_pinctrl_probe(pdev, &tegra20_pinctrl);
 }
 
-static struct of_device_id tegra20_pinctrl_of_match[] = {
+static const struct of_device_id tegra20_pinctrl_of_match[] = {
        { .compatible = "nvidia,tegra20-pinmux", },
        { },
 };
index fe2d2cf..e7b72e9 100644 (file)
@@ -2484,7 +2484,7 @@ static int tegra30_pinctrl_probe(struct platform_device *pdev)
        return tegra_pinctrl_probe(pdev, &tegra30_pinctrl);
 }
 
-static struct of_device_id tegra30_pinctrl_of_match[] = {
+static const struct of_device_id tegra30_pinctrl_of_match[] = {
        { .compatible = "nvidia,tegra30-pinmux", },
        { },
 };
index 41e81a3..3bb6a3b 100644 (file)
@@ -547,8 +547,9 @@ static void tz1090_pdc_pinctrl_mux(struct tz1090_pdc_pmx *pmx,
        __global_unlock2(flags);
 }
 
-static int tz1090_pdc_pinctrl_enable(struct pinctrl_dev *pctldev,
-                                    unsigned int function, unsigned int group)
+static int tz1090_pdc_pinctrl_set_mux(struct pinctrl_dev *pctldev,
+                                     unsigned int function,
+                                     unsigned int group)
 {
        struct tz1090_pdc_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
        const struct tz1090_pdc_pingroup *grp = &tz1090_pdc_groups[group];
@@ -634,7 +635,7 @@ static struct pinmux_ops tz1090_pdc_pinmux_ops = {
        .get_functions_count    = tz1090_pdc_pinctrl_get_funcs_count,
        .get_function_name      = tz1090_pdc_pinctrl_get_func_name,
        .get_function_groups    = tz1090_pdc_pinctrl_get_func_groups,
-       .enable                 = tz1090_pdc_pinctrl_enable,
+       .set_mux                = tz1090_pdc_pinctrl_set_mux,
        .gpio_request_enable    = tz1090_pdc_pinctrl_gpio_request_enable,
        .gpio_disable_free      = tz1090_pdc_pinctrl_gpio_disable_free,
 };
index 2408221..48d3641 100644 (file)
@@ -1415,8 +1415,8 @@ found_mux:
  * the effect is the same as enabling the function on each individual pin in the
  * group.
  */
-static int tz1090_pinctrl_enable(struct pinctrl_dev *pctldev,
-                                unsigned int function, unsigned int group)
+static int tz1090_pinctrl_set_mux(struct pinctrl_dev *pctldev,
+                                 unsigned int function, unsigned int group)
 {
        struct tz1090_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct tz1090_pingroup *grp;
@@ -1517,7 +1517,7 @@ static struct pinmux_ops tz1090_pinmux_ops = {
        .get_functions_count    = tz1090_pinctrl_get_funcs_count,
        .get_function_name      = tz1090_pinctrl_get_func_name,
        .get_function_groups    = tz1090_pinctrl_get_func_groups,
-       .enable                 = tz1090_pinctrl_enable,
+       .set_mux                = tz1090_pinctrl_set_mux,
        .gpio_request_enable    = tz1090_pinctrl_gpio_request_enable,
        .gpio_disable_free      = tz1090_pinctrl_gpio_disable_free,
 };
index 0959bb3..e9c7113 100644 (file)
@@ -955,8 +955,8 @@ static void u300_pmx_endisable(struct u300_pmx *upmx, unsigned selector,
        }
 }
 
-static int u300_pmx_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                          unsigned group)
+static int u300_pmx_set_mux(struct pinctrl_dev *pctldev, unsigned selector,
+                           unsigned group)
 {
        struct u300_pmx *upmx;
 
@@ -994,7 +994,7 @@ static const struct pinmux_ops u300_pmx_ops = {
        .get_functions_count = u300_pmx_get_funcs_count,
        .get_function_name = u300_pmx_get_func_name,
        .get_function_groups = u300_pmx_get_groups,
-       .enable = u300_pmx_enable,
+       .set_mux = u300_pmx_set_mux,
 };
 
 static int u300_pin_config_get(struct pinctrl_dev *pctldev, unsigned pin,
index e66f4ca..37040ab 100644 (file)
@@ -801,6 +801,7 @@ static int pinmux_xway_probe(struct platform_device *pdev)
        of_gpiochip_add(&xway_chip);
        ret = gpiochip_add(&xway_chip);
        if (ret) {
+               of_gpiochip_remove(&xway_chip);
                dev_err(&pdev->dev, "Failed to register gpio chip\n");
                return ret;
        }
@@ -822,6 +823,7 @@ static int pinmux_xway_probe(struct platform_device *pdev)
        /* register with the generic lantiq layer */
        ret = ltq_pinctrl_register(pdev, &xway_info);
        if (ret) {
+               gpiochip_remove(&xway_chip);
                dev_err(&pdev->dev, "Failed to register pinctrl driver\n");
                return ret;
        }
index c055daf..b874458 100644 (file)
@@ -41,7 +41,7 @@ int pinmux_check_ops(struct pinctrl_dev *pctldev)
            !ops->get_functions_count ||
            !ops->get_function_name ||
            !ops->get_function_groups ||
-           !ops->enable) {
+           !ops->set_mux) {
                dev_err(pctldev->dev, "pinmux ops lacks necessary functions\n");
                return -EINVAL;
        }
@@ -445,15 +445,15 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
                desc->mux_setting = &(setting->data.mux);
        }
 
-       ret = ops->enable(pctldev, setting->data.mux.func,
-                         setting->data.mux.group);
+       ret = ops->set_mux(pctldev, setting->data.mux.func,
+                          setting->data.mux.group);
 
        if (ret)
-               goto err_enable;
+               goto err_set_mux;
 
        return 0;
 
-err_enable:
+err_set_mux:
        for (i = 0; i < num_pins; i++) {
                desc = pin_desc_get(pctldev, pins[i]);
                if (desc)
index d160a71..81275af 100644 (file)
@@ -15,6 +15,14 @@ config PINCTRL_APQ8064
          This is the pinctrl, pinmux, pinconf and gpiolib driver for the
          Qualcomm TLMM block found in the Qualcomm APQ8064 platform.
 
+config PINCTRL_APQ8084
+       tristate "Qualcomm APQ8084 pin controller driver"
+       depends on GPIOLIB && OF
+       select PINCTRL_MSM
+       help
+         This is the pinctrl, pinmux, pinconf and gpiolib driver for the
+         Qualcomm TLMM block found in the Qualcomm APQ8084 platform.
+
 config PINCTRL_IPQ8064
        tristate "Qualcomm IPQ8064 pin controller driver"
        depends on GPIOLIB && OF
index 2a02602..ba8519f 100644 (file)
@@ -1,6 +1,7 @@
 # Qualcomm pin control drivers
 obj-$(CONFIG_PINCTRL_MSM)      += pinctrl-msm.o
 obj-$(CONFIG_PINCTRL_APQ8064)  += pinctrl-apq8064.o
+obj-$(CONFIG_PINCTRL_APQ8084)  += pinctrl-apq8084.o
 obj-$(CONFIG_PINCTRL_IPQ8064)  += pinctrl-ipq8064.o
 obj-$(CONFIG_PINCTRL_MSM8960)  += pinctrl-msm8960.o
 obj-$(CONFIG_PINCTRL_MSM8X74)  += pinctrl-msm8x74.o
index feb6f15..c832d7d 100644 (file)
@@ -258,6 +258,7 @@ static const unsigned int sdc3_data_pins[] = { 95 };
                .intr_status_bit = 0,                   \
                .intr_ack_high = 1,                     \
                .intr_target_bit = 0,                   \
+               .intr_target_kpss_val = 4,              \
                .intr_raw_status_bit = 3,               \
                .intr_polarity_bit = 1,                 \
                .intr_detection_bit = 2,                \
@@ -283,6 +284,7 @@ static const unsigned int sdc3_data_pins[] = { 95 };
                .intr_enable_bit = -1,                  \
                .intr_status_bit = -1,                  \
                .intr_target_bit = -1,                  \
+               .intr_target_kpss_val = -1,             \
                .intr_raw_status_bit = -1,              \
                .intr_polarity_bit = -1,                \
                .intr_detection_bit = -1,               \
@@ -324,6 +326,7 @@ enum apq8064_functions {
        APQ_MUX_tsif1,
        APQ_MUX_tsif2,
        APQ_MUX_usb2_hsic,
+       APQ_MUX_ps_hold,
        APQ_MUX_NA,
 };
 
@@ -351,6 +354,9 @@ static const char * const gpio_groups[] = {
        "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
        "gpio85", "gpio86", "gpio87", "gpio88", "gpio89"
 };
+static const char * const ps_hold_groups[] = {
+       "gpio78"
+};
 static const char * const gsbi1_groups[] = {
        "gpio18", "gpio19", "gpio20", "gpio21"
 };
@@ -477,6 +483,7 @@ static const struct msm_function apq8064_functions[] = {
        FUNCTION(tsif1),
        FUNCTION(tsif2),
        FUNCTION(usb2_hsic),
+       FUNCTION(ps_hold),
 };
 
 static const struct msm_pingroup apq8064_groups[] = {
@@ -558,7 +565,7 @@ static const struct msm_pingroup apq8064_groups[] = {
        PINGROUP(75, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
        PINGROUP(76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
        PINGROUP(77, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
-       PINGROUP(78, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(78, ps_hold, NA, NA, NA, NA, NA, NA, NA, NA, NA),
        PINGROUP(79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
        PINGROUP(80, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
        PINGROUP(81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
diff --git a/drivers/pinctrl/qcom/pinctrl-apq8084.c b/drivers/pinctrl/qcom/pinctrl-apq8084.c
new file mode 100644 (file)
index 0000000..138cbf6
--- /dev/null
@@ -0,0 +1,1245 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 and
+ * only version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pinctrl/pinctrl.h>
+
+#include "pinctrl-msm.h"
+
+static const struct pinctrl_pin_desc apq8084_pins[] = {
+       PINCTRL_PIN(0, "GPIO_0"),
+       PINCTRL_PIN(1, "GPIO_1"),
+       PINCTRL_PIN(2, "GPIO_2"),
+       PINCTRL_PIN(3, "GPIO_3"),
+       PINCTRL_PIN(4, "GPIO_4"),
+       PINCTRL_PIN(5, "GPIO_5"),
+       PINCTRL_PIN(6, "GPIO_6"),
+       PINCTRL_PIN(7, "GPIO_7"),
+       PINCTRL_PIN(8, "GPIO_8"),
+       PINCTRL_PIN(9, "GPIO_9"),
+       PINCTRL_PIN(10, "GPIO_10"),
+       PINCTRL_PIN(11, "GPIO_11"),
+       PINCTRL_PIN(12, "GPIO_12"),
+       PINCTRL_PIN(13, "GPIO_13"),
+       PINCTRL_PIN(14, "GPIO_14"),
+       PINCTRL_PIN(15, "GPIO_15"),
+       PINCTRL_PIN(16, "GPIO_16"),
+       PINCTRL_PIN(17, "GPIO_17"),
+       PINCTRL_PIN(18, "GPIO_18"),
+       PINCTRL_PIN(19, "GPIO_19"),
+       PINCTRL_PIN(20, "GPIO_20"),
+       PINCTRL_PIN(21, "GPIO_21"),
+       PINCTRL_PIN(22, "GPIO_22"),
+       PINCTRL_PIN(23, "GPIO_23"),
+       PINCTRL_PIN(24, "GPIO_24"),
+       PINCTRL_PIN(25, "GPIO_25"),
+       PINCTRL_PIN(26, "GPIO_26"),
+       PINCTRL_PIN(27, "GPIO_27"),
+       PINCTRL_PIN(28, "GPIO_28"),
+       PINCTRL_PIN(29, "GPIO_29"),
+       PINCTRL_PIN(30, "GPIO_30"),
+       PINCTRL_PIN(31, "GPIO_31"),
+       PINCTRL_PIN(32, "GPIO_32"),
+       PINCTRL_PIN(33, "GPIO_33"),
+       PINCTRL_PIN(34, "GPIO_34"),
+       PINCTRL_PIN(35, "GPIO_35"),
+       PINCTRL_PIN(36, "GPIO_36"),
+       PINCTRL_PIN(37, "GPIO_37"),
+       PINCTRL_PIN(38, "GPIO_38"),
+       PINCTRL_PIN(39, "GPIO_39"),
+       PINCTRL_PIN(40, "GPIO_40"),
+       PINCTRL_PIN(41, "GPIO_41"),
+       PINCTRL_PIN(42, "GPIO_42"),
+       PINCTRL_PIN(43, "GPIO_43"),
+       PINCTRL_PIN(44, "GPIO_44"),
+       PINCTRL_PIN(45, "GPIO_45"),
+       PINCTRL_PIN(46, "GPIO_46"),
+       PINCTRL_PIN(47, "GPIO_47"),
+       PINCTRL_PIN(48, "GPIO_48"),
+       PINCTRL_PIN(49, "GPIO_49"),
+       PINCTRL_PIN(50, "GPIO_50"),
+       PINCTRL_PIN(51, "GPIO_51"),
+       PINCTRL_PIN(52, "GPIO_52"),
+       PINCTRL_PIN(53, "GPIO_53"),
+       PINCTRL_PIN(54, "GPIO_54"),
+       PINCTRL_PIN(55, "GPIO_55"),
+       PINCTRL_PIN(56, "GPIO_56"),
+       PINCTRL_PIN(57, "GPIO_57"),
+       PINCTRL_PIN(58, "GPIO_58"),
+       PINCTRL_PIN(59, "GPIO_59"),
+       PINCTRL_PIN(60, "GPIO_60"),
+       PINCTRL_PIN(61, "GPIO_61"),
+       PINCTRL_PIN(62, "GPIO_62"),
+       PINCTRL_PIN(63, "GPIO_63"),
+       PINCTRL_PIN(64, "GPIO_64"),
+       PINCTRL_PIN(65, "GPIO_65"),
+       PINCTRL_PIN(66, "GPIO_66"),
+       PINCTRL_PIN(67, "GPIO_67"),
+       PINCTRL_PIN(68, "GPIO_68"),
+       PINCTRL_PIN(69, "GPIO_69"),
+       PINCTRL_PIN(70, "GPIO_70"),
+       PINCTRL_PIN(71, "GPIO_71"),
+       PINCTRL_PIN(72, "GPIO_72"),
+       PINCTRL_PIN(73, "GPIO_73"),
+       PINCTRL_PIN(74, "GPIO_74"),
+       PINCTRL_PIN(75, "GPIO_75"),
+       PINCTRL_PIN(76, "GPIO_76"),
+       PINCTRL_PIN(77, "GPIO_77"),
+       PINCTRL_PIN(78, "GPIO_78"),
+       PINCTRL_PIN(79, "GPIO_79"),
+       PINCTRL_PIN(80, "GPIO_80"),
+       PINCTRL_PIN(81, "GPIO_81"),
+       PINCTRL_PIN(82, "GPIO_82"),
+       PINCTRL_PIN(83, "GPIO_83"),
+       PINCTRL_PIN(84, "GPIO_84"),
+       PINCTRL_PIN(85, "GPIO_85"),
+       PINCTRL_PIN(86, "GPIO_86"),
+       PINCTRL_PIN(87, "GPIO_87"),
+       PINCTRL_PIN(88, "GPIO_88"),
+       PINCTRL_PIN(89, "GPIO_89"),
+       PINCTRL_PIN(90, "GPIO_90"),
+       PINCTRL_PIN(91, "GPIO_91"),
+       PINCTRL_PIN(92, "GPIO_92"),
+       PINCTRL_PIN(93, "GPIO_93"),
+       PINCTRL_PIN(94, "GPIO_94"),
+       PINCTRL_PIN(95, "GPIO_95"),
+       PINCTRL_PIN(96, "GPIO_96"),
+       PINCTRL_PIN(97, "GPIO_97"),
+       PINCTRL_PIN(98, "GPIO_98"),
+       PINCTRL_PIN(99, "GPIO_99"),
+       PINCTRL_PIN(100, "GPIO_100"),
+       PINCTRL_PIN(101, "GPIO_101"),
+       PINCTRL_PIN(102, "GPIO_102"),
+       PINCTRL_PIN(103, "GPIO_103"),
+       PINCTRL_PIN(104, "GPIO_104"),
+       PINCTRL_PIN(105, "GPIO_105"),
+       PINCTRL_PIN(106, "GPIO_106"),
+       PINCTRL_PIN(107, "GPIO_107"),
+       PINCTRL_PIN(108, "GPIO_108"),
+       PINCTRL_PIN(109, "GPIO_109"),
+       PINCTRL_PIN(110, "GPIO_110"),
+       PINCTRL_PIN(111, "GPIO_111"),
+       PINCTRL_PIN(112, "GPIO_112"),
+       PINCTRL_PIN(113, "GPIO_113"),
+       PINCTRL_PIN(114, "GPIO_114"),
+       PINCTRL_PIN(115, "GPIO_115"),
+       PINCTRL_PIN(116, "GPIO_116"),
+       PINCTRL_PIN(117, "GPIO_117"),
+       PINCTRL_PIN(118, "GPIO_118"),
+       PINCTRL_PIN(119, "GPIO_119"),
+       PINCTRL_PIN(120, "GPIO_120"),
+       PINCTRL_PIN(121, "GPIO_121"),
+       PINCTRL_PIN(122, "GPIO_122"),
+       PINCTRL_PIN(123, "GPIO_123"),
+       PINCTRL_PIN(124, "GPIO_124"),
+       PINCTRL_PIN(125, "GPIO_125"),
+       PINCTRL_PIN(126, "GPIO_126"),
+       PINCTRL_PIN(127, "GPIO_127"),
+       PINCTRL_PIN(128, "GPIO_128"),
+       PINCTRL_PIN(129, "GPIO_129"),
+       PINCTRL_PIN(130, "GPIO_130"),
+       PINCTRL_PIN(131, "GPIO_131"),
+       PINCTRL_PIN(132, "GPIO_132"),
+       PINCTRL_PIN(133, "GPIO_133"),
+       PINCTRL_PIN(134, "GPIO_134"),
+       PINCTRL_PIN(135, "GPIO_135"),
+       PINCTRL_PIN(136, "GPIO_136"),
+       PINCTRL_PIN(137, "GPIO_137"),
+       PINCTRL_PIN(138, "GPIO_138"),
+       PINCTRL_PIN(139, "GPIO_139"),
+       PINCTRL_PIN(140, "GPIO_140"),
+       PINCTRL_PIN(141, "GPIO_141"),
+       PINCTRL_PIN(142, "GPIO_142"),
+       PINCTRL_PIN(143, "GPIO_143"),
+       PINCTRL_PIN(144, "GPIO_144"),
+       PINCTRL_PIN(145, "GPIO_145"),
+       PINCTRL_PIN(146, "GPIO_146"),
+
+       PINCTRL_PIN(147, "SDC1_CLK"),
+       PINCTRL_PIN(148, "SDC1_CMD"),
+       PINCTRL_PIN(149, "SDC1_DATA"),
+       PINCTRL_PIN(150, "SDC2_CLK"),
+       PINCTRL_PIN(151, "SDC2_CMD"),
+       PINCTRL_PIN(152, "SDC2_DATA"),
+};
+
+#define DECLARE_APQ_GPIO_PINS(pin) static const unsigned int gpio##pin##_pins[] = { pin }
+
+DECLARE_APQ_GPIO_PINS(0);
+DECLARE_APQ_GPIO_PINS(1);
+DECLARE_APQ_GPIO_PINS(2);
+DECLARE_APQ_GPIO_PINS(3);
+DECLARE_APQ_GPIO_PINS(4);
+DECLARE_APQ_GPIO_PINS(5);
+DECLARE_APQ_GPIO_PINS(6);
+DECLARE_APQ_GPIO_PINS(7);
+DECLARE_APQ_GPIO_PINS(8);
+DECLARE_APQ_GPIO_PINS(9);
+DECLARE_APQ_GPIO_PINS(10);
+DECLARE_APQ_GPIO_PINS(11);
+DECLARE_APQ_GPIO_PINS(12);
+DECLARE_APQ_GPIO_PINS(13);
+DECLARE_APQ_GPIO_PINS(14);
+DECLARE_APQ_GPIO_PINS(15);
+DECLARE_APQ_GPIO_PINS(16);
+DECLARE_APQ_GPIO_PINS(17);
+DECLARE_APQ_GPIO_PINS(18);
+DECLARE_APQ_GPIO_PINS(19);
+DECLARE_APQ_GPIO_PINS(20);
+DECLARE_APQ_GPIO_PINS(21);
+DECLARE_APQ_GPIO_PINS(22);
+DECLARE_APQ_GPIO_PINS(23);
+DECLARE_APQ_GPIO_PINS(24);
+DECLARE_APQ_GPIO_PINS(25);
+DECLARE_APQ_GPIO_PINS(26);
+DECLARE_APQ_GPIO_PINS(27);
+DECLARE_APQ_GPIO_PINS(28);
+DECLARE_APQ_GPIO_PINS(29);
+DECLARE_APQ_GPIO_PINS(30);
+DECLARE_APQ_GPIO_PINS(31);
+DECLARE_APQ_GPIO_PINS(32);
+DECLARE_APQ_GPIO_PINS(33);
+DECLARE_APQ_GPIO_PINS(34);
+DECLARE_APQ_GPIO_PINS(35);
+DECLARE_APQ_GPIO_PINS(36);
+DECLARE_APQ_GPIO_PINS(37);
+DECLARE_APQ_GPIO_PINS(38);
+DECLARE_APQ_GPIO_PINS(39);
+DECLARE_APQ_GPIO_PINS(40);
+DECLARE_APQ_GPIO_PINS(41);
+DECLARE_APQ_GPIO_PINS(42);
+DECLARE_APQ_GPIO_PINS(43);
+DECLARE_APQ_GPIO_PINS(44);
+DECLARE_APQ_GPIO_PINS(45);
+DECLARE_APQ_GPIO_PINS(46);
+DECLARE_APQ_GPIO_PINS(47);
+DECLARE_APQ_GPIO_PINS(48);
+DECLARE_APQ_GPIO_PINS(49);
+DECLARE_APQ_GPIO_PINS(50);
+DECLARE_APQ_GPIO_PINS(51);
+DECLARE_APQ_GPIO_PINS(52);
+DECLARE_APQ_GPIO_PINS(53);
+DECLARE_APQ_GPIO_PINS(54);
+DECLARE_APQ_GPIO_PINS(55);
+DECLARE_APQ_GPIO_PINS(56);
+DECLARE_APQ_GPIO_PINS(57);
+DECLARE_APQ_GPIO_PINS(58);
+DECLARE_APQ_GPIO_PINS(59);
+DECLARE_APQ_GPIO_PINS(60);
+DECLARE_APQ_GPIO_PINS(61);
+DECLARE_APQ_GPIO_PINS(62);
+DECLARE_APQ_GPIO_PINS(63);
+DECLARE_APQ_GPIO_PINS(64);
+DECLARE_APQ_GPIO_PINS(65);
+DECLARE_APQ_GPIO_PINS(66);
+DECLARE_APQ_GPIO_PINS(67);
+DECLARE_APQ_GPIO_PINS(68);
+DECLARE_APQ_GPIO_PINS(69);
+DECLARE_APQ_GPIO_PINS(70);
+DECLARE_APQ_GPIO_PINS(71);
+DECLARE_APQ_GPIO_PINS(72);
+DECLARE_APQ_GPIO_PINS(73);
+DECLARE_APQ_GPIO_PINS(74);
+DECLARE_APQ_GPIO_PINS(75);
+DECLARE_APQ_GPIO_PINS(76);
+DECLARE_APQ_GPIO_PINS(77);
+DECLARE_APQ_GPIO_PINS(78);
+DECLARE_APQ_GPIO_PINS(79);
+DECLARE_APQ_GPIO_PINS(80);
+DECLARE_APQ_GPIO_PINS(81);
+DECLARE_APQ_GPIO_PINS(82);
+DECLARE_APQ_GPIO_PINS(83);
+DECLARE_APQ_GPIO_PINS(84);
+DECLARE_APQ_GPIO_PINS(85);
+DECLARE_APQ_GPIO_PINS(86);
+DECLARE_APQ_GPIO_PINS(87);
+DECLARE_APQ_GPIO_PINS(88);
+DECLARE_APQ_GPIO_PINS(89);
+DECLARE_APQ_GPIO_PINS(90);
+DECLARE_APQ_GPIO_PINS(91);
+DECLARE_APQ_GPIO_PINS(92);
+DECLARE_APQ_GPIO_PINS(93);
+DECLARE_APQ_GPIO_PINS(94);
+DECLARE_APQ_GPIO_PINS(95);
+DECLARE_APQ_GPIO_PINS(96);
+DECLARE_APQ_GPIO_PINS(97);
+DECLARE_APQ_GPIO_PINS(98);
+DECLARE_APQ_GPIO_PINS(99);
+DECLARE_APQ_GPIO_PINS(100);
+DECLARE_APQ_GPIO_PINS(101);
+DECLARE_APQ_GPIO_PINS(102);
+DECLARE_APQ_GPIO_PINS(103);
+DECLARE_APQ_GPIO_PINS(104);
+DECLARE_APQ_GPIO_PINS(105);
+DECLARE_APQ_GPIO_PINS(106);
+DECLARE_APQ_GPIO_PINS(107);
+DECLARE_APQ_GPIO_PINS(108);
+DECLARE_APQ_GPIO_PINS(109);
+DECLARE_APQ_GPIO_PINS(110);
+DECLARE_APQ_GPIO_PINS(111);
+DECLARE_APQ_GPIO_PINS(112);
+DECLARE_APQ_GPIO_PINS(113);
+DECLARE_APQ_GPIO_PINS(114);
+DECLARE_APQ_GPIO_PINS(115);
+DECLARE_APQ_GPIO_PINS(116);
+DECLARE_APQ_GPIO_PINS(117);
+DECLARE_APQ_GPIO_PINS(118);
+DECLARE_APQ_GPIO_PINS(119);
+DECLARE_APQ_GPIO_PINS(120);
+DECLARE_APQ_GPIO_PINS(121);
+DECLARE_APQ_GPIO_PINS(122);
+DECLARE_APQ_GPIO_PINS(123);
+DECLARE_APQ_GPIO_PINS(124);
+DECLARE_APQ_GPIO_PINS(125);
+DECLARE_APQ_GPIO_PINS(126);
+DECLARE_APQ_GPIO_PINS(127);
+DECLARE_APQ_GPIO_PINS(128);
+DECLARE_APQ_GPIO_PINS(129);
+DECLARE_APQ_GPIO_PINS(130);
+DECLARE_APQ_GPIO_PINS(131);
+DECLARE_APQ_GPIO_PINS(132);
+DECLARE_APQ_GPIO_PINS(133);
+DECLARE_APQ_GPIO_PINS(134);
+DECLARE_APQ_GPIO_PINS(135);
+DECLARE_APQ_GPIO_PINS(136);
+DECLARE_APQ_GPIO_PINS(137);
+DECLARE_APQ_GPIO_PINS(138);
+DECLARE_APQ_GPIO_PINS(139);
+DECLARE_APQ_GPIO_PINS(140);
+DECLARE_APQ_GPIO_PINS(141);
+DECLARE_APQ_GPIO_PINS(142);
+DECLARE_APQ_GPIO_PINS(143);
+DECLARE_APQ_GPIO_PINS(144);
+DECLARE_APQ_GPIO_PINS(145);
+DECLARE_APQ_GPIO_PINS(146);
+
+static const unsigned int sdc1_clk_pins[] = { 147 };
+static const unsigned int sdc1_cmd_pins[] = { 148 };
+static const unsigned int sdc1_data_pins[] = { 149 };
+static const unsigned int sdc2_clk_pins[] = { 150 };
+static const unsigned int sdc2_cmd_pins[] = { 151 };
+static const unsigned int sdc2_data_pins[] = { 152 };
+
+#define FUNCTION(fname)                                        \
+       [APQ_MUX_##fname] = {                           \
+               .name = #fname,                         \
+               .groups = fname##_groups,               \
+               .ngroups = ARRAY_SIZE(fname##_groups),  \
+       }
+
+#define PINGROUP(id, f1, f2, f3, f4, f5, f6, f7)        \
+       {                                               \
+               .name = "gpio" #id,                     \
+               .pins = gpio##id##_pins,                \
+               .npins = ARRAY_SIZE(gpio##id##_pins),   \
+               .funcs = (int[]){                       \
+                       APQ_MUX_gpio,                   \
+                       APQ_MUX_##f1,                   \
+                       APQ_MUX_##f2,                   \
+                       APQ_MUX_##f3,                   \
+                       APQ_MUX_##f4,                   \
+                       APQ_MUX_##f5,                   \
+                       APQ_MUX_##f6,                   \
+                       APQ_MUX_##f7                    \
+               },                                      \
+               .nfuncs = 8,                            \
+               .ctl_reg = 0x1000 + 0x10 * id,          \
+               .io_reg = 0x1004 + 0x10 * id,           \
+               .intr_cfg_reg = 0x1008 + 0x10 * id,     \
+               .intr_status_reg = 0x100c + 0x10 * id,  \
+               .intr_target_reg = 0x1008 + 0x10 * id,  \
+               .mux_bit = 2,                           \
+               .pull_bit = 0,                          \
+               .drv_bit = 6,                           \
+               .oe_bit = 9,                            \
+               .in_bit = 0,                            \
+               .out_bit = 1,                           \
+               .intr_enable_bit = 0,                   \
+               .intr_status_bit = 0,                   \
+               .intr_ack_high = 0,                     \
+               .intr_target_bit = 5,                   \
+               .intr_target_kpss_val = 3,              \
+               .intr_raw_status_bit = 4,               \
+               .intr_polarity_bit = 1,                 \
+               .intr_detection_bit = 2,                \
+               .intr_detection_width = 2,              \
+       }
+
+#define SDC_PINGROUP(pg_name, ctl, pull, drv)          \
+       {                                               \
+               .name = #pg_name,                       \
+               .pins = pg_name##_pins,                 \
+               .npins = ARRAY_SIZE(pg_name##_pins),    \
+               .ctl_reg = ctl,                         \
+               .io_reg = 0,                            \
+               .intr_cfg_reg = 0,                      \
+               .intr_status_reg = 0,                   \
+               .intr_target_reg = 0,                   \
+               .mux_bit = -1,                          \
+               .pull_bit = pull,                       \
+               .drv_bit = drv,                         \
+               .oe_bit = -1,                           \
+               .in_bit = -1,                           \
+               .out_bit = -1,                          \
+               .intr_enable_bit = -1,                  \
+               .intr_status_bit = -1,                  \
+               .intr_target_bit = -1,                  \
+               .intr_target_kpss_val = -1,             \
+               .intr_raw_status_bit = -1,              \
+               .intr_polarity_bit = -1,                \
+               .intr_detection_bit = -1,               \
+               .intr_detection_width = -1,             \
+       }
+
+enum apq8084_functions {
+       APQ_MUX_adsp_ext,
+       APQ_MUX_audio_ref,
+       APQ_MUX_blsp_i2c1,
+       APQ_MUX_blsp_i2c2,
+       APQ_MUX_blsp_i2c3,
+       APQ_MUX_blsp_i2c4,
+       APQ_MUX_blsp_i2c5,
+       APQ_MUX_blsp_i2c6,
+       APQ_MUX_blsp_i2c7,
+       APQ_MUX_blsp_i2c8,
+       APQ_MUX_blsp_i2c9,
+       APQ_MUX_blsp_i2c10,
+       APQ_MUX_blsp_i2c11,
+       APQ_MUX_blsp_i2c12,
+       APQ_MUX_blsp_spi1,
+       APQ_MUX_blsp_spi1_cs1,
+       APQ_MUX_blsp_spi1_cs2,
+       APQ_MUX_blsp_spi1_cs3,
+       APQ_MUX_blsp_spi2,
+       APQ_MUX_blsp_spi3,
+       APQ_MUX_blsp_spi3_cs1,
+       APQ_MUX_blsp_spi3_cs2,
+       APQ_MUX_blsp_spi3_cs3,
+       APQ_MUX_blsp_spi4,
+       APQ_MUX_blsp_spi5,
+       APQ_MUX_blsp_spi6,
+       APQ_MUX_blsp_spi7,
+       APQ_MUX_blsp_spi8,
+       APQ_MUX_blsp_spi9,
+       APQ_MUX_blsp_spi10,
+       APQ_MUX_blsp_spi10_cs1,
+       APQ_MUX_blsp_spi10_cs2,
+       APQ_MUX_blsp_spi10_cs3,
+       APQ_MUX_blsp_spi11,
+       APQ_MUX_blsp_spi12,
+       APQ_MUX_blsp_uart1,
+       APQ_MUX_blsp_uart2,
+       APQ_MUX_blsp_uart3,
+       APQ_MUX_blsp_uart4,
+       APQ_MUX_blsp_uart5,
+       APQ_MUX_blsp_uart6,
+       APQ_MUX_blsp_uart7,
+       APQ_MUX_blsp_uart8,
+       APQ_MUX_blsp_uart9,
+       APQ_MUX_blsp_uart10,
+       APQ_MUX_blsp_uart11,
+       APQ_MUX_blsp_uart12,
+       APQ_MUX_blsp_uim1,
+       APQ_MUX_blsp_uim2,
+       APQ_MUX_blsp_uim3,
+       APQ_MUX_blsp_uim4,
+       APQ_MUX_blsp_uim5,
+       APQ_MUX_blsp_uim6,
+       APQ_MUX_blsp_uim7,
+       APQ_MUX_blsp_uim8,
+       APQ_MUX_blsp_uim9,
+       APQ_MUX_blsp_uim10,
+       APQ_MUX_blsp_uim11,
+       APQ_MUX_blsp_uim12,
+       APQ_MUX_cam_mclk0,
+       APQ_MUX_cam_mclk1,
+       APQ_MUX_cam_mclk2,
+       APQ_MUX_cam_mclk3,
+       APQ_MUX_cci_async,
+       APQ_MUX_cci_async_in0,
+       APQ_MUX_cci_i2c0,
+       APQ_MUX_cci_i2c1,
+       APQ_MUX_cci_timer0,
+       APQ_MUX_cci_timer1,
+       APQ_MUX_cci_timer2,
+       APQ_MUX_cci_timer3,
+       APQ_MUX_cci_timer4,
+       APQ_MUX_edp_hpd,
+       APQ_MUX_gcc_gp1,
+       APQ_MUX_gcc_gp2,
+       APQ_MUX_gcc_gp3,
+       APQ_MUX_gcc_obt,
+       APQ_MUX_gcc_vtt,
+       APQ_MUX_gp_mn,
+       APQ_MUX_gp_pdm0,
+       APQ_MUX_gp_pdm1,
+       APQ_MUX_gp_pdm2,
+       APQ_MUX_gp0_clk,
+       APQ_MUX_gp1_clk,
+       APQ_MUX_gpio,
+       APQ_MUX_hdmi_cec,
+       APQ_MUX_hdmi_ddc,
+       APQ_MUX_hdmi_dtest,
+       APQ_MUX_hdmi_hpd,
+       APQ_MUX_hdmi_rcv,
+       APQ_MUX_hsic,
+       APQ_MUX_ldo_en,
+       APQ_MUX_ldo_update,
+       APQ_MUX_mdp_vsync,
+       APQ_MUX_pci_e0,
+       APQ_MUX_pci_e0_n,
+       APQ_MUX_pci_e0_rst,
+       APQ_MUX_pci_e1,
+       APQ_MUX_pci_e1_rst,
+       APQ_MUX_pci_e1_rst_n,
+       APQ_MUX_pci_e1_clkreq_n,
+       APQ_MUX_pri_mi2s,
+       APQ_MUX_qua_mi2s,
+       APQ_MUX_sata_act,
+       APQ_MUX_sata_devsleep,
+       APQ_MUX_sata_devsleep_n,
+       APQ_MUX_sd_write,
+       APQ_MUX_sdc_emmc_mode,
+       APQ_MUX_sdc3,
+       APQ_MUX_sdc4,
+       APQ_MUX_sec_mi2s,
+       APQ_MUX_slimbus,
+       APQ_MUX_spdif_tx,
+       APQ_MUX_spkr_i2s,
+       APQ_MUX_spkr_i2s_ws,
+       APQ_MUX_spss_geni,
+       APQ_MUX_ter_mi2s,
+       APQ_MUX_tsif1,
+       APQ_MUX_tsif2,
+       APQ_MUX_uim,
+       APQ_MUX_uim_batt_alarm,
+       APQ_MUX_NA,
+};
+
+static const char * const gpio_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7",
+       "gpio8", "gpio9", "gpio10", "gpio11", "gpio12", "gpio13", "gpio14",
+       "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21",
+       "gpio22", "gpio23", "gpio24", "gpio25", "gpio26", "gpio27", "gpio28",
+       "gpio29", "gpio30", "gpio31", "gpio32", "gpio33", "gpio34", "gpio35",
+       "gpio36", "gpio37", "gpio38", "gpio39", "gpio40", "gpio41", "gpio42",
+       "gpio43", "gpio44", "gpio45", "gpio46", "gpio47", "gpio48", "gpio49",
+       "gpio50", "gpio51", "gpio52", "gpio53", "gpio54", "gpio55", "gpio56",
+       "gpio57", "gpio58", "gpio59", "gpio60", "gpio61", "gpio62", "gpio63",
+       "gpio64", "gpio65", "gpio66", "gpio67", "gpio68", "gpio69", "gpio70",
+       "gpio71", "gpio72", "gpio73", "gpio74", "gpio75", "gpio76", "gpio77",
+       "gpio78", "gpio79", "gpio80", "gpio81", "gpio82", "gpio83", "gpio84",
+       "gpio85", "gpio86", "gpio87", "gpio88", "gpio89", "gpio90", "gpio91",
+       "gpio92", "gpio93", "gpio94", "gpio95", "gpio96", "gpio97", "gpio98",
+       "gpio99", "gpio100", "gpio101", "gpio102", "gpio103", "gpio104",
+       "gpio105", "gpio106", "gpio107", "gpio108", "gpio109", "gpio110",
+       "gpio111", "gpio112", "gpio113", "gpio114", "gpio115", "gpio116",
+       "gpio117", "gpio118", "gpio119", "gpio120", "gpio121", "gpio122",
+       "gpio123", "gpio124", "gpio125", "gpio126", "gpio127", "gpio128",
+       "gpio129", "gpio130", "gpio131", "gpio132", "gpio133", "gpio134",
+       "gpio135", "gpio136", "gpio137", "gpio138", "gpio139", "gpio140",
+       "gpio141", "gpio142", "gpio143", "gpio144", "gpio145", "gpio146"
+};
+
+static const char * const adsp_ext_groups[] = {
+       "gpio34"
+};
+static const char * const audio_ref_groups[] = {
+       "gpio100"
+};
+static const char * const blsp_i2c1_groups[] = {
+       "gpio2", "gpio3"
+};
+static const char * const blsp_i2c2_groups[] = {
+       "gpio6", "gpio7"
+};
+static const char * const blsp_i2c3_groups[] = {
+       "gpio10", "gpio11"
+};
+static const char * const blsp_i2c4_groups[] = {
+       "gpio29", "gpio30"
+};
+static const char * const blsp_i2c5_groups[] = {
+       "gpio41", "gpio42"
+};
+static const char * const blsp_i2c6_groups[] = {
+       "gpio45", "gpio46"
+};
+static const char * const blsp_i2c7_groups[] = {
+       "gpio132", "gpio133"
+};
+static const char * const blsp_i2c8_groups[] = {
+       "gpio53", "gpio54"
+};
+static const char * const blsp_i2c9_groups[] = {
+       "gpio57", "gpio58"
+};
+static const char * const blsp_i2c10_groups[] = {
+       "gpio61", "gpio62"
+};
+static const char * const blsp_i2c11_groups[] = {
+       "gpio65", "gpio66"
+};
+static const char * const blsp_i2c12_groups[] = {
+       "gpio49", "gpio50"
+};
+static const char * const blsp_spi1_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3"
+};
+static const char * const blsp_spi2_groups[] = {
+       "gpio4", "gpio5", "gpio6", "gpio7"
+};
+static const char * const blsp_spi3_groups[] = {
+       "gpio8", "gpio9", "gpio10", "gpio11"
+};
+static const char * const blsp_spi4_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30"
+};
+static const char * const blsp_spi5_groups[] = {
+       "gpio39", "gpio40", "gpio41", "gpio42"
+};
+static const char * const blsp_spi6_groups[] = {
+       "gpio43", "gpio44", "gpio45", "gpio46"
+};
+static const char * const blsp_spi7_groups[] = {
+       "gpio130", "gpio131", "gpio132", "gpio133"
+};
+static const char * const blsp_spi8_groups[] = {
+       "gpio51", "gpio52", "gpio53", "gpio54"
+};
+static const char * const blsp_spi9_groups[] = {
+       "gpio55", "gpio56", "gpio57", "gpio58"
+};
+static const char * const blsp_spi10_groups[] = {
+       "gpio59", "gpio60", "gpio61", "gpio62"
+};
+static const char * const blsp_spi11_groups[] = {
+       "gpio63", "gpio64", "gpio65", "gpio66"
+};
+static const char * const blsp_spi12_groups[] = {
+       "gpio47", "gpio48", "gpio49", "gpio50"
+};
+static const char * const blsp_uart1_groups[] = {
+       "gpio0", "gpio1", "gpio2", "gpio3"
+};
+static const char * const blsp_uart2_groups[] = {
+       "gpio4", "gpio5", "gpio6", "gpio7"
+};
+static const char * const blsp_uart3_groups[] = {
+       "gpio8"
+};
+static const char * const blsp_uart4_groups[] = {
+       "gpio27", "gpio28", "gpio29", "gpio30"
+};
+static const char * const blsp_uart5_groups[] = {
+       "gpio39", "gpio40", "gpio41", "gpio42"
+};
+static const char * const blsp_uart6_groups[] = {
+       "gpio43", "gpio44", "gpio45", "gpio46"
+};
+static const char * const blsp_uart7_groups[] = {
+       "gpio130", "gpio131", "gpio132", "gpio133"
+};
+static const char * const blsp_uart8_groups[] = {
+       "gpio51", "gpio52", "gpio53", "gpio54"
+};
+static const char * const blsp_uart9_groups[] = {
+       "gpio55", "gpio56", "gpio57", "gpio58"
+};
+static const char * const blsp_uart10_groups[] = {
+       "gpio59", "gpio60", "gpio61", "gpio62"
+};
+static const char * const blsp_uart11_groups[] = {
+       "gpio63", "gpio64", "gpio65", "gpio66"
+};
+static const char * const blsp_uart12_groups[] = {
+       "gpio47", "gpio48", "gpio49", "gpio50"
+};
+static const char * const blsp_uim1_groups[] = {
+       "gpio0", "gpio1"
+};
+static const char * const blsp_uim2_groups[] = {
+       "gpio4", "gpio5"
+};
+static const char * const blsp_uim3_groups[] = {
+       "gpio8", "gpio9"
+};
+static const char * const blsp_uim4_groups[] = {
+       "gpio27", "gpio28"
+};
+static const char * const blsp_uim5_groups[] = {
+       "gpio39", "gpio40"
+};
+static const char * const blsp_uim6_groups[] = {
+       "gpio43", "gpio44"
+};
+static const char * const blsp_uim7_groups[] = {
+       "gpio130", "gpio131"
+};
+static const char * const blsp_uim8_groups[] = {
+       "gpio51", "gpio52"
+};
+static const char * const blsp_uim9_groups[] = {
+       "gpio55", "gpio56"
+};
+static const char * const blsp_uim10_groups[] = {
+       "gpio59", "gpio60"
+};
+static const char * const blsp_uim11_groups[] = {
+       "gpio63", "gpio64"
+};
+static const char * const blsp_uim12_groups[] = {
+       "gpio47", "gpio48"
+};
+static const char * const blsp_spi1_cs1_groups[] = {
+       "gpio116"
+};
+static const char * const blsp_spi1_cs2_groups[] = {
+       "gpio117"
+};
+static const char * const blsp_spi1_cs3_groups[] = {
+       "gpio118"
+};
+static const char * const blsp_spi3_cs1_groups[] = {
+       "gpio67"
+};
+static const char * const blsp_spi3_cs2_groups[] = {
+       "gpio71"
+};
+static const char * const blsp_spi3_cs3_groups[] = {
+       "gpio72"
+};
+static const char * const blsp_spi10_cs1_groups[] = {
+       "gpio106"
+};
+static const char * const blsp_spi10_cs2_groups[] = {
+       "gpio111"
+};
+static const char * const blsp_spi10_cs3_groups[] = {
+       "gpio128"
+};
+static const char * const cam_mclk0_groups[] = {
+       "gpio15"
+};
+static const char * const cam_mclk1_groups[] = {
+       "gpio16"
+};
+static const char * const cam_mclk2_groups[] = {
+       "gpio17"
+};
+static const char * const cam_mclk3_groups[] = {
+       "gpio18"
+};
+static const char * const cci_async_groups[] = {
+       "gpio26", "gpio119"
+};
+static const char * const cci_async_in0_groups[] = {
+       "gpio120"
+};
+static const char * const cci_i2c0_groups[] = {
+       "gpio19", "gpio20"
+};
+static const char * const cci_i2c1_groups[] = {
+       "gpio21", "gpio22"
+};
+static const char * const cci_timer0_groups[] = {
+       "gpio23"
+};
+static const char * const cci_timer1_groups[] = {
+       "gpio24"
+};
+static const char * const cci_timer2_groups[] = {
+       "gpio25"
+};
+static const char * const cci_timer3_groups[] = {
+       "gpio26"
+};
+static const char * const cci_timer4_groups[] = {
+       "gpio119"
+};
+static const char * const edp_hpd_groups[] = {
+       "gpio103"
+};
+static const char * const gcc_gp1_groups[] = {
+       "gpio37"
+};
+static const char * const gcc_gp2_groups[] = {
+       "gpio38"
+};
+static const char * const gcc_gp3_groups[] = {
+       "gpio86"
+};
+static const char * const gcc_obt_groups[] = {
+       "gpio127"
+};
+static const char * const gcc_vtt_groups[] = {
+       "gpio126"
+};
+static const char * const gp_mn_groups[] = {
+       "gpio29"
+};
+static const char * const gp_pdm0_groups[] = {
+       "gpio48", "gpio83"
+};
+static const char * const gp_pdm1_groups[] = {
+       "gpio84", "gpio101"
+};
+static const char * const gp_pdm2_groups[] = {
+       "gpio85", "gpio110"
+};
+static const char * const gp0_clk_groups[] = {
+       "gpio25"
+};
+static const char * const gp1_clk_groups[] = {
+       "gpio26"
+};
+static const char * const hdmi_cec_groups[] = {
+       "gpio31"
+};
+static const char * const hdmi_ddc_groups[] = {
+       "gpio32", "gpio33"
+};
+static const char * const hdmi_dtest_groups[] = {
+       "gpio123"
+};
+static const char * const hdmi_hpd_groups[] = {
+       "gpio34"
+};
+static const char * const hdmi_rcv_groups[] = {
+       "gpio125"
+};
+static const char * const hsic_groups[] = {
+       "gpio134", "gpio135"
+};
+static const char * const ldo_en_groups[] = {
+       "gpio124"
+};
+static const char * const ldo_update_groups[] = {
+       "gpio125"
+};
+static const char * const mdp_vsync_groups[] = {
+       "gpio12", "gpio13", "gpio14"
+};
+static const char * const pci_e0_groups[] = {
+       "gpio68", "gpio70"
+};
+static const char * const pci_e0_n_groups[] = {
+       "gpio68", "gpio70"
+};
+static const char * const pci_e0_rst_groups[] = {
+       "gpio70"
+};
+static const char * const pci_e1_groups[] = {
+       "gpio140"
+};
+static const char * const pci_e1_rst_groups[] = {
+       "gpio140"
+};
+static const char * const pci_e1_rst_n_groups[] = {
+       "gpio140"
+};
+static const char * const pci_e1_clkreq_n_groups[] = {
+       "gpio141"
+};
+static const char * const pri_mi2s_groups[] = {
+       "gpio76", "gpio77", "gpio78", "gpio79", "gpio80"
+};
+static const char * const qua_mi2s_groups[] = {
+       "gpio91", "gpio92", "gpio93", "gpio94", "gpio95", "gpio96", "gpio97"
+};
+static const char * const sata_act_groups[] = {
+       "gpio129"
+};
+static const char * const sata_devsleep_groups[] = {
+       "gpio119"
+};
+static const char * const sata_devsleep_n_groups[] = {
+       "gpio119"
+};
+static const char * const sd_write_groups[] = {
+       "gpio75"
+};
+static const char * const sdc_emmc_mode_groups[] = {
+       "gpio146"
+};
+static const char * const sdc3_groups[] = {
+       "gpio67", "gpio68", "gpio69", "gpio70", "gpio71", "gpio72"
+};
+static const char * const sdc4_groups[] = {
+       "gpio82", "gpio83", "gpio84", "gpio85", "gpio86",
+       "gpio91", "gpio95", "gpio96", "gpio97", "gpio101"
+};
+static const char * const sec_mi2s_groups[] = {
+       "gpio81", "gpio82", "gpio83", "gpio84", "gpio85"
+};
+static const char * const slimbus_groups[] = {
+       "gpio98", "gpio99"
+};
+static const char * const spdif_tx_groups[] = {
+       "gpio124", "gpio136", "gpio142"
+};
+static const char * const spkr_i2s_groups[] = {
+       "gpio98", "gpio99", "gpio100"
+};
+static const char * const spkr_i2s_ws_groups[] = {
+       "gpio104"
+};
+static const char * const spss_geni_groups[] = {
+       "gpio8", "gpio9"
+};
+static const char * const ter_mi2s_groups[] = {
+       "gpio86", "gpio87", "gpio88", "gpio89", "gpio90"
+};
+static const char * const tsif1_groups[] = {
+       "gpio82", "gpio83", "gpio84", "gpio85", "gpio86"
+};
+static const char * const tsif2_groups[] = {
+       "gpio91", "gpio95", "gpio96", "gpio97", "gpio101"
+};
+static const char * const uim_groups[] = {
+       "gpio130", "gpio131", "gpio132", "gpio133"
+};
+static const char * const uim_batt_alarm_groups[] = {
+       "gpio102"
+};
+static const struct msm_function apq8084_functions[] = {
+       FUNCTION(adsp_ext),
+       FUNCTION(audio_ref),
+       FUNCTION(blsp_i2c1),
+       FUNCTION(blsp_i2c2),
+       FUNCTION(blsp_i2c3),
+       FUNCTION(blsp_i2c4),
+       FUNCTION(blsp_i2c5),
+       FUNCTION(blsp_i2c6),
+       FUNCTION(blsp_i2c7),
+       FUNCTION(blsp_i2c8),
+       FUNCTION(blsp_i2c9),
+       FUNCTION(blsp_i2c10),
+       FUNCTION(blsp_i2c11),
+       FUNCTION(blsp_i2c12),
+       FUNCTION(blsp_spi1),
+       FUNCTION(blsp_spi1_cs1),
+       FUNCTION(blsp_spi1_cs2),
+       FUNCTION(blsp_spi1_cs3),
+       FUNCTION(blsp_spi2),
+       FUNCTION(blsp_spi3),
+       FUNCTION(blsp_spi3_cs1),
+       FUNCTION(blsp_spi3_cs2),
+       FUNCTION(blsp_spi3_cs3),
+       FUNCTION(blsp_spi4),
+       FUNCTION(blsp_spi5),
+       FUNCTION(blsp_spi6),
+       FUNCTION(blsp_spi7),
+       FUNCTION(blsp_spi8),
+       FUNCTION(blsp_spi9),
+       FUNCTION(blsp_spi10),
+       FUNCTION(blsp_spi10_cs1),
+       FUNCTION(blsp_spi10_cs2),
+       FUNCTION(blsp_spi10_cs3),
+       FUNCTION(blsp_spi11),
+       FUNCTION(blsp_spi12),
+       FUNCTION(blsp_uart1),
+       FUNCTION(blsp_uart2),
+       FUNCTION(blsp_uart3),
+       FUNCTION(blsp_uart4),
+       FUNCTION(blsp_uart5),
+       FUNCTION(blsp_uart6),
+       FUNCTION(blsp_uart7),
+       FUNCTION(blsp_uart8),
+       FUNCTION(blsp_uart9),
+       FUNCTION(blsp_uart10),
+       FUNCTION(blsp_uart11),
+       FUNCTION(blsp_uart12),
+       FUNCTION(blsp_uim1),
+       FUNCTION(blsp_uim2),
+       FUNCTION(blsp_uim3),
+       FUNCTION(blsp_uim4),
+       FUNCTION(blsp_uim5),
+       FUNCTION(blsp_uim6),
+       FUNCTION(blsp_uim7),
+       FUNCTION(blsp_uim8),
+       FUNCTION(blsp_uim9),
+       FUNCTION(blsp_uim10),
+       FUNCTION(blsp_uim11),
+       FUNCTION(blsp_uim12),
+       FUNCTION(cam_mclk0),
+       FUNCTION(cam_mclk1),
+       FUNCTION(cam_mclk2),
+       FUNCTION(cam_mclk3),
+       FUNCTION(cci_async),
+       FUNCTION(cci_async_in0),
+       FUNCTION(cci_i2c0),
+       FUNCTION(cci_i2c1),
+       FUNCTION(cci_timer0),
+       FUNCTION(cci_timer1),
+       FUNCTION(cci_timer2),
+       FUNCTION(cci_timer3),
+       FUNCTION(cci_timer4),
+       FUNCTION(edp_hpd),
+       FUNCTION(gcc_gp1),
+       FUNCTION(gcc_gp2),
+       FUNCTION(gcc_gp3),
+       FUNCTION(gcc_obt),
+       FUNCTION(gcc_vtt),
+       FUNCTION(gp_mn),
+       FUNCTION(gp_pdm0),
+       FUNCTION(gp_pdm1),
+       FUNCTION(gp_pdm2),
+       FUNCTION(gp0_clk),
+       FUNCTION(gp1_clk),
+       FUNCTION(gpio),
+       FUNCTION(hdmi_cec),
+       FUNCTION(hdmi_ddc),
+       FUNCTION(hdmi_dtest),
+       FUNCTION(hdmi_hpd),
+       FUNCTION(hdmi_rcv),
+       FUNCTION(hsic),
+       FUNCTION(ldo_en),
+       FUNCTION(ldo_update),
+       FUNCTION(mdp_vsync),
+       FUNCTION(pci_e0),
+       FUNCTION(pci_e0_n),
+       FUNCTION(pci_e0_rst),
+       FUNCTION(pci_e1),
+       FUNCTION(pci_e1_rst),
+       FUNCTION(pci_e1_rst_n),
+       FUNCTION(pci_e1_clkreq_n),
+       FUNCTION(pri_mi2s),
+       FUNCTION(qua_mi2s),
+       FUNCTION(sata_act),
+       FUNCTION(sata_devsleep),
+       FUNCTION(sata_devsleep_n),
+       FUNCTION(sd_write),
+       FUNCTION(sdc_emmc_mode),
+       FUNCTION(sdc3),
+       FUNCTION(sdc4),
+       FUNCTION(sec_mi2s),
+       FUNCTION(slimbus),
+       FUNCTION(spdif_tx),
+       FUNCTION(spkr_i2s),
+       FUNCTION(spkr_i2s_ws),
+       FUNCTION(spss_geni),
+       FUNCTION(ter_mi2s),
+       FUNCTION(tsif1),
+       FUNCTION(tsif2),
+       FUNCTION(uim),
+       FUNCTION(uim_batt_alarm),
+};
+
+static const struct msm_pingroup apq8084_groups[] = {
+       PINGROUP(0,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA),
+       PINGROUP(1,   blsp_spi1, blsp_uart1, blsp_uim1, NA, NA, NA, NA),
+       PINGROUP(2,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA),
+       PINGROUP(3,   blsp_spi1, blsp_uart1, blsp_i2c1, NA, NA, NA, NA),
+       PINGROUP(4,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA),
+       PINGROUP(5,   blsp_spi2, blsp_uart2, blsp_uim2, NA, NA, NA, NA),
+       PINGROUP(6,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA),
+       PINGROUP(7,   blsp_spi2, blsp_uart2, blsp_i2c2, NA, NA, NA, NA),
+       PINGROUP(8,   blsp_spi3, blsp_uart3, blsp_uim3, spss_geni, NA, NA, NA),
+       PINGROUP(9,   blsp_spi3, blsp_uim3, blsp_uart3, spss_geni, NA, NA, NA),
+       PINGROUP(10,  blsp_spi3, blsp_uart3, blsp_i2c3, NA, NA, NA, NA),
+       PINGROUP(11,  blsp_spi3, blsp_uart3, blsp_i2c3, NA, NA, NA, NA),
+       PINGROUP(12,  mdp_vsync, NA, NA, NA, NA, NA, NA),
+       PINGROUP(13,  mdp_vsync, NA, NA, NA, NA, NA, NA),
+       PINGROUP(14,  mdp_vsync, NA, NA, NA, NA, NA, NA),
+       PINGROUP(15,  cam_mclk0, NA, NA, NA, NA, NA, NA),
+       PINGROUP(16,  cam_mclk1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(17,  cam_mclk2, NA, NA, NA, NA, NA, NA),
+       PINGROUP(18,  cam_mclk3, NA, NA, NA, NA, NA, NA),
+       PINGROUP(19,  cci_i2c0, NA, NA, NA, NA, NA, NA),
+       PINGROUP(20,  cci_i2c0, NA, NA, NA, NA, NA, NA),
+       PINGROUP(21,  cci_i2c1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(22,  cci_i2c1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(23,  cci_timer0, NA, NA, NA, NA, NA, NA),
+       PINGROUP(24,  cci_timer1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(25,  cci_timer2, gp0_clk, NA, NA, NA, NA, NA),
+       PINGROUP(26,  cci_timer3, cci_async, gp1_clk, NA, NA, NA, NA),
+       PINGROUP(27,  blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA, NA),
+       PINGROUP(28,  blsp_spi4, blsp_uart4, blsp_uim4, NA, NA, NA, NA),
+       PINGROUP(29,  blsp_spi4, blsp_uart4, blsp_i2c4, gp_mn, NA, NA, NA),
+       PINGROUP(30,  blsp_spi4, blsp_uart4, blsp_i2c4, NA, NA, NA, NA),
+       PINGROUP(31,  hdmi_cec, NA, NA, NA, NA, NA, NA),
+       PINGROUP(32,  hdmi_ddc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(33,  hdmi_ddc, NA, NA, NA, NA, NA, NA),
+       PINGROUP(34,  hdmi_hpd, NA, adsp_ext, NA, NA, NA, NA),
+       PINGROUP(35,  NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(36,  NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(37,  gcc_gp1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(38,  gcc_gp2, NA, NA, NA, NA, NA, NA),
+       PINGROUP(39,  blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA, NA),
+       PINGROUP(40,  blsp_spi5, blsp_uart5, blsp_uim5, NA, NA, NA, NA),
+       PINGROUP(41,  blsp_spi5, blsp_uart5, blsp_i2c5, NA, NA, NA, NA),
+       PINGROUP(42,  blsp_spi5, blsp_uart5, blsp_i2c5, NA, NA, NA, NA),
+       PINGROUP(43,  blsp_spi6, blsp_uart6, blsp_uim6, NA, NA, NA, NA),
+       PINGROUP(44,  blsp_spi6, blsp_uart6, blsp_uim6, NA, NA, NA, NA),
+       PINGROUP(45,  blsp_spi6, blsp_uart6, blsp_i2c6, NA, NA, NA, NA),
+       PINGROUP(46,  blsp_spi6, blsp_uart6, blsp_i2c6, NA, NA, NA, NA),
+       PINGROUP(47,  blsp_spi12, blsp_uart12, blsp_uim12, NA, NA, NA, NA),
+       PINGROUP(48,  blsp_spi12, blsp_uart12, blsp_uim12, gp_pdm0, NA, NA, NA),
+       PINGROUP(49,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA),
+       PINGROUP(50,  blsp_spi12, blsp_uart12, blsp_i2c12, NA, NA, NA, NA),
+       PINGROUP(51,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA),
+       PINGROUP(52,  blsp_spi8, blsp_uart8, blsp_uim8, NA, NA, NA, NA),
+       PINGROUP(53,  blsp_spi8, blsp_uart8, blsp_i2c8, NA, NA, NA, NA),
+       PINGROUP(54,  blsp_spi8, blsp_uart8, blsp_i2c8, NA, NA, NA, NA),
+       PINGROUP(55,  blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA, NA),
+       PINGROUP(56,  blsp_spi9, blsp_uart9, blsp_uim9, NA, NA, NA, NA),
+       PINGROUP(57,  blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA, NA),
+       PINGROUP(58,  blsp_spi9, blsp_uart9, blsp_i2c9, NA, NA, NA, NA),
+       PINGROUP(59,  blsp_spi10, blsp_uart10, blsp_uim10, NA, NA, NA, NA),
+       PINGROUP(60,  blsp_spi10, blsp_uart10, blsp_uim10, NA, NA, NA, NA),
+       PINGROUP(61,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA),
+       PINGROUP(62,  blsp_spi10, blsp_uart10, blsp_i2c10, NA, NA, NA, NA),
+       PINGROUP(63,  blsp_spi11, blsp_uart11, blsp_uim11, NA, NA, NA, NA),
+       PINGROUP(64,  blsp_spi11, blsp_uart11, blsp_uim11, NA, NA, NA, NA),
+       PINGROUP(65,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA),
+       PINGROUP(66,  blsp_spi11, blsp_uart11, blsp_i2c11, NA, NA, NA, NA),
+       PINGROUP(67,  sdc3, blsp_spi3_cs1, NA, NA, NA, NA, NA),
+       PINGROUP(68,  sdc3, pci_e0, NA, NA, NA, NA, NA),
+       PINGROUP(69,  sdc3, NA, NA, NA, NA, NA, NA),
+       PINGROUP(70,  sdc3, pci_e0_n, pci_e0, NA, NA, NA, NA),
+       PINGROUP(71,  sdc3, blsp_spi3_cs2, NA, NA, NA, NA, NA),
+       PINGROUP(72,  sdc3, blsp_spi3_cs3, NA, NA, NA, NA, NA),
+       PINGROUP(73,  NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(74,  NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(75,  sd_write, NA, NA, NA, NA, NA, NA),
+       PINGROUP(76,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(77,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(78,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(79,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(80,  pri_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(81,  sec_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(82,  sec_mi2s, sdc4, tsif1, NA, NA, NA, NA),
+       PINGROUP(83,  sec_mi2s, sdc4, tsif1, NA, NA, NA, gp_pdm0),
+       PINGROUP(84,  sec_mi2s, sdc4, tsif1, NA, NA, NA, gp_pdm1),
+       PINGROUP(85,  sec_mi2s, sdc4, tsif1, NA, gp_pdm2, NA, NA),
+       PINGROUP(86,  ter_mi2s, sdc4, tsif1, NA, NA, NA, gcc_gp3),
+       PINGROUP(87,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(88,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(89,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(90,  ter_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(91,  qua_mi2s, sdc4, tsif2, NA, NA, NA, NA),
+       PINGROUP(92,  qua_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(93,  qua_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(94,  qua_mi2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(95,  qua_mi2s, sdc4, tsif2, NA, NA, NA, gcc_gp1),
+       PINGROUP(96,  qua_mi2s, sdc4, tsif2, NA, NA, NA, gcc_gp2),
+       PINGROUP(97,  qua_mi2s, sdc4, tsif2, NA, gcc_gp3, NA, NA),
+       PINGROUP(98,  slimbus, spkr_i2s, NA, NA, NA, NA, NA),
+       PINGROUP(99,  slimbus, spkr_i2s, NA, NA, NA, NA, NA),
+       PINGROUP(100, audio_ref, spkr_i2s, NA, NA, NA, NA, NA),
+       PINGROUP(101, sdc4, tsif2, gp_pdm1, NA, NA, NA, NA),
+       PINGROUP(102, uim_batt_alarm, NA, NA, NA, NA, NA, NA),
+       PINGROUP(103, edp_hpd, NA, NA, NA, NA, NA, NA),
+       PINGROUP(104, spkr_i2s, NA, NA, NA, NA, NA, NA),
+       PINGROUP(105, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(106, blsp_spi10_cs1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(107, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(108, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(109, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(110, gp_pdm2, NA, NA, NA, NA, NA, NA),
+       PINGROUP(111, blsp_spi10_cs2, NA, NA, NA, NA, NA, NA),
+       PINGROUP(112, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(113, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(114, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(115, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(116, blsp_spi1_cs1, NA, NA, NA, NA, NA, NA),
+       PINGROUP(117, blsp_spi1_cs2, NA, NA, NA, NA, NA, NA),
+       PINGROUP(118, blsp_spi1_cs3, NA, NA, NA, NA, NA, NA),
+       PINGROUP(119, cci_timer4, cci_async, sata_devsleep, sata_devsleep_n, NA, NA, NA),
+       PINGROUP(120, cci_async, NA, NA, NA, NA, NA, NA),
+       PINGROUP(121, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(122, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(123, hdmi_dtest, NA, NA, NA, NA, NA, NA),
+       PINGROUP(124, spdif_tx, ldo_en, NA, NA, NA, NA, NA),
+       PINGROUP(125, ldo_update, hdmi_rcv, NA, NA, NA, NA, NA),
+       PINGROUP(126, gcc_vtt, NA, NA, NA, NA, NA, NA),
+       PINGROUP(127, gcc_obt, NA, NA, NA, NA, NA, NA),
+       PINGROUP(128, blsp_spi10_cs3, NA, NA, NA, NA, NA, NA),
+       PINGROUP(129, sata_act, NA, NA, NA, NA, NA, NA),
+       PINGROUP(130, uim, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA),
+       PINGROUP(131, uim, blsp_spi7, blsp_uart7, blsp_uim7, NA, NA, NA),
+       PINGROUP(132, uim, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA),
+       PINGROUP(133, uim, blsp_spi7, blsp_uart7, blsp_i2c7, NA, NA, NA),
+       PINGROUP(134, hsic, NA, NA, NA, NA, NA, NA),
+       PINGROUP(135, hsic, NA, NA, NA, NA, NA, NA),
+       PINGROUP(136, spdif_tx, NA, NA, NA, NA, NA, NA),
+       PINGROUP(137, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(138, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(139, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(140, pci_e1_rst_n, pci_e1_rst, NA, NA, NA, NA, NA),
+       PINGROUP(141, pci_e1_clkreq_n, NA, NA, NA, NA, NA, NA),
+       PINGROUP(142, spdif_tx, NA, NA, NA, NA, NA, NA),
+       PINGROUP(143, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(144, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(145, NA, NA, NA, NA, NA, NA, NA),
+       PINGROUP(146, sdc_emmc_mode, NA, NA, NA, NA, NA, NA),
+
+       SDC_PINGROUP(sdc1_clk, 0x2044, 13, 6),
+       SDC_PINGROUP(sdc1_cmd, 0x2044, 11, 3),
+       SDC_PINGROUP(sdc1_data, 0x2044, 9, 0),
+       SDC_PINGROUP(sdc2_clk, 0x2048, 14, 6),
+       SDC_PINGROUP(sdc2_cmd, 0x2048, 11, 3),
+       SDC_PINGROUP(sdc2_data, 0x2048, 9, 0),
+};
+
+#define NUM_GPIO_PINGROUPS 147
+
+static const struct msm_pinctrl_soc_data apq8084_pinctrl = {
+       .pins = apq8084_pins,
+       .npins = ARRAY_SIZE(apq8084_pins),
+       .functions = apq8084_functions,
+       .nfunctions = ARRAY_SIZE(apq8084_functions),
+       .groups = apq8084_groups,
+       .ngroups = ARRAY_SIZE(apq8084_groups),
+       .ngpios = NUM_GPIO_PINGROUPS,
+};
+
+static int apq8084_pinctrl_probe(struct platform_device *pdev)
+{
+       return msm_pinctrl_probe(pdev, &apq8084_pinctrl);
+}
+
+static const struct of_device_id apq8084_pinctrl_of_match[] = {
+       { .compatible = "qcom,apq8084-pinctrl", },
+       { },
+};
+
+static struct platform_driver apq8084_pinctrl_driver = {
+       .driver = {
+               .name = "apq8084-pinctrl",
+               .owner = THIS_MODULE,
+               .of_match_table = apq8084_pinctrl_of_match,
+       },
+       .probe = apq8084_pinctrl_probe,
+       .remove = msm_pinctrl_remove,
+};
+
+static int __init apq8084_pinctrl_init(void)
+{
+       return platform_driver_register(&apq8084_pinctrl_driver);
+}
+arch_initcall(apq8084_pinctrl_init);
+
+static void __exit apq8084_pinctrl_exit(void)
+{
+       platform_driver_unregister(&apq8084_pinctrl_driver);
+}
+module_exit(apq8084_pinctrl_exit);
+
+MODULE_DESCRIPTION("Qualcomm APQ8084 pinctrl driver");
+MODULE_LICENSE("GPL v2");
+MODULE_DEVICE_TABLE(of, apq8084_pinctrl_of_match);
index 767cf11..81f49a9 100644 (file)
@@ -211,6 +211,7 @@ static const unsigned int sdc3_data_pins[] = { 71 };
                .intr_status_bit = 0,                   \
                .intr_ack_high = 1,                     \
                .intr_target_bit = 0,                   \
+               .intr_target_kpss_val = 4,              \
                .intr_raw_status_bit = 3,               \
                .intr_polarity_bit = 1,                 \
                .intr_detection_bit = 2,                \
@@ -236,6 +237,7 @@ static const unsigned int sdc3_data_pins[] = { 71 };
                .intr_enable_bit = -1,                  \
                .intr_status_bit = -1,                  \
                .intr_target_bit = -1,                  \
+               .intr_target_kpss_val = -1,             \
                .intr_raw_status_bit = -1,              \
                .intr_polarity_bit = -1,                \
                .intr_detection_bit = -1,               \
index 2738108..d30dddd 100644 (file)
@@ -12,6 +12,7 @@
  * GNU General Public License for more details.
  */
 
+#include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/io.h>
 #include <linux/module.h>
@@ -26,6 +27,7 @@
 #include <linux/gpio.h>
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
+#include <linux/reboot.h>
 
 #include "../core.h"
 #include "../pinconf.h"
 #include "../pinctrl-utils.h"
 
 #define MAX_NR_GPIO 300
+#define PS_HOLD_OFFSET 0x820
 
 /**
  * struct msm_pinctrl - state for a pinctrl-msm device
  * @dev:            device handle.
  * @pctrl:          pinctrl handle.
  * @chip:           gpiochip handle.
+ * @restart_nb:     restart notifier block.
  * @irq:            parent irq for the TLMM irq_chip.
  * @lock:           Spinlock to protect register resources as well
  *                  as msm_pinctrl data structures.
@@ -52,6 +56,7 @@ struct msm_pinctrl {
        struct device *dev;
        struct pinctrl_dev *pctrl;
        struct gpio_chip chip;
+       struct notifier_block restart_nb;
        int irq;
 
        spinlock_t lock;
@@ -130,9 +135,9 @@ static int msm_get_function_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int msm_pinmux_enable(struct pinctrl_dev *pctldev,
-                            unsigned function,
-                            unsigned group)
+static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
+                             unsigned function,
+                             unsigned group)
 {
        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
        const struct msm_pingroup *g;
@@ -166,7 +171,7 @@ static const struct pinmux_ops msm_pinmux_ops = {
        .get_functions_count    = msm_get_functions_count,
        .get_function_name      = msm_get_function_name,
        .get_function_groups    = msm_get_function_groups,
-       .enable                 = msm_pinmux_enable,
+       .set_mux                = msm_pinmux_set_mux,
 };
 
 static int msm_config_reg(struct msm_pinctrl *pctrl,
@@ -649,8 +654,6 @@ static void msm_gpio_irq_ack(struct irq_data *d)
        spin_unlock_irqrestore(&pctrl->lock, flags);
 }
 
-#define INTR_TARGET_PROC_APPS    4
-
 static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 {
        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
@@ -674,7 +677,7 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
        /* Route interrupts to application cpu */
        val = readl(pctrl->regs + g->intr_target_reg);
        val &= ~(7 << g->intr_target_bit);
-       val |= INTR_TARGET_PROC_APPS << g->intr_target_bit;
+       val |= g->intr_target_kpss_val << g->intr_target_bit;
        writel(val, pctrl->regs + g->intr_target_reg);
 
        /* Update configuration for gpio.
@@ -829,6 +832,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
        ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio);
        if (ret) {
                dev_err(pctrl->dev, "Failed to add pin range\n");
+               gpiochip_remove(&pctrl->chip);
                return ret;
        }
 
@@ -839,6 +843,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
                                   IRQ_TYPE_NONE);
        if (ret) {
                dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n");
+               gpiochip_remove(&pctrl->chip);
                return -ENOSYS;
        }
 
@@ -848,6 +853,32 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
        return 0;
 }
 
+static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action,
+                              void *data)
+{
+       struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb);
+
+       writel(0, pctrl->regs + PS_HOLD_OFFSET);
+       mdelay(1000);
+       return NOTIFY_DONE;
+}
+
+static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
+{
+       int i = 0;
+       const struct msm_function *func = pctrl->soc->functions;
+
+       for (; i <= pctrl->soc->nfunctions; i++)
+               if (!strcmp(func[i].name, "ps_hold")) {
+                       pctrl->restart_nb.notifier_call = msm_ps_hold_restart;
+                       pctrl->restart_nb.priority = 128;
+                       if (register_restart_handler(&pctrl->restart_nb))
+                               dev_err(pctrl->dev,
+                                       "failed to setup restart handler.\n");
+                       break;
+               }
+}
+
 int msm_pinctrl_probe(struct platform_device *pdev,
                      const struct msm_pinctrl_soc_data *soc_data)
 {
@@ -871,6 +902,8 @@ int msm_pinctrl_probe(struct platform_device *pdev,
        if (IS_ERR(pctrl->regs))
                return PTR_ERR(pctrl->regs);
 
+       msm_pinctrl_setup_pm_reset(pctrl);
+
        pctrl->irq = platform_get_irq(pdev, 0);
        if (pctrl->irq < 0) {
                dev_err(&pdev->dev, "No interrupt defined for msmgpio\n");
@@ -913,6 +946,8 @@ int msm_pinctrl_remove(struct platform_device *pdev)
 
        pinctrl_unregister(pctrl->pctrl);
 
+       unregister_restart_handler(&pctrl->restart_nb);
+
        return 0;
 }
 EXPORT_SYMBOL(msm_pinctrl_remove);
index 7b2a227..b952c4b 100644 (file)
@@ -53,6 +53,8 @@ struct msm_function {
  * @intr_status_bit:      Offset in @intr_status_reg for reading and acking the interrupt
  *                        status.
  * @intr_target_bit:      Offset in @intr_target_reg for configuring the interrupt routing.
+ * @intr_target_kpss_val: Value in @intr_target_bit for specifying that the interrupt from
+ *                        this gpio should get routed to the KPSS processor.
  * @intr_raw_status_bit:  Offset in @intr_cfg_reg for the raw status bit.
  * @intr_polarity_bit:    Offset in @intr_cfg_reg for specifying polarity of the interrupt.
  * @intr_detection_bit:   Offset in @intr_cfg_reg for specifying interrupt type.
@@ -88,6 +90,7 @@ struct msm_pingroup {
        unsigned intr_ack_high:1;
 
        unsigned intr_target_bit:5;
+       unsigned intr_target_kpss_val:5;
        unsigned intr_raw_status_bit:5;
        unsigned intr_polarity_bit:5;
        unsigned intr_detection_bit:5;
index 3504703..2ab21ce 100644 (file)
@@ -384,6 +384,7 @@ static const unsigned int sdc3_data_pins[] = { 157 };
                .intr_status_bit = 0,                   \
                .intr_ack_high = 1,                     \
                .intr_target_bit = 0,                   \
+               .intr_target_kpss_val = 4,              \
                .intr_raw_status_bit = 3,               \
                .intr_polarity_bit = 1,                 \
                .intr_detection_bit = 2,                \
@@ -409,6 +410,7 @@ static const unsigned int sdc3_data_pins[] = { 157 };
                .intr_enable_bit = -1,                  \
                .intr_status_bit = -1,                  \
                .intr_target_bit = -1,                  \
+               .intr_target_kpss_val = -1,             \
                .intr_raw_status_bit = -1,              \
                .intr_polarity_bit = -1,                \
                .intr_detection_bit = -1,               \
index 8c97201..3c85838 100644 (file)
@@ -366,6 +366,7 @@ static const unsigned int sdc2_data_pins[] = { 151 };
                .intr_enable_bit = 0,                   \
                .intr_status_bit = 0,                   \
                .intr_target_bit = 5,                   \
+               .intr_target_kpss_val = 4,              \
                .intr_raw_status_bit = 4,               \
                .intr_polarity_bit = 1,                 \
                .intr_detection_bit = 2,                \
@@ -391,6 +392,7 @@ static const unsigned int sdc2_data_pins[] = { 151 };
                .intr_enable_bit = -1,                  \
                .intr_status_bit = -1,                  \
                .intr_target_bit = -1,                  \
+               .intr_target_kpss_val = -1,             \
                .intr_raw_status_bit = -1,              \
                .intr_polarity_bit = -1,                \
                .intr_detection_bit = -1,               \
index 603da2f..b995ec2 100644 (file)
@@ -364,8 +364,9 @@ static void exynos5440_pinmux_setup(struct pinctrl_dev *pctldev, unsigned select
 }
 
 /* enable a specified pinmux by writing to registers */
-static int exynos5440_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                                       unsigned group)
+static int exynos5440_pinmux_set_mux(struct pinctrl_dev *pctldev,
+                                    unsigned selector,
+                                    unsigned group)
 {
        exynos5440_pinmux_setup(pctldev, selector, group, true);
        return 0;
@@ -387,7 +388,7 @@ static const struct pinmux_ops exynos5440_pinmux_ops = {
        .get_functions_count    = exynos5440_get_functions_count,
        .get_function_name      = exynos5440_pinmux_get_fname,
        .get_function_groups    = exynos5440_pinmux_get_groups,
-       .enable                 = exynos5440_pinmux_enable,
+       .set_mux                = exynos5440_pinmux_set_mux,
        .gpio_set_direction     = exynos5440_pinmux_gpio_set_direction,
 };
 
index b07406d..4a47691 100644 (file)
@@ -401,8 +401,9 @@ static void samsung_pinmux_setup(struct pinctrl_dev *pctldev, unsigned selector,
 }
 
 /* enable a specified pinmux by writing to registers */
-static int samsung_pinmux_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                                       unsigned group)
+static int samsung_pinmux_set_mux(struct pinctrl_dev *pctldev,
+                                 unsigned selector,
+                                 unsigned group)
 {
        samsung_pinmux_setup(pctldev, selector, group, true);
        return 0;
@@ -413,7 +414,7 @@ static const struct pinmux_ops samsung_pinmux_ops = {
        .get_functions_count    = samsung_get_functions_count,
        .get_function_name      = samsung_pinmux_get_fname,
        .get_function_groups    = samsung_pinmux_get_groups,
-       .enable                 = samsung_pinmux_enable,
+       .set_mux                = samsung_pinmux_set_mux,
 };
 
 /* set or get the pin config settings for a specified pin */
index b9b464d..6572c23 100644 (file)
@@ -542,7 +542,7 @@ static int sh_pfc_probe(struct platform_device *pdev)
         */
        ret = sh_pfc_register_pinctrl(pfc);
        if (unlikely(ret != 0))
-               goto error;
+               return ret;
 
 #ifdef CONFIG_GPIO_SH_PFC
        /*
@@ -564,11 +564,6 @@ static int sh_pfc_probe(struct platform_device *pdev)
        dev_info(pfc->dev, "%s support registered\n", info->name);
 
        return 0;
-
-error:
-       if (info->ops && info->ops->exit)
-               info->ops->exit(pfc);
-       return ret;
 }
 
 static int sh_pfc_remove(struct platform_device *pdev)
@@ -580,9 +575,6 @@ static int sh_pfc_remove(struct platform_device *pdev)
 #endif
        sh_pfc_unregister_pinctrl(pfc);
 
-       if (pfc->info->ops && pfc->info->ops->exit)
-               pfc->info->ops->exit(pfc);
-
        return 0;
 }
 
index b7b0e6c..3daaa52 100644 (file)
@@ -33,7 +33,6 @@ struct sh_pfc_pin_range {
 struct sh_pfc {
        struct device *dev;
        const struct sh_pfc_soc_info *info;
-       void *soc_data;
        spinlock_t lock;
 
        unsigned int num_windows;
index ce9fb7a..280a56f 100644 (file)
@@ -2717,14 +2717,14 @@ static void r8a73a4_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
        iowrite8(value, addr);
 }
 
-static const struct sh_pfc_soc_operations r8a73a4_pinmux_ops = {
+static const struct sh_pfc_soc_operations r8a73a4_pfc_ops = {
        .get_bias = r8a73a4_pinmux_get_bias,
        .set_bias = r8a73a4_pinmux_set_bias,
 };
 
 const struct sh_pfc_soc_info r8a73a4_pinmux_info = {
        .name           = "r8a73a4_pfc",
-       .ops            = &r8a73a4_pinmux_ops,
+       .ops            = &r8a73a4_pfc_ops,
 
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
index e4c1ef4..b486e9d 100644 (file)
@@ -3752,14 +3752,14 @@ static void r8a7740_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
        iowrite8(value, addr);
 }
 
-static const struct sh_pfc_soc_operations r8a7740_pinmux_ops = {
+static const struct sh_pfc_soc_operations r8a7740_pfc_ops = {
        .get_bias = r8a7740_pinmux_get_bias,
        .set_bias = r8a7740_pinmux_set_bias,
 };
 
 const struct sh_pfc_soc_info r8a7740_pinmux_info = {
        .name           = "r8a7740_pfc",
-       .ops            = &r8a7740_pinmux_ops,
+       .ops            = &r8a7740_pfc_ops,
 
        .input          = { PINMUX_INPUT_BEGIN,
                            PINMUX_INPUT_END },
index d9158b3..8211f66 100644 (file)
@@ -2614,14 +2614,14 @@ static void sh7372_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
        iowrite8(value, addr);
 }
 
-static const struct sh_pfc_soc_operations sh7372_pinmux_ops = {
+static const struct sh_pfc_soc_operations sh7372_pfc_ops = {
        .get_bias = sh7372_pinmux_get_bias,
        .set_bias = sh7372_pinmux_set_bias,
 };
 
 const struct sh_pfc_soc_info sh7372_pinmux_info = {
        .name = "sh7372_pfc",
-       .ops = &sh7372_pinmux_ops,
+       .ops = &sh7372_pfc_ops,
 
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
index 0bd8f44..d2efbfb 100644 (file)
@@ -3824,39 +3824,28 @@ static void sh73a0_pinmux_set_bias(struct sh_pfc *pfc, unsigned int pin,
  * SoC information
  */
 
-struct sh73a0_pinmux_data {
-       struct regulator_dev *vccq_mc0;
-};
-
 static int sh73a0_pinmux_soc_init(struct sh_pfc *pfc)
 {
-       struct sh73a0_pinmux_data *data;
        struct regulator_config cfg = { };
+       struct regulator_dev *vccq;
        int ret;
 
-       data = devm_kzalloc(pfc->dev, sizeof(*data), GFP_KERNEL);
-       if (data == NULL)
-               return -ENOMEM;
-
        cfg.dev = pfc->dev;
        cfg.init_data = &sh73a0_vccq_mc0_init_data;
        cfg.driver_data = pfc;
 
-       data->vccq_mc0 = devm_regulator_register(pfc->dev,
-                                                &sh73a0_vccq_mc0_desc, &cfg);
-       if (IS_ERR(data->vccq_mc0)) {
-               ret = PTR_ERR(data->vccq_mc0);
+       vccq = devm_regulator_register(pfc->dev, &sh73a0_vccq_mc0_desc, &cfg);
+       if (IS_ERR(vccq)) {
+               ret = PTR_ERR(vccq);
                dev_err(pfc->dev, "Failed to register VCCQ MC0 regulator: %d\n",
                        ret);
                return ret;
        }
 
-       pfc->soc_data = data;
-
        return 0;
 }
 
-static const struct sh_pfc_soc_operations sh73a0_pinmux_ops = {
+static const struct sh_pfc_soc_operations sh73a0_pfc_ops = {
        .init = sh73a0_pinmux_soc_init,
        .get_bias = sh73a0_pinmux_get_bias,
        .set_bias = sh73a0_pinmux_set_bias,
@@ -3864,7 +3853,7 @@ static const struct sh_pfc_soc_operations sh73a0_pinmux_ops = {
 
 const struct sh_pfc_soc_info sh73a0_pinmux_info = {
        .name = "sh73a0_pfc",
-       .ops = &sh73a0_pinmux_ops,
+       .ops = &sh73a0_pfc_ops,
 
        .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
        .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
index 11db3ee..910deae 100644 (file)
@@ -312,8 +312,8 @@ static int sh_pfc_get_function_groups(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int sh_pfc_func_enable(struct pinctrl_dev *pctldev, unsigned selector,
-                             unsigned group)
+static int sh_pfc_func_set_mux(struct pinctrl_dev *pctldev, unsigned selector,
+                              unsigned group)
 {
        struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
        struct sh_pfc *pfc = pmx->pfc;
@@ -442,7 +442,7 @@ static const struct pinmux_ops sh_pfc_pinmux_ops = {
        .get_functions_count    = sh_pfc_get_functions_count,
        .get_function_name      = sh_pfc_get_function_name,
        .get_function_groups    = sh_pfc_get_function_groups,
-       .enable                 = sh_pfc_func_enable,
+       .set_mux                = sh_pfc_func_set_mux,
        .gpio_request_enable    = sh_pfc_gpio_request_enable,
        .gpio_disable_free      = sh_pfc_gpio_disable_free,
        .gpio_set_direction     = sh_pfc_gpio_set_direction,
index d482c40..5b72831 100644 (file)
@@ -116,7 +116,6 @@ struct sh_pfc;
 
 struct sh_pfc_soc_operations {
        int (*init)(struct sh_pfc *pfc);
-       void (*exit)(struct sh_pfc *pfc);
        unsigned int (*get_bias)(struct sh_pfc *pfc, unsigned int pin);
        void (*set_bias)(struct sh_pfc *pfc, unsigned int pin,
                         unsigned int bias);
index c4dd3d5..45f8391 100644 (file)
@@ -134,8 +134,9 @@ static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = {
                .mask = BIT(30) | BIT(31),
        }, {
                .group = 2,
-               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
-                       BIT(12) | BIT(13) | BIT(15) | BIT(16) | BIT(17) | BIT(18) | BIT(19) |
+               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) |
+                       BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(15) |
+                       BIT(16) | BIT(17) | BIT(18) | BIT(19) |
                        BIT(20) | BIT(21) | BIT(22) | BIT(31),
        },
 };
@@ -148,14 +149,15 @@ static const struct sirfsoc_padmux lcd_16bits_padmux = {
        .funcval = 0,
 };
 
-static const unsigned lcd_16bits_pins[] = { 62, 63, 65, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83,
-       84, 85, 86, 95 };
+static const unsigned lcd_16bits_pins[] = { 62, 63, 65, 70, 71, 72, 73, 74, 75,
+       76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 95 };
 
 static const struct sirfsoc_muxmask lcd_18bits_muxmask[] = {
        {
                .group = 2,
-               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
-                       BIT(12) | BIT(13) | BIT(15) | BIT(16) | BIT(17) | BIT(18) | BIT(19) |
+               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) |
+                       BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(15) |
+                       BIT(16) | BIT(17) | BIT(18) | BIT(19) |
                        BIT(20) | BIT(21) | BIT(22) | BIT(31),
        }, {
                .group = 1,
@@ -174,21 +176,23 @@ static const struct sirfsoc_padmux lcd_18bits_padmux = {
        .funcval = 0,
 };
 
-static const unsigned lcd_18bits_pins[] = { 16, 17, 62, 63, 65, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83,
-       84, 85, 86, 95 };
+static const unsigned lcd_18bits_pins[] = { 16, 17, 62, 63, 65, 70, 71, 72, 73,
+       74, 75, 76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 95 };
 
 static const struct sirfsoc_muxmask lcd_24bits_muxmask[] = {
        {
                .group = 2,
-               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
-                       BIT(12) | BIT(13) | BIT(15) | BIT(16) | BIT(17) | BIT(18) | BIT(19) |
+               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) |
+                       BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(15) |
+                       BIT(16) | BIT(17) | BIT(18) | BIT(19) |
                        BIT(20) | BIT(21) | BIT(22) | BIT(31),
        }, {
                .group = 1,
                .mask = BIT(30) | BIT(31),
        }, {
                .group = 0,
-               .mask = BIT(16) | BIT(17) | BIT(18) | BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23),
+               .mask = BIT(16) | BIT(17) | BIT(18) | BIT(19) | BIT(20) |
+                       BIT(21) | BIT(22) | BIT(23),
        },
 };
 
@@ -200,14 +204,16 @@ static const struct sirfsoc_padmux lcd_24bits_padmux = {
        .funcval = 0,
 };
 
-static const unsigned lcd_24bits_pins[] = { 16, 17, 18, 19, 20, 21, 22, 23, 62, 63, 65, 70, 71, 72, 73, 74, 75, 76, 77, 79,
-       80, 81, 82, 83, 84, 85, 86, 95};
+static const unsigned lcd_24bits_pins[] = { 16, 17, 18, 19, 20, 21, 22, 23, 62,
+       63, 65, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83, 84,
+       85, 86, 95};
 
 static const struct sirfsoc_muxmask lcdrom_muxmask[] = {
        {
                .group = 2,
-               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
-                       BIT(12) | BIT(13) | BIT(15) | BIT(16) | BIT(17) | BIT(18) | BIT(19) |
+               .mask = BIT(1) | BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) |
+                       BIT(11) | BIT(12) | BIT(13) | BIT(15) | BIT(16) |
+                       BIT(17) | BIT(18) | BIT(19) |
                        BIT(20) | BIT(21) | BIT(22) | BIT(31),
        }, {
                .group = 1,
@@ -226,8 +232,8 @@ static const struct sirfsoc_padmux lcdrom_padmux = {
        .funcval = BIT(4),
 };
 
-static const unsigned lcdrom_pins[] = { 8, 62, 63, 65, 70, 71, 72, 73, 74, 75, 76, 77, 79, 80, 81, 82, 83,
-       84, 85, 86, 95};
+static const unsigned lcdrom_pins[] = { 8, 62, 63, 65, 70, 71, 72, 73, 74, 75,
+       76, 77, 79, 80, 81, 82, 83, 84, 85, 86, 95};
 
 static const struct sirfsoc_muxmask uart0_muxmask[] = {
        {
@@ -371,11 +377,42 @@ static const struct sirfsoc_padmux cko1_padmux = {
 
 static const unsigned cko1_pins[] = { 42 };
 
-static const struct sirfsoc_muxmask i2s_muxmask[] = {
+static const struct sirfsoc_muxmask i2s_mclk_muxmask[] = {
        {
                .group = 1,
                .mask = BIT(10),
-       }, {
+       },
+};
+
+static const struct sirfsoc_padmux i2s_mclk_padmux = {
+       .muxmask_counts = ARRAY_SIZE(i2s_mclk_muxmask),
+       .muxmask = i2s_mclk_muxmask,
+       .ctrlreg = SIRFSOC_RSC_PIN_MUX,
+       .funcmask = BIT(3),
+       .funcval = BIT(3),
+};
+
+static const unsigned i2s_mclk_pins[] = { 42 };
+
+static const struct sirfsoc_muxmask i2s_ext_clk_input_muxmask[] = {
+       {
+               .group = 1,
+               .mask = BIT(19),
+       },
+};
+
+static const struct sirfsoc_padmux i2s_ext_clk_input_padmux = {
+       .muxmask_counts = ARRAY_SIZE(i2s_ext_clk_input_muxmask),
+       .muxmask = i2s_ext_clk_input_muxmask,
+       .ctrlreg = SIRFSOC_RSC_PIN_MUX,
+       .funcmask = BIT(2),
+       .funcval = BIT(2),
+};
+
+static const unsigned i2s_ext_clk_input_pins[] = { 51 };
+
+static const struct sirfsoc_muxmask i2s_muxmask[] = {
+       {
                .group = 3,
                .mask = BIT(2) | BIT(3) | BIT(4) | BIT(5),
        },
@@ -385,17 +422,12 @@ static const struct sirfsoc_padmux i2s_padmux = {
        .muxmask_counts = ARRAY_SIZE(i2s_muxmask),
        .muxmask = i2s_muxmask,
        .ctrlreg = SIRFSOC_RSC_PIN_MUX,
-       .funcmask = BIT(3),
-       .funcval = BIT(3),
 };
 
-static const unsigned i2s_pins[] = { 42, 98, 99, 100, 101 };
+static const unsigned i2s_pins[] = { 98, 99, 100, 101 };
 
 static const struct sirfsoc_muxmask i2s_no_din_muxmask[] = {
        {
-               .group = 1,
-               .mask = BIT(10),
-       }, {
                .group = 3,
                .mask = BIT(2) | BIT(3) | BIT(4),
        },
@@ -405,17 +437,12 @@ static const struct sirfsoc_padmux i2s_no_din_padmux = {
        .muxmask_counts = ARRAY_SIZE(i2s_no_din_muxmask),
        .muxmask = i2s_no_din_muxmask,
        .ctrlreg = SIRFSOC_RSC_PIN_MUX,
-       .funcmask = BIT(3),
-       .funcval = BIT(3),
 };
 
-static const unsigned i2s_no_din_pins[] = { 42, 98, 99, 100 };
+static const unsigned i2s_no_din_pins[] = { 98, 99, 100 };
 
 static const struct sirfsoc_muxmask i2s_6chn_muxmask[] = {
        {
-               .group = 1,
-               .mask = BIT(10) | BIT(20) | BIT(23),
-       }, {
                .group = 3,
                .mask = BIT(2) | BIT(3) | BIT(4) | BIT(5),
        },
@@ -425,11 +452,11 @@ static const struct sirfsoc_padmux i2s_6chn_padmux = {
        .muxmask_counts = ARRAY_SIZE(i2s_6chn_muxmask),
        .muxmask = i2s_6chn_muxmask,
        .ctrlreg = SIRFSOC_RSC_PIN_MUX,
-       .funcmask = BIT(1) | BIT(3) | BIT(9),
-       .funcval = BIT(1) | BIT(3) | BIT(9),
+       .funcmask = BIT(1) | BIT(9),
+       .funcval = BIT(1) | BIT(9),
 };
 
-static const unsigned i2s_6chn_pins[] = { 42, 52, 55, 98, 99, 100, 101 };
+static const unsigned i2s_6chn_pins[] = { 52, 55, 98, 99, 100, 101 };
 
 static const struct sirfsoc_muxmask ac97_muxmask[] = {
        {
@@ -716,7 +743,8 @@ static const struct sirfsoc_padmux vip_padmux = {
        .funcval = BIT(18),
 };
 
-static const unsigned vip_pins[] = { 36, 37, 38, 40, 41, 56, 57, 58, 59, 60, 61 };
+static const unsigned vip_pins[] = { 36, 37, 38, 40, 41, 56, 57, 58, 59,
+       60, 61 };
 
 static const struct sirfsoc_muxmask vip_noupli_muxmask[] = {
        {
@@ -737,7 +765,8 @@ static const struct sirfsoc_padmux vip_noupli_padmux = {
        .funcval = BIT(15),
 };
 
-static const unsigned vip_noupli_pins[] = { 16, 17, 18, 19, 20, 21, 22, 23, 87, 88, 89 };
+static const unsigned vip_noupli_pins[] = { 16, 17, 18, 19, 20, 21, 22, 23,
+       87, 88, 89 };
 
 static const struct sirfsoc_muxmask i2c0_muxmask[] = {
        {
@@ -876,7 +905,8 @@ static const struct sirfsoc_padmux usb0_upli_drvbus_padmux = {
        .funcval = 0,
 };
 
-static const unsigned usb0_upli_drvbus_pins[] = { 36, 37, 38, 39, 40, 41, 56, 57, 58, 59, 60, 61 };
+static const unsigned usb0_upli_drvbus_pins[] = { 36, 37, 38, 39, 40,
+       41, 56, 57, 58, 59, 60, 61 };
 
 static const struct sirfsoc_muxmask usb1_utmi_drvbus_muxmask[] = {
        {
@@ -968,6 +998,8 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = {
        SIRFSOC_PIN_GROUP("usb1_dp_dngrp", usb1_dp_dn_pins),
        SIRFSOC_PIN_GROUP("uart1_route_io_usb1grp", uart1_route_io_usb1_pins),
        SIRFSOC_PIN_GROUP("pulse_countgrp", pulse_count_pins),
+       SIRFSOC_PIN_GROUP("i2smclkgrp", i2s_mclk_pins),
+       SIRFSOC_PIN_GROUP("i2s_ext_clk_inputgrp", i2s_ext_clk_input_pins),
        SIRFSOC_PIN_GROUP("i2sgrp", i2s_pins),
        SIRFSOC_PIN_GROUP("i2s_no_dingrp", i2s_no_din_pins),
        SIRFSOC_PIN_GROUP("i2s_6chngrp", i2s_6chn_pins),
@@ -1017,8 +1049,11 @@ static const char * const sdmmc2_nowpgrp[] = { "sdmmc2_nowpgrp" };
 static const char * const usb0_upli_drvbusgrp[] = { "usb0_upli_drvbusgrp" };
 static const char * const usb1_utmi_drvbusgrp[] = { "usb1_utmi_drvbusgrp" };
 static const char * const usb1_dp_dngrp[] = { "usb1_dp_dngrp" };
-static const char * const uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" };
+static const char * const
+       uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" };
 static const char * const pulse_countgrp[] = { "pulse_countgrp" };
+static const char * const i2smclkgrp[] = { "i2smclkgrp" };
+static const char * const i2s_ext_clk_inputgrp[] = { "i2s_ext_clk_inputgrp" };
 static const char * const i2sgrp[] = { "i2sgrp" };
 static const char * const i2s_no_dingrp[] = { "i2s_no_dingrp" };
 static const char * const i2s_6chngrp[] = { "i2s_6chngrp" };
@@ -1038,7 +1073,8 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {
                                                uart0_nostreamctrl_padmux),
        SIRFSOC_PMX_FUNCTION("uart1", uart1grp, uart1_padmux),
        SIRFSOC_PMX_FUNCTION("uart2", uart2grp, uart2_padmux),
-       SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl", uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux),
+       SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl",
+               uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux),
        SIRFSOC_PMX_FUNCTION("usp0", usp0grp, usp0_padmux),
        SIRFSOC_PMX_FUNCTION("usp0_uart_nostreamctrl",
                                                usp0_uart_nostreamctrl_grp,
@@ -1068,12 +1104,19 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {
        SIRFSOC_PMX_FUNCTION("sdmmc2", sdmmc2grp, sdmmc2_padmux),
        SIRFSOC_PMX_FUNCTION("sdmmc3", sdmmc3grp, sdmmc3_padmux),
        SIRFSOC_PMX_FUNCTION("sdmmc5", sdmmc5grp, sdmmc5_padmux),
-       SIRFSOC_PMX_FUNCTION("sdmmc2_nowp", sdmmc2_nowpgrp, sdmmc2_nowp_padmux),
-       SIRFSOC_PMX_FUNCTION("usb0_upli_drvbus", usb0_upli_drvbusgrp, usb0_upli_drvbus_padmux),
-       SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus", usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux),
+       SIRFSOC_PMX_FUNCTION("sdmmc2_nowp",
+               sdmmc2_nowpgrp, sdmmc2_nowp_padmux),
+       SIRFSOC_PMX_FUNCTION("usb0_upli_drvbus",
+               usb0_upli_drvbusgrp, usb0_upli_drvbus_padmux),
+       SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus",
+               usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux),
        SIRFSOC_PMX_FUNCTION("usb1_dp_dn", usb1_dp_dngrp, usb1_dp_dn_padmux),
-       SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1", uart1_route_io_usb1grp, uart1_route_io_usb1_padmux),
+       SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1",
+               uart1_route_io_usb1grp, uart1_route_io_usb1_padmux),
        SIRFSOC_PMX_FUNCTION("pulse_count", pulse_countgrp, pulse_count_padmux),
+       SIRFSOC_PMX_FUNCTION("i2s_mclk", i2smclkgrp, i2s_mclk_padmux),
+       SIRFSOC_PMX_FUNCTION("i2s_ext_clk_input", i2s_ext_clk_inputgrp,
+                                               i2s_ext_clk_input_padmux),
        SIRFSOC_PMX_FUNCTION("i2s", i2sgrp, i2s_padmux),
        SIRFSOC_PMX_FUNCTION("i2s_no_din", i2s_no_dingrp, i2s_no_din_padmux),
        SIRFSOC_PMX_FUNCTION("i2s_6chn", i2s_6chngrp, i2s_6chn_padmux),
index 8aa76f0..357678e 100644 (file)
@@ -135,8 +135,9 @@ static const struct pinctrl_pin_desc sirfsoc_pads[] = {
 static const struct sirfsoc_muxmask lcd_16bits_sirfsoc_muxmask[] = {
        {
                .group = 3,
-               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7) | BIT(8) |
-                       BIT(9) | BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
+               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) |
+                       BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
+                       BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
                        BIT(17) | BIT(18),
        }, {
                .group = 2,
@@ -152,14 +153,15 @@ static const struct sirfsoc_padmux lcd_16bits_padmux = {
        .funcval = 0,
 };
 
-static const unsigned lcd_16bits_pins[] = { 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
-       105, 106, 107, 108, 109, 110, 111, 112, 113, 114 };
+static const unsigned lcd_16bits_pins[] = { 95, 96, 97, 98, 99, 100, 101, 102,
+       103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114 };
 
 static const struct sirfsoc_muxmask lcd_18bits_muxmask[] = {
        {
                .group = 3,
-               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7) | BIT(8) |
-                       BIT(9) | BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
+               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) |
+                       BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
+                       BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
                        BIT(17) | BIT(18),
        }, {
                .group = 2,
@@ -178,21 +180,23 @@ static const struct sirfsoc_padmux lcd_18bits_padmux = {
        .funcval = 0,
 };
 
-static const unsigned lcd_18bits_pins[] = { 16, 17, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
-       105, 106, 107, 108, 109, 110, 111, 112, 113, 114};
+static const unsigned lcd_18bits_pins[] = { 16, 17, 95, 96, 97, 98, 99, 100,
+       101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114};
 
 static const struct sirfsoc_muxmask lcd_24bits_muxmask[] = {
        {
                .group = 3,
-               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7) | BIT(8) |
-                       BIT(9) | BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
+               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) |
+                       BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
+                       BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
                        BIT(17) | BIT(18),
        }, {
                .group = 2,
                .mask = BIT(31),
        }, {
                .group = 0,
-               .mask = BIT(16) | BIT(17) | BIT(18) | BIT(19) | BIT(20) | BIT(21) | BIT(22) | BIT(23),
+               .mask = BIT(16) | BIT(17) | BIT(18) | BIT(19) | BIT(20) |
+                       BIT(21) | BIT(22) | BIT(23),
        },
 };
 
@@ -204,14 +208,16 @@ static const struct sirfsoc_padmux lcd_24bits_padmux = {
        .funcval = 0,
 };
 
-static const unsigned lcd_24bits_pins[] = { 16, 17, 18, 19, 20, 21, 22, 23, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
-       105, 106, 107, 108, 109, 110, 111, 112, 113, 114 };
+static const unsigned lcd_24bits_pins[] = { 16, 17, 18, 19, 20, 21, 22, 23,
+       95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+       110, 111, 112, 113, 114 };
 
 static const struct sirfsoc_muxmask lcdrom_muxmask[] = {
        {
                .group = 3,
-               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7) | BIT(8) |
-                       BIT(9) | BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
+               .mask = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) |
+                       BIT(6) | BIT(7) | BIT(8) | BIT(9) | BIT(10) | BIT(11) |
+                       BIT(12) | BIT(13) | BIT(14) | BIT(15) | BIT(16) |
                        BIT(17) | BIT(18),
        }, {
                .group = 2,
@@ -230,8 +236,8 @@ static const struct sirfsoc_padmux lcdrom_padmux = {
        .funcval = BIT(4),
 };
 
-static const unsigned lcdrom_pins[] = { 23, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
-       105, 106, 107, 108, 109, 110, 111, 112, 113, 114 };
+static const unsigned lcdrom_pins[] = { 23, 95, 96, 97, 98, 99, 100, 101, 102,
+       103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114 };
 
 static const struct sirfsoc_muxmask uart0_muxmask[] = {
        {
@@ -380,12 +386,44 @@ static const struct sirfsoc_padmux cko1_padmux = {
 
 static const unsigned cko1_pins[] = { 42 };
 
+static const struct sirfsoc_muxmask i2s_mclk_muxmask[] = {
+       {
+               .group = 1,
+               .mask = BIT(10),
+       },
+};
+
+static const struct sirfsoc_padmux i2s_mclk_padmux = {
+       .muxmask_counts = ARRAY_SIZE(i2s_mclk_muxmask),
+       .muxmask = i2s_mclk_muxmask,
+       .ctrlreg = SIRFSOC_RSC_PIN_MUX,
+       .funcmask = BIT(3),
+       .funcval = BIT(3),
+};
+
+static const unsigned i2s_mclk_pins[] = { 42 };
+
+static const struct sirfsoc_muxmask i2s_ext_clk_input_muxmask[] = {
+       {
+               .group = 1,
+               .mask = BIT(19),
+       },
+};
+
+static const struct sirfsoc_padmux i2s_ext_clk_input_padmux = {
+       .muxmask_counts = ARRAY_SIZE(i2s_ext_clk_input_muxmask),
+       .muxmask = i2s_ext_clk_input_muxmask,
+       .ctrlreg = SIRFSOC_RSC_PIN_MUX,
+       .funcmask = BIT(2),
+       .funcval = BIT(2),
+};
+
+static const unsigned i2s_ext_clk_input_pins[] = { 51 };
+
 static const struct sirfsoc_muxmask i2s_muxmask[] = {
        {
                .group = 1,
-               .mask =
-                       BIT(10) | BIT(11) | BIT(12) | BIT(13) | BIT(14) | BIT(19)
-                               | BIT(23) | BIT(28),
+               .mask = BIT(11) | BIT(12) | BIT(13) | BIT(14),
        },
 };
 
@@ -393,11 +431,42 @@ static const struct sirfsoc_padmux i2s_padmux = {
        .muxmask_counts = ARRAY_SIZE(i2s_muxmask),
        .muxmask = i2s_muxmask,
        .ctrlreg = SIRFSOC_RSC_PIN_MUX,
-       .funcmask = BIT(3) | BIT(9),
-       .funcval = BIT(3),
 };
 
-static const unsigned i2s_pins[] = { 42, 43, 44, 45, 46, 51, 55, 60 };
+static const unsigned i2s_pins[] = { 43, 44, 45, 46 };
+
+static const struct sirfsoc_muxmask i2s_no_din_muxmask[] = {
+       {
+               .group = 1,
+               .mask = BIT(11) | BIT(12) | BIT(14),
+       },
+};
+
+static const struct sirfsoc_padmux i2s_no_din_padmux = {
+       .muxmask_counts = ARRAY_SIZE(i2s_no_din_muxmask),
+       .muxmask = i2s_no_din_muxmask,
+       .ctrlreg = SIRFSOC_RSC_PIN_MUX,
+};
+
+static const unsigned i2s_no_din_pins[] = { 43, 44, 46 };
+
+static const struct sirfsoc_muxmask i2s_6chn_muxmask[] = {
+       {
+               .group = 1,
+               .mask = BIT(11) | BIT(12) | BIT(13) | BIT(14)
+                       | BIT(23) | BIT(28),
+       },
+};
+
+static const struct sirfsoc_padmux i2s_6chn_padmux = {
+       .muxmask_counts = ARRAY_SIZE(i2s_6chn_muxmask),
+       .muxmask = i2s_6chn_muxmask,
+       .ctrlreg = SIRFSOC_RSC_PIN_MUX,
+       .funcmask = BIT(1) | BIT(9),
+       .funcval = BIT(1) | BIT(9),
+};
+
+static const unsigned i2s_6chn_pins[] = { 43, 44, 45, 46, 55, 60  };
 
 static const struct sirfsoc_muxmask ac97_muxmask[] = {
        {
@@ -685,7 +754,8 @@ static const struct sirfsoc_padmux vip_padmux = {
        .funcval = 0,
 };
 
-static const unsigned vip_pins[] = { 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 };
+static const unsigned vip_pins[] = { 79, 80, 81, 82, 83, 84, 85, 86, 87,
+       88, 89 };
 
 static const struct sirfsoc_muxmask i2c0_muxmask[] = {
        {
@@ -735,7 +805,8 @@ static const struct sirfsoc_padmux viprom_padmux = {
        .funcval = BIT(0),
 };
 
-static const unsigned viprom_pins[] = { 12, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 };
+static const unsigned viprom_pins[] = { 12, 79, 80, 81, 82, 83, 84, 85, 86,
+       87, 88, 89 };
 
 static const struct sirfsoc_muxmask pwm0_muxmask[] = {
        {
@@ -918,7 +989,11 @@ static const struct sirfsoc_pin_group sirfsoc_pin_groups[] = {
        SIRFSOC_PIN_GROUP("usb1_dp_dngrp", usb1_dp_dn_pins),
        SIRFSOC_PIN_GROUP("uart1_route_io_usb1grp", uart1_route_io_usb1_pins),
        SIRFSOC_PIN_GROUP("pulse_countgrp", pulse_count_pins),
+       SIRFSOC_PIN_GROUP("i2smclkgrp", i2s_mclk_pins),
+       SIRFSOC_PIN_GROUP("i2s_ext_clk_inputgrp", i2s_ext_clk_input_pins),
        SIRFSOC_PIN_GROUP("i2sgrp", i2s_pins),
+       SIRFSOC_PIN_GROUP("i2s_no_dingrp", i2s_no_din_pins),
+       SIRFSOC_PIN_GROUP("i2s_6chngrp", i2s_6chn_pins),
        SIRFSOC_PIN_GROUP("ac97grp", ac97_pins),
        SIRFSOC_PIN_GROUP("nandgrp", nand_pins),
        SIRFSOC_PIN_GROUP("spi0grp", spi0_pins),
@@ -936,16 +1011,19 @@ static const char * const uart1grp[] = { "uart1grp" };
 static const char * const uart2grp[] = { "uart2grp" };
 static const char * const uart2_nostreamctrlgrp[] = { "uart2_nostreamctrlgrp" };
 static const char * const usp0grp[] = { "usp0grp" };
-static const char * const usp0_uart_nostreamctrl_grp[] =
-                                       { "usp0_uart_nostreamctrl_grp" };
+static const char * const usp0_uart_nostreamctrl_grp[] = {
+       "usp0_uart_nostreamctrl_grp"
+};
 static const char * const usp0_only_utfs_grp[] = { "usp0_only_utfs_grp" };
 static const char * const usp0_only_urfs_grp[] = { "usp0_only_urfs_grp" };
 static const char * const usp1grp[] = { "usp1grp" };
-static const char * const usp1_uart_nostreamctrl_grp[] =
-                                       { "usp1_uart_nostreamctrl_grp" };
+static const char * const usp1_uart_nostreamctrl_grp[] = {
+       "usp1_uart_nostreamctrl_grp"
+};
 static const char * const usp2grp[] = { "usp2grp" };
-static const char * const usp2_uart_nostreamctrl_grp[] =
-                                       { "usp2_uart_nostreamctrl_grp" };
+static const char * const usp2_uart_nostreamctrl_grp[] = {
+       "usp2_uart_nostreamctrl_grp"
+};
 static const char * const i2c0grp[] = { "i2c0grp" };
 static const char * const i2c1grp[] = { "i2c1grp" };
 static const char * const pwm0grp[] = { "pwm0grp" };
@@ -966,9 +1044,14 @@ static const char * const sdmmc5grp[] = { "sdmmc5grp" };
 static const char * const usb0_utmi_drvbusgrp[] = { "usb0_utmi_drvbusgrp" };
 static const char * const usb1_utmi_drvbusgrp[] = { "usb1_utmi_drvbusgrp" };
 static const char * const usb1_dp_dngrp[] = { "usb1_dp_dngrp" };
-static const char * const uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" };
+static const char * const
+       uart1_route_io_usb1grp[] = { "uart1_route_io_usb1grp" };
 static const char * const pulse_countgrp[] = { "pulse_countgrp" };
+static const char * const i2smclkgrp[] = { "i2smclkgrp" };
+static const char * const i2s_ext_clk_inputgrp[] = { "i2s_ext_clk_inputgrp" };
 static const char * const i2sgrp[] = { "i2sgrp" };
+static const char * const i2s_no_dingrp[] = { "i2s_no_dingrp" };
+static const char * const i2s_6chngrp[] = { "i2s_6chngrp" };
 static const char * const ac97grp[] = { "ac97grp" };
 static const char * const nandgrp[] = { "nandgrp" };
 static const char * const spi0grp[] = { "spi0grp" };
@@ -981,15 +1064,19 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {
        SIRFSOC_PMX_FUNCTION("lcd_24bits", lcd_24bitsgrp, lcd_24bits_padmux),
        SIRFSOC_PMX_FUNCTION("lcdrom", lcdromgrp, lcdrom_padmux),
        SIRFSOC_PMX_FUNCTION("uart0", uart0grp, uart0_padmux),
-       SIRFSOC_PMX_FUNCTION("uart0_nostreamctrl", uart0_nostreamctrlgrp, uart0_nostreamctrl_padmux),
+       SIRFSOC_PMX_FUNCTION("uart0_nostreamctrl",
+               uart0_nostreamctrlgrp, uart0_nostreamctrl_padmux),
        SIRFSOC_PMX_FUNCTION("uart1", uart1grp, uart1_padmux),
        SIRFSOC_PMX_FUNCTION("uart2", uart2grp, uart2_padmux),
-       SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl", uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux),
+       SIRFSOC_PMX_FUNCTION("uart2_nostreamctrl",
+               uart2_nostreamctrlgrp, uart2_nostreamctrl_padmux),
        SIRFSOC_PMX_FUNCTION("usp0", usp0grp, usp0_padmux),
        SIRFSOC_PMX_FUNCTION("usp0_uart_nostreamctrl",
                usp0_uart_nostreamctrl_grp, usp0_uart_nostreamctrl_padmux),
-       SIRFSOC_PMX_FUNCTION("usp0_only_utfs", usp0_only_utfs_grp, usp0_only_utfs_padmux),
-       SIRFSOC_PMX_FUNCTION("usp0_only_urfs", usp0_only_urfs_grp, usp0_only_urfs_padmux),
+       SIRFSOC_PMX_FUNCTION("usp0_only_utfs",
+               usp0_only_utfs_grp, usp0_only_utfs_padmux),
+       SIRFSOC_PMX_FUNCTION("usp0_only_urfs",
+               usp0_only_urfs_grp, usp0_only_urfs_padmux),
        SIRFSOC_PMX_FUNCTION("usp1", usp1grp, usp1_padmux),
        SIRFSOC_PMX_FUNCTION("usp1_uart_nostreamctrl",
                usp1_uart_nostreamctrl_grp, usp1_uart_nostreamctrl_padmux),
@@ -1013,12 +1100,20 @@ static const struct sirfsoc_pmx_func sirfsoc_pmx_functions[] = {
        SIRFSOC_PMX_FUNCTION("sdmmc3", sdmmc3grp, sdmmc3_padmux),
        SIRFSOC_PMX_FUNCTION("sdmmc4", sdmmc4grp, sdmmc4_padmux),
        SIRFSOC_PMX_FUNCTION("sdmmc5", sdmmc5grp, sdmmc5_padmux),
-       SIRFSOC_PMX_FUNCTION("usb0_utmi_drvbus", usb0_utmi_drvbusgrp, usb0_utmi_drvbus_padmux),
-       SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus", usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux),
+       SIRFSOC_PMX_FUNCTION("usb0_utmi_drvbus",
+               usb0_utmi_drvbusgrp, usb0_utmi_drvbus_padmux),
+       SIRFSOC_PMX_FUNCTION("usb1_utmi_drvbus",
+               usb1_utmi_drvbusgrp, usb1_utmi_drvbus_padmux),
        SIRFSOC_PMX_FUNCTION("usb1_dp_dn", usb1_dp_dngrp, usb1_dp_dn_padmux),
-       SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1", uart1_route_io_usb1grp, uart1_route_io_usb1_padmux),
+       SIRFSOC_PMX_FUNCTION("uart1_route_io_usb1",
+               uart1_route_io_usb1grp, uart1_route_io_usb1_padmux),
        SIRFSOC_PMX_FUNCTION("pulse_count", pulse_countgrp, pulse_count_padmux),
+       SIRFSOC_PMX_FUNCTION("i2s_mclk", i2smclkgrp, i2s_mclk_padmux),
+       SIRFSOC_PMX_FUNCTION("i2s_ext_clk_input", i2s_ext_clk_inputgrp,
+                                               i2s_ext_clk_input_padmux),
        SIRFSOC_PMX_FUNCTION("i2s", i2sgrp, i2s_padmux),
+       SIRFSOC_PMX_FUNCTION("i2s_no_din", i2s_no_dingrp, i2s_no_din_padmux),
+       SIRFSOC_PMX_FUNCTION("i2s_6chn", i2s_6chngrp, i2s_6chn_padmux),
        SIRFSOC_PMX_FUNCTION("ac97", ac97grp, ac97_padmux),
        SIRFSOC_PMX_FUNCTION("nand", nandgrp, nand_padmux),
        SIRFSOC_PMX_FUNCTION("spi0", spi0grp, spi0_padmux),
index 4c1d7c6..b713bd5 100644 (file)
@@ -58,17 +58,18 @@ static const char *sirfsoc_get_group_name(struct pinctrl_dev *pctldev,
        return sirfsoc_pin_groups[selector].name;
 }
 
-static int sirfsoc_get_group_pins(struct pinctrl_dev *pctldev, unsigned selector,
-                              const unsigned **pins,
-                              unsigned *num_pins)
+static int sirfsoc_get_group_pins(struct pinctrl_dev *pctldev,
+                               unsigned selector,
+                               const unsigned **pins,
+                               unsigned *num_pins)
 {
        *pins = sirfsoc_pin_groups[selector].pins;
        *num_pins = sirfsoc_pin_groups[selector].num_pins;
        return 0;
 }
 
-static void sirfsoc_pin_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s,
-                  unsigned offset)
+static void sirfsoc_pin_dbg_show(struct pinctrl_dev *pctldev,
+                               struct seq_file *s, unsigned offset)
 {
        seq_printf(s, " " DRIVER_NAME);
 }
@@ -138,22 +139,25 @@ static struct pinctrl_ops sirfsoc_pctrl_ops = {
 static struct sirfsoc_pmx_func *sirfsoc_pmx_functions;
 static int sirfsoc_pmxfunc_cnt;
 
-static void sirfsoc_pinmux_endisable(struct sirfsoc_pmx *spmx, unsigned selector,
-       bool enable)
+static void sirfsoc_pinmux_endisable(struct sirfsoc_pmx *spmx,
+                                       unsigned selector, bool enable)
 {
        int i;
-       const struct sirfsoc_padmux *mux = sirfsoc_pmx_functions[selector].padmux;
+       const struct sirfsoc_padmux *mux =
+               sirfsoc_pmx_functions[selector].padmux;
        const struct sirfsoc_muxmask *mask = mux->muxmask;
 
        for (i = 0; i < mux->muxmask_counts; i++) {
                u32 muxval;
                if (!spmx->is_marco) {
-                       muxval = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(mask[i].group));
+                       muxval = readl(spmx->gpio_virtbase +
+                               SIRFSOC_GPIO_PAD_EN(mask[i].group));
                        if (enable)
                                muxval = muxval & ~mask[i].mask;
                        else
                                muxval = muxval | mask[i].mask;
-                       writel(muxval, spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(mask[i].group));
+                       writel(muxval, spmx->gpio_virtbase +
+                               SIRFSOC_GPIO_PAD_EN(mask[i].group));
                } else {
                        if (enable)
                                writel(mask[i].mask, spmx->gpio_virtbase +
@@ -175,8 +179,9 @@ static void sirfsoc_pinmux_endisable(struct sirfsoc_pmx *spmx, unsigned selector
        }
 }
 
-static int sirfsoc_pinmux_enable(struct pinctrl_dev *pmxdev, unsigned selector,
-       unsigned group)
+static int sirfsoc_pinmux_set_mux(struct pinctrl_dev *pmxdev,
+                               unsigned selector,
+                               unsigned group)
 {
        struct sirfsoc_pmx *spmx;
 
@@ -197,9 +202,10 @@ static const char *sirfsoc_pinmux_get_func_name(struct pinctrl_dev *pctldev,
        return sirfsoc_pmx_functions[selector].name;
 }
 
-static int sirfsoc_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned selector,
-                              const char * const **groups,
-                              unsigned * const num_groups)
+static int sirfsoc_pinmux_get_groups(struct pinctrl_dev *pctldev,
+                               unsigned selector,
+                               const char * const **groups,
+                               unsigned * const num_groups)
 {
        *groups = sirfsoc_pmx_functions[selector].groups;
        *num_groups = sirfsoc_pmx_functions[selector].num_groups;
@@ -218,9 +224,11 @@ static int sirfsoc_pinmux_request_gpio(struct pinctrl_dev *pmxdev,
        spmx = pinctrl_dev_get_drvdata(pmxdev);
 
        if (!spmx->is_marco) {
-               muxval = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(group));
+               muxval = readl(spmx->gpio_virtbase +
+                       SIRFSOC_GPIO_PAD_EN(group));
                muxval = muxval | (1 << (offset - range->pin_base));
-               writel(muxval, spmx->gpio_virtbase + SIRFSOC_GPIO_PAD_EN(group));
+               writel(muxval, spmx->gpio_virtbase +
+                       SIRFSOC_GPIO_PAD_EN(group));
        } else {
                writel(1 << (offset - range->pin_base), spmx->gpio_virtbase +
                        SIRFSOC_GPIO_PAD_EN(group));
@@ -230,7 +238,7 @@ static int sirfsoc_pinmux_request_gpio(struct pinctrl_dev *pmxdev,
 }
 
 static struct pinmux_ops sirfsoc_pinmux_ops = {
-       .enable = sirfsoc_pinmux_enable,
+       .set_mux = sirfsoc_pinmux_set_mux,
        .get_functions_count = sirfsoc_pinmux_get_funcs_count,
        .get_function_name = sirfsoc_pinmux_get_func_name,
        .get_function_groups = sirfsoc_pinmux_get_groups,
@@ -518,24 +526,29 @@ static int sirfsoc_gpio_irq_type(struct irq_data *d, unsigned type)
        case IRQ_TYPE_NONE:
                break;
        case IRQ_TYPE_EDGE_RISING:
-               val |= SIRFSOC_GPIO_CTL_INTR_HIGH_MASK | SIRFSOC_GPIO_CTL_INTR_TYPE_MASK;
+               val |= SIRFSOC_GPIO_CTL_INTR_HIGH_MASK |
+                       SIRFSOC_GPIO_CTL_INTR_TYPE_MASK;
                val &= ~SIRFSOC_GPIO_CTL_INTR_LOW_MASK;
                break;
        case IRQ_TYPE_EDGE_FALLING:
                val &= ~SIRFSOC_GPIO_CTL_INTR_HIGH_MASK;
-               val |= SIRFSOC_GPIO_CTL_INTR_LOW_MASK | SIRFSOC_GPIO_CTL_INTR_TYPE_MASK;
+               val |= SIRFSOC_GPIO_CTL_INTR_LOW_MASK |
+                       SIRFSOC_GPIO_CTL_INTR_TYPE_MASK;
                break;
        case IRQ_TYPE_EDGE_BOTH:
-               val |= SIRFSOC_GPIO_CTL_INTR_HIGH_MASK | SIRFSOC_GPIO_CTL_INTR_LOW_MASK |
-                        SIRFSOC_GPIO_CTL_INTR_TYPE_MASK;
+               val |= SIRFSOC_GPIO_CTL_INTR_HIGH_MASK |
+                       SIRFSOC_GPIO_CTL_INTR_LOW_MASK |
+                       SIRFSOC_GPIO_CTL_INTR_TYPE_MASK;
                break;
        case IRQ_TYPE_LEVEL_LOW:
-               val &= ~(SIRFSOC_GPIO_CTL_INTR_HIGH_MASK | SIRFSOC_GPIO_CTL_INTR_TYPE_MASK);
+               val &= ~(SIRFSOC_GPIO_CTL_INTR_HIGH_MASK |
+                       SIRFSOC_GPIO_CTL_INTR_TYPE_MASK);
                val |= SIRFSOC_GPIO_CTL_INTR_LOW_MASK;
                break;
        case IRQ_TYPE_LEVEL_HIGH:
                val |= SIRFSOC_GPIO_CTL_INTR_HIGH_MASK;
-               val &= ~(SIRFSOC_GPIO_CTL_INTR_LOW_MASK | SIRFSOC_GPIO_CTL_INTR_TYPE_MASK);
+               val &= ~(SIRFSOC_GPIO_CTL_INTR_LOW_MASK |
+                       SIRFSOC_GPIO_CTL_INTR_TYPE_MASK);
                break;
        }
 
@@ -694,7 +707,8 @@ static inline void sirfsoc_gpio_set_output(struct sirfsoc_gpio_chip *sgpio,
        spin_unlock_irqrestore(&bank->lock, flags);
 }
 
-static int sirfsoc_gpio_direction_output(struct gpio_chip *chip, unsigned gpio, int value)
+static int sirfsoc_gpio_direction_output(struct gpio_chip *chip,
+       unsigned gpio, int value)
 {
        struct sirfsoc_gpio_chip *sgpio = to_sirfsoc_gpio(chip);
        struct sirfsoc_gpio_bank *bank = sirfsoc_gpio_to_bank(sgpio, gpio);
@@ -839,7 +853,7 @@ static int sirfsoc_gpio_probe(struct device_node *np)
        if (err) {
                dev_err(&pdev->dev,
                        "could not connect irqchip to gpiochip\n");
-               goto out;
+               goto out_banks;
        }
 
        for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {
@@ -898,8 +912,8 @@ static int __init sirfsoc_gpio_init(void)
 }
 subsys_initcall(sirfsoc_gpio_init);
 
-MODULE_AUTHOR("Rongjun Ying <rongjun.ying@csr.com>, "
-       "Yuping Luo <yuping.luo@csr.com>, "
-       "Barry Song <baohua.song@csr.com>");
+MODULE_AUTHOR("Rongjun Ying <rongjun.ying@csr.com>");
+MODULE_AUTHOR("Yuping Luo <yuping.luo@csr.com>");
+MODULE_AUTHOR("Barry Song <baohua.song@csr.com>");
 MODULE_DESCRIPTION("SIRFSOC pin control driver");
 MODULE_LICENSE("GPL");
index f72cc4e..abdb05a 100644 (file)
@@ -268,7 +268,7 @@ static int spear_pinctrl_endisable(struct pinctrl_dev *pctldev,
        return 0;
 }
 
-static int spear_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
+static int spear_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned function,
                unsigned group)
 {
        return spear_pinctrl_endisable(pctldev, function, group, true);
@@ -338,7 +338,7 @@ static const struct pinmux_ops spear_pinmux_ops = {
        .get_functions_count = spear_pinctrl_get_funcs_count,
        .get_function_name = spear_pinctrl_get_func_name,
        .get_function_groups = spear_pinctrl_get_func_groups,
-       .enable = spear_pinctrl_enable,
+       .set_mux = spear_pinctrl_set_mux,
        .gpio_request_enable = gpio_request_enable,
        .gpio_disable_free = gpio_disable_free,
 };
index 1a8bbfe..6d57d43 100644 (file)
@@ -2692,7 +2692,7 @@ static struct spear_pinctrl_machdata spear1310_machdata = {
        .modes_supported = false,
 };
 
-static struct of_device_id spear1310_pinctrl_of_match[] = {
+static const struct of_device_id spear1310_pinctrl_of_match[] = {
        {
                .compatible = "st,spear1310-pinmux",
        },
index 873966e..d243e43 100644 (file)
@@ -2008,7 +2008,7 @@ static struct spear_pinctrl_machdata spear1340_machdata = {
        .modes_supported = false,
 };
 
-static struct of_device_id spear1340_pinctrl_of_match[] = {
+static const struct of_device_id spear1340_pinctrl_of_match[] = {
        {
                .compatible = "st,spear1340-pinmux",
        },
index 4777c0d..9db83e9 100644 (file)
@@ -646,7 +646,7 @@ static struct spear_function *spear300_functions[] = {
        &gpio1_function,
 };
 
-static struct of_device_id spear300_pinctrl_of_match[] = {
+static const struct of_device_id spear300_pinctrl_of_match[] = {
        {
                .compatible = "st,spear300-pinmux",
        },
index ed1d360..db775a4 100644 (file)
@@ -371,7 +371,7 @@ static struct spear_function *spear310_functions[] = {
        &tdm_function,
 };
 
-static struct of_device_id spear310_pinctrl_of_match[] = {
+static const struct of_device_id spear310_pinctrl_of_match[] = {
        {
                .compatible = "st,spear310-pinmux",
        },
index b8e290a..80fbd68 100644 (file)
@@ -3410,7 +3410,7 @@ static struct spear_function *spear320_functions[] = {
        &i2c2_function,
 };
 
-static struct of_device_id spear320_pinctrl_of_match[] = {
+static const struct of_device_id spear320_pinctrl_of_match[] = {
        {
                .compatible = "st,spear320-pinmux",
        },
index 3df66e3..ef9d804 100644 (file)
@@ -393,9 +393,9 @@ static void sunxi_pmx_set(struct pinctrl_dev *pctldev,
        spin_unlock_irqrestore(&pctl->lock, flags);
 }
 
-static int sunxi_pmx_enable(struct pinctrl_dev *pctldev,
-                           unsigned function,
-                           unsigned group)
+static int sunxi_pmx_set_mux(struct pinctrl_dev *pctldev,
+                            unsigned function,
+                            unsigned group)
 {
        struct sunxi_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
        struct sunxi_pinctrl_group *g = pctl->groups + group;
@@ -441,7 +441,7 @@ static const struct pinmux_ops sunxi_pmx_ops = {
        .get_functions_count    = sunxi_pmx_get_funcs_cnt,
        .get_function_name      = sunxi_pmx_get_func_name,
        .get_function_groups    = sunxi_pmx_get_func_groups,
-       .enable                 = sunxi_pmx_enable,
+       .set_mux                = sunxi_pmx_set_mux,
        .gpio_set_direction     = sunxi_pmx_gpio_set_direction,
 };
 
index 8cea355..d055d63 100644 (file)
@@ -131,9 +131,9 @@ static int wmt_set_pinmux(struct wmt_pinctrl_data *data, unsigned func,
        return 0;
 }
 
-static int wmt_pmx_enable(struct pinctrl_dev *pctldev,
-                         unsigned func_selector,
-                         unsigned group_selector)
+static int wmt_pmx_set_mux(struct pinctrl_dev *pctldev,
+                          unsigned func_selector,
+                          unsigned group_selector)
 {
        struct wmt_pinctrl_data *data = pinctrl_dev_get_drvdata(pctldev);
        u32 pinnum = data->pins[group_selector].number;
@@ -168,7 +168,7 @@ static struct pinmux_ops wmt_pinmux_ops = {
        .get_functions_count = wmt_pmx_get_functions_count,
        .get_function_name = wmt_pmx_get_function_name,
        .get_function_groups = wmt_pmx_get_function_groups,
-       .enable = wmt_pmx_enable,
+       .set_mux = wmt_pmx_set_mux,
        .gpio_disable_free = wmt_pmx_gpio_disable_free,
        .gpio_set_direction = wmt_pmx_gpio_set_direction,
 };
index 0fee6ff..bbca3d0 100644 (file)
 
 #define AT91_PINCTRL_PULL_UP_DEGLITCH  (AT91_PINCTRL_PULL_UP | AT91_PINCTRL_DEGLITCH)
 
+#define AT91_PINCTRL_DRIVE_STRENGTH_DEFAULT            (0x0 << 5)
+#define AT91_PINCTRL_DRIVE_STRENGTH_LOW                        (0x1 << 5)
+#define AT91_PINCTRL_DRIVE_STRENGTH_MED                        (0x2 << 5)
+#define AT91_PINCTRL_DRIVE_STRENGTH_HI                 (0x3 << 5)
+
 #define AT91_PIOA      0
 #define AT91_PIOB      1
 #define AT91_PIOC      2
index cd5788b..743e66a 100644 (file)
@@ -28,5 +28,7 @@
 #define RK_FUNC_GPIO   0
 #define RK_FUNC_1      1
 #define RK_FUNC_2      2
+#define RK_FUNC_3      3
+#define RK_FUNC_4      4
 
 #endif
index a15f107..d578a60 100644 (file)
@@ -57,7 +57,7 @@
  *     which are then pulled up with an external resistor. Setting this
  *     config will enable open drain mode, the argument is ignored.
  * @PIN_CONFIG_DRIVE_OPEN_SOURCE: the pin will be driven with open source
- *     (open emitter). Setting this config will enable open drain mode, the
+ *     (open emitter). Setting this config will enable open source mode, the
  *     argument is ignored.
  * @PIN_CONFIG_DRIVE_STRENGTH: the pin will sink or source at most the current
  *     passed as argument. The argument is in mA.
index 3097aaf..511bda9 100644 (file)
@@ -39,13 +39,12 @@ struct pinctrl_dev;
  *     name can be used with the generic @pinctrl_ops to retrieve the
  *     actual pins affected. The applicable groups will be returned in
  *     @groups and the number of groups in @num_groups
- * @enable: enable a certain muxing function with a certain pin group. The
+ * @set_mux: enable a certain muxing function with a certain pin group. The
  *     driver does not need to figure out whether enabling this function
  *     conflicts some other use of the pins in that group, such collisions
  *     are handled by the pinmux subsystem. The @func_selector selects a
  *     certain function whereas @group_selector selects a certain set of pins
  *     to be used. On simple controllers the latter argument may be ignored
- * @disable: disable a certain muxing selector with a certain pin group
  * @gpio_request_enable: requests and enables GPIO on a certain pin.
  *     Implement this only if you can mux every pin individually as GPIO. The
  *     affected GPIO range is passed along with an offset(pin number) into that
@@ -68,8 +67,8 @@ struct pinmux_ops {
                                  unsigned selector,
                                  const char * const **groups,
                                  unsigned * const num_groups);
-       int (*enable) (struct pinctrl_dev *pctldev, unsigned func_selector,
-                      unsigned group_selector);
+       int (*set_mux) (struct pinctrl_dev *pctldev, unsigned func_selector,
+                       unsigned group_selector);
        int (*gpio_request_enable) (struct pinctrl_dev *pctldev,
                                    struct pinctrl_gpio_range *range,
                                    unsigned offset);