* Renesas Pin Function Controller (GPIO and Pin Mux/Config)

The Pin Function Controller (PFC) is a Pin Mux/Config controller. On SH73A0,
R8A73A4 and R8A7740 it also acts as a GPIO controller.


Pin Control
-----------

Required Properties:

  - compatible: should be one of the following.
    - "renesas,pfc-emev2": for EMEV2 (EMMA Mobile EV2) compatible pin-controller.
    - "renesas,pfc-r8a73a4": for R8A73A4 (R-Mobile APE6) compatible pin-controller.
    - "renesas,pfc-r8a7740": for R8A7740 (R-Mobile A1) compatible pin-controller.
    - "renesas,pfc-r8a7743": for R8A7743 (RZ/G1M) compatible pin-controller.
    - "renesas,pfc-r8a7744": for R8A7744 (RZ/G1N) compatible pin-controller.
    - "renesas,pfc-r8a7745": for R8A7745 (RZ/G1E) compatible pin-controller.
    - "renesas,pfc-r8a77470": for R8A77470 (RZ/G1C) compatible pin-controller.
    - "renesas,pfc-r8a774a1": for R8A774A1 (RZ/G2M) compatible pin-controller.
    - "renesas,pfc-r8a774b1": for R8A774B1 (RZ/G2N) compatible pin-controller.
    - "renesas,pfc-r8a774c0": for R8A774C0 (RZ/G2E) compatible pin-controller.
    - "renesas,pfc-r8a7778": for R8A7778 (R-Car M1) compatible pin-controller.
    - "renesas,pfc-r8a7779": for R8A7779 (R-Car H1) compatible pin-controller.
    - "renesas,pfc-r8a7790": for R8A7790 (R-Car H2) compatible pin-controller.
    - "renesas,pfc-r8a7791": for R8A7791 (R-Car M2-W) compatible pin-controller.
    - "renesas,pfc-r8a7792": for R8A7792 (R-Car V2H) compatible pin-controller.
    - "renesas,pfc-r8a7793": for R8A7793 (R-Car M2-N) compatible pin-controller.
    - "renesas,pfc-r8a7794": for R8A7794 (R-Car E2) compatible pin-controller.
    - "renesas,pfc-r8a7795": for R8A7795 (R-Car H3) compatible pin-controller.
    - "renesas,pfc-r8a7796": for R8A77960 (R-Car M3-W) compatible pin-controller.
    - "renesas,pfc-r8a77961": for R8A77961 (R-Car M3-W+) compatible pin-controller.
    - "renesas,pfc-r8a77965": for R8A77965 (R-Car M3-N) compatible pin-controller.
    - "renesas,pfc-r8a77970": for R8A77970 (R-Car V3M) compatible pin-controller.
    - "renesas,pfc-r8a77980": for R8A77980 (R-Car V3H) compatible pin-controller.
    - "renesas,pfc-r8a77990": for R8A77990 (R-Car E3) compatible pin-controller.
    - "renesas,pfc-r8a77995": for R8A77995 (R-Car D3) compatible pin-controller.
    - "renesas,pfc-sh73a0": for SH73A0 (SH-Mobile AG5) compatible pin-controller.

  - reg: Base address and length of each memory resource used by the pin
    controller hardware module.

Optional properties:

  - #gpio-range-cells: Mandatory when the PFC doesn't handle GPIO, forbidden
    otherwise. Should be 3.

  - interrupts-extended: Specify the interrupts associated with external
    IRQ pins. This property is mandatory when the PFC handles GPIOs and
    forbidden otherwise. When specified, it must contain one interrupt per
    external IRQ, sorted by external IRQ number.

The PFC node also acts as a container for pin configuration nodes. Please refer
to pinctrl-bindings.txt in this directory for the definition of the term "pin
configuration node" and for the common pinctrl bindings used by client devices.

Each pin configuration node represents a desired configuration for a pin, a
pin group, or a list of pins or pin groups. The configuration can include the
function to select on those pin(s) and pin configuration parameters (such as
pull-up and pull-down).

Pin configuration nodes contain pin configuration properties, either directly
or grouped in child subnodes. Both pin muxing and configuration parameters can
be grouped in that way and referenced as a single pin configuration node by
client devices.

A configuration node or subnode must reference at least one pin (through the
pins or pin groups properties) and contain at least a function or one
configuration parameter. When the function is present only pin groups can be
used to reference pins.

All pin configuration nodes and subnodes names are ignored. All of those nodes
are parsed through phandles and processed purely based on their content.

Pin Configuration Node Properties:

- pins : An array of strings, each string containing the name of a pin.
- groups : An array of strings, each string containing the name of a pin
  group.

- function: A string containing the name of the function to mux to the pin
  group(s) specified by the groups property.

  Valid values for pin, group and function names can be found in the group and
  function arrays of the PFC data file corresponding to the SoC
  (drivers/pinctrl/sh-pfc/pfc-*.c)

The pin configuration parameters use the generic pinconf bindings defined in
pinctrl-bindings.txt in this directory. The supported parameters are
bias-disable, bias-pull-up, bias-pull-down, drive-strength and power-source. For
pins that have a configurable I/O voltage, the power-source value should be the
nominal I/O voltage in millivolts.


GPIO
----

On SH73A0, R8A73A4 and R8A7740 the PFC node is also a GPIO controller node.

Required Properties:

  - gpio-controller: Marks the device node as a gpio controller.

  - #gpio-cells: Should be 2. The first cell is the GPIO number and the second
    cell specifies GPIO flags, as defined in <dt-bindings/gpio/gpio.h>. Only the
    GPIO_ACTIVE_HIGH and GPIO_ACTIVE_LOW flags are supported.

The syntax of the gpio specifier used by client nodes should be the following
with values derived from the SoC user manual.

  <[phandle of the gpio controller node]
   [pin number within the gpio controller]
   [flags]>

On other mach-shmobile platforms GPIO is handled by the gpio-rcar driver.
Please refer to Documentation/devicetree/bindings/gpio/renesas,gpio-rcar.txt
for documentation of the GPIO device tree bindings on those platforms.


Examples
--------

Example 1: SH73A0 (SH-Mobile AG5) pin controller node

	pfc: pin-controller@e6050000 {
		compatible = "renesas,pfc-sh73a0";
		reg = <0xe6050000 0x8000>,
		      <0xe605801c 0x1c>;
		gpio-controller;
		#gpio-cells = <2>;
		interrupts-extended =
			<&irqpin0 0 0>, <&irqpin0 1 0>, <&irqpin0 2 0>, <&irqpin0 3 0>,
			<&irqpin0 4 0>, <&irqpin0 5 0>, <&irqpin0 6 0>, <&irqpin0 7 0>,
			<&irqpin1 0 0>, <&irqpin1 1 0>, <&irqpin1 2 0>, <&irqpin1 3 0>,
			<&irqpin1 4 0>, <&irqpin1 5 0>, <&irqpin1 6 0>, <&irqpin1 7 0>,
			<&irqpin2 0 0>, <&irqpin2 1 0>, <&irqpin2 2 0>, <&irqpin2 3 0>,
			<&irqpin2 4 0>, <&irqpin2 5 0>, <&irqpin2 6 0>, <&irqpin2 7 0>,
			<&irqpin3 0 0>, <&irqpin3 1 0>, <&irqpin3 2 0>, <&irqpin3 3 0>,
			<&irqpin3 4 0>, <&irqpin3 5 0>, <&irqpin3 6 0>, <&irqpin3 7 0>;
	};

Example 2: A GPIO LED node that references a GPIO

	#include <dt-bindings/gpio/gpio.h>

	leds {
		compatible = "gpio-leds";
		led1 {
			gpios = <&pfc 20 GPIO_ACTIVE_LOW>;
		};
	};

Example 3: KZM-A9-GT (SH-Mobile AG5) default pin state hog and pin control maps
           for the MMCIF and SCIFA4 devices

	&pfc {
		pinctrl-0 = <&scifa4_pins>;
		pinctrl-names = "default";

		mmcif_pins: mmcif {
			mux {
				groups = "mmc0_data8_0", "mmc0_ctrl_0";
				function = "mmc0";
			};
			cfg {
				groups = "mmc0_data8_0";
				pins = "PORT279";
				bias-pull-up;
			};
		};

		scifa4_pins: scifa4 {
			groups = "scifa4_data", "scifa4_ctrl";
			function = "scifa4";
		};
	};

Example 4: KZM-A9-GT (SH-Mobile AG5) default pin state for the MMCIF device

	&mmcif {
		pinctrl-0 = <&mmcif_pins>;
		pinctrl-names = "default";

		bus-width = <8>;
		vmmc-supply = <&reg_1p8v>;
	};
