Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41739b60 authored by Olof Johansson's avatar Olof Johansson
Browse files

Merge branch 'samsung/pinctrl' into next/soc

From Kukjin Kim:
Here is Samsung DT for v3.8 and this is including DT for EXYNOS4X12
SoC, SMDK4412 board, pinctrl for exynos4x12, TMU, MFC, SATA and SATA
PHY.

As I commented on [4/7], this branch merged pinctrl/samsung to support
pinctrl for exynos4x12 without useless merge conflicts.

* samsung/pinctrl:
  pinctrl: samsung: Update error check for unsigned variables
  pinctrl: samsung: Add support for EXYNOS4X12
  Documentation: Update samsung-pinctrl device tree bindings documentation
  pinctrl: samsung: Add GPIO to IRQ translation
  pinctrl: exynos: Set pin function to EINT in irq_set_type of wake-up EINT
  pinctrl: samsung: Use per-bank IRQ domain for wake-up interrupts
  pinctrl: samsung: Use one GPIO chip per pin bank
  pinctrl: exynos: Use one IRQ domain per pin bank
  pinctrl: samsung: Include bank-specific eint offset in bank struct
  pinctrl: samsung: Hold pointer to driver data in bank struct
  pinctrl: samsung: Match pin banks with their device nodes
  ARM: dts: exynos4210-pinctrl: Add nodes for pin banks
  pinctrl: samsung: Distinguish between pin group and bank nodes
  pinctrl: samsung: Remove static pin enumerations
  pinctrl: samsung: Assing pin numbers dynamically
  pinctrl: samsung: Do not pass gpio_chip to pin_to_reg_bank
  pinctrl: samsung: Detect and handle unsupported configuration types
parents 24e93941 4a991b41
Loading
Loading
Loading
Loading
+94 −25
Original line number Diff line number Diff line
@@ -8,13 +8,20 @@ on-chip controllers onto these pads.
Required Properties:
- compatible: should be one of the following.
  - "samsung,pinctrl-exynos4210": for Exynos4210 compatible pin-controller.
  - "samsung,pinctrl-exynos4x12": for Exynos4x12 compatible pin-controller.
  - "samsung,pinctrl-exynos5250": for Exynos5250 compatible pin-controller.

- reg: Base address of the pin controller hardware module and length of
  the address space it occupies.

- interrupts: interrupt specifier for the controller. The format and value of
  the interrupt specifier depends on the interrupt parent for the controller.
- Pin banks as child nodes: Pin banks of the controller are represented by child
  nodes of the controller node. Bank name is taken from name of the node. Each
  bank node must contain following properties:

  - gpio-controller: identifies the node as a gpio controller and pin bank.
  - #gpio-cells: number of cells in GPIO specifier. Since the generic GPIO
    binding is used, the amount of cells must be specified as 2. See generic
    GPIO binding documentation for description of particular cells.

- Pin mux/config groups as child nodes: The pin mux (selecting pin function
  mode) and pin config (pull up/down, driver strength) settings are represented
@@ -72,6 +79,14 @@ used as system wakeup events.
A. External GPIO Interrupts: For supporting external gpio interrupts, the
   following properties should be specified in the pin-controller device node.

   - interrupt-parent: phandle of the interrupt parent to which the external
     GPIO interrupts are forwarded to.
   - interrupts: interrupt specifier for the controller. The format and value of
     the interrupt specifier depends on the interrupt parent for the controller.

   In addition, following properties must be present in node of every bank
   of pins supporting GPIO interrupts:

   - interrupt-controller: identifies the controller node as interrupt-parent.
   - #interrupt-cells: the value of this property should be 2.
     - First Cell: represents the external gpio interrupt number local to the
@@ -94,6 +109,11 @@ B. External Wakeup Interrupts: For supporting external wakeup interrupts, a
       found on Samsung Exynos4210 SoC.
   - interrupt-parent: phandle of the interrupt parent to which the external
     wakeup interrupts are forwarded to.
   - interrupts: interrupt used by multiplexed wakeup interrupts.

   In addition, following properties must be present in node of every bank
   of pins supporting wake-up interrupts:

   - interrupt-controller: identifies the node as interrupt-parent.
   - #interrupt-cells: the value of this property should be 2
     - First Cell: represents the external wakeup interrupt number local to
@@ -105,11 +125,63 @@ B. External Wakeup Interrupts: For supporting external wakeup interrupts, a
       - 4 = high level triggered
       - 8 = low level triggered

   Node of every bank of pins supporting direct wake-up interrupts (without
   multiplexing) must contain following properties:

   - interrupt-parent: phandle of the interrupt parent to which the external
     wakeup interrupts are forwarded to.
   - interrupts: interrupts of the interrupt parent which are used for external
     wakeup interrupts from pins of the bank, must contain interrupts for all
     pins of the bank.

Aliases:

All the pin controller nodes should be represented in the aliases node using
the following format 'pinctrl{n}' where n is a unique number for the alias.

Example: A pin-controller node with pin banks:

	pinctrl_0: pinctrl@11400000 {
		compatible = "samsung,pinctrl-exynos4210";
		reg = <0x11400000 0x1000>;
		interrupts = <0 47 0>;

		/* ... */

		/* Pin bank without external interrupts */
		gpy0: gpy0 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		/* ... */

		/* Pin bank with external GPIO or muxed wake-up interrupts */
		gpj0: gpj0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		/* ... */

		/* Pin bank with external direct wake-up interrupts */
		gpx0: gpx0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			interrupt-parent = <&gic>;
			interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>,
				     <0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>;
			#interrupt-cells = <2>;
		};

		/* ... */
	};

Example 1: A pin-controller node with pin groups.

	pinctrl_0: pinctrl@11400000 {
@@ -117,6 +189,8 @@ Example 1: A pin-controller node with pin groups.
		reg = <0x11400000 0x1000>;
		interrupts = <0 47 0>;

		/* ... */

		uart0_data: uart0-data {
			samsung,pins = "gpa0-0", "gpa0-1";
			samsung,pin-function = <2>;
@@ -158,20 +232,14 @@ Example 2: A pin-controller node with external wakeup interrupt controller node.
	pinctrl_1: pinctrl@11000000 {
		compatible = "samsung,pinctrl-exynos4210";
		reg = <0x11000000 0x1000>;
		interrupts = <0 46 0>;
		interrupt-controller;
		#interrupt-cells = <2>;
		interrupts = <0 46 0>

		wakup_eint: wakeup-interrupt-controller {
		/* ... */

		wakeup-interrupt-controller {
			compatible = "samsung,exynos4210-wakeup-eint";
			interrupt-parent = <&gic>;
			interrupt-controller;
			#interrupt-cells = <2>;
			interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>,
					<0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>,
					<0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
					<0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>,
					<0 32 0>;
			interrupts = <0 32 0>;
		};
	};

@@ -190,7 +258,8 @@ Example 4: Set up the default pin state for uart controller.

	static int s3c24xx_serial_probe(struct platform_device *pdev) {
		struct pinctrl *pinctrl;
		...
		...

		/* ... */

		pinctrl = devm_pinctrl_get_select_default(&pdev->dev);
	}
+278 −0
Original line number Diff line number Diff line
@@ -16,6 +16,134 @@

/ {
	pinctrl@11400000 {
		gpa0: gpa0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpa1: gpa1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpb: gpb {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpc0: gpc0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpc1: gpc1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpd0: gpd0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpd1: gpd1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpe0: gpe0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpe1: gpe1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpe2: gpe2 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpe3: gpe3 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpe4: gpe4 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpf0: gpf0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpf1: gpf1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpf2: gpf2 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpf3: gpf3 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		uart0_data: uart0-data {
			samsung,pins = "gpa0-0", "gpa0-1";
			samsung,pin-function = <0x2>;
@@ -205,6 +333,151 @@
	};

	pinctrl@11000000 {
		gpj0: gpj0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpj1: gpj1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpk0: gpk0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpk1: gpk1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpk2: gpk2 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpk3: gpk3 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpl0: gpl0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpl1: gpl1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpl2: gpl2 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpy0: gpy0 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpy1: gpy1 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpy2: gpy2 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpy3: gpy3 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpy4: gpy4 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpy5: gpy5 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpy6: gpy6 {
			gpio-controller;
			#gpio-cells = <2>;
		};

		gpx0: gpx0 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			interrupt-parent = <&gic>;
			interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>,
				     <0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>;
			#interrupt-cells = <2>;
		};

		gpx1: gpx1 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			interrupt-parent = <&gic>;
			interrupts = <0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
				     <0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>;
			#interrupt-cells = <2>;
		};

		gpx2: gpx2 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		gpx3: gpx3 {
			gpio-controller;
			#gpio-cells = <2>;

			interrupt-controller;
			#interrupt-cells = <2>;
		};

		sd0_clk: sd0-clk {
			samsung,pins = "gpk0-0";
			samsung,pin-function = <2>;
@@ -438,6 +711,11 @@
	};

	pinctrl@03860000 {
		gpz: gpz {
			gpio-controller;
			#gpio-cells = <2>;
		};

		i2s0_bus: i2s0-bus {
			samsung,pins = "gpz-0", "gpz-1", "gpz-2", "gpz-3",
					"gpz-4", "gpz-5", "gpz-6";
+1 −240
Original line number Diff line number Diff line
@@ -46,27 +46,17 @@
		compatible = "samsung,pinctrl-exynos4210";
		reg = <0x11400000 0x1000>;
		interrupts = <0 47 0>;
		interrupt-controller;
		#interrupt-cells = <2>;
	};

	pinctrl_1: pinctrl@11000000 {
		compatible = "samsung,pinctrl-exynos4210";
		reg = <0x11000000 0x1000>;
		interrupts = <0 46 0>;
		interrupt-controller;
		#interrupt-cells = <2>;

		wakup_eint: wakeup-interrupt-controller {
			compatible = "samsung,exynos4210-wakeup-eint";
			interrupt-parent = <&gic>;
			interrupt-controller;
			#interrupt-cells = <2>;
			interrupts = <0 16 0>, <0 17 0>, <0 18 0>, <0 19 0>,
				     <0 20 0>, <0 21 0>, <0 22 0>, <0 23 0>,
				     <0 24 0>, <0 25 0>, <0 26 0>, <0 27 0>,
				     <0 28 0>, <0 29 0>, <0 30 0>, <0 31 0>,
				     <0 32 0>;
			interrupts = <0 32 0>;
		};
	};

@@ -74,233 +64,4 @@
		compatible = "samsung,pinctrl-exynos4210";
		reg = <0x03860000 0x1000>;
	};

	gpio-controllers {
		#address-cells = <1>;
		#size-cells = <1>;
		gpio-controller;
		ranges;

		gpa0: gpio-controller@11400000 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400000 0x20>;
			#gpio-cells = <4>;
		};

		gpa1: gpio-controller@11400020 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400020 0x20>;
			#gpio-cells = <4>;
		};

		gpb: gpio-controller@11400040 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400040 0x20>;
			#gpio-cells = <4>;
		};

		gpc0: gpio-controller@11400060 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400060 0x20>;
			#gpio-cells = <4>;
		};

		gpc1: gpio-controller@11400080 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400080 0x20>;
			#gpio-cells = <4>;
		};

		gpd0: gpio-controller@114000A0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x114000A0 0x20>;
			#gpio-cells = <4>;
		};

		gpd1: gpio-controller@114000C0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x114000C0 0x20>;
			#gpio-cells = <4>;
		};

		gpe0: gpio-controller@114000E0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x114000E0 0x20>;
			#gpio-cells = <4>;
		};

		gpe1: gpio-controller@11400100 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400100 0x20>;
			#gpio-cells = <4>;
		};

		gpe2: gpio-controller@11400120 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400120 0x20>;
			#gpio-cells = <4>;
		};

		gpe3: gpio-controller@11400140 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400140 0x20>;
			#gpio-cells = <4>;
		};

		gpe4: gpio-controller@11400160 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400160 0x20>;
			#gpio-cells = <4>;
		};

		gpf0: gpio-controller@11400180 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11400180 0x20>;
			#gpio-cells = <4>;
		};

		gpf1: gpio-controller@114001A0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x114001A0 0x20>;
			#gpio-cells = <4>;
		};

		gpf2: gpio-controller@114001C0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x114001C0 0x20>;
			#gpio-cells = <4>;
		};

		gpf3: gpio-controller@114001E0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x114001E0 0x20>;
			#gpio-cells = <4>;
		};

		gpj0: gpio-controller@11000000 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000000 0x20>;
			#gpio-cells = <4>;
		};

		gpj1: gpio-controller@11000020 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000020 0x20>;
			#gpio-cells = <4>;
		};

		gpk0: gpio-controller@11000040 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000040 0x20>;
			#gpio-cells = <4>;
		};

		gpk1: gpio-controller@11000060 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000060 0x20>;
			#gpio-cells = <4>;
		};

		gpk2: gpio-controller@11000080 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000080 0x20>;
			#gpio-cells = <4>;
		};

		gpk3: gpio-controller@110000A0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x110000A0 0x20>;
			#gpio-cells = <4>;
		};

		gpl0: gpio-controller@110000C0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x110000C0 0x20>;
			#gpio-cells = <4>;
		};

		gpl1: gpio-controller@110000E0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x110000E0 0x20>;
			#gpio-cells = <4>;
		};

		gpl2: gpio-controller@11000100 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000100 0x20>;
			#gpio-cells = <4>;
		};

		gpy0: gpio-controller@11000120 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000120 0x20>;
			#gpio-cells = <4>;
		};

		gpy1: gpio-controller@11000140 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000140 0x20>;
			#gpio-cells = <4>;
		};

		gpy2: gpio-controller@11000160 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000160 0x20>;
			#gpio-cells = <4>;
		};

		gpy3: gpio-controller@11000180 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000180 0x20>;
			#gpio-cells = <4>;
		};

		gpy4: gpio-controller@110001A0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x110001A0 0x20>;
			#gpio-cells = <4>;
		};

		gpy5: gpio-controller@110001C0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x110001C0 0x20>;
			#gpio-cells = <4>;
		};

		gpy6: gpio-controller@110001E0 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x110001E0 0x20>;
			#gpio-cells = <4>;
		};

		gpx0: gpio-controller@11000C00 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000C00 0x20>;
			#gpio-cells = <4>;
		};

		gpx1: gpio-controller@11000C20 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000C20 0x20>;
			#gpio-cells = <4>;
		};

		gpx2: gpio-controller@11000C40 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000C40 0x20>;
			#gpio-cells = <4>;
		};

		gpx3: gpio-controller@11000C60 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x11000C60 0x20>;
			#gpio-cells = <4>;
		};

		gpz: gpio-controller@03860000 {
			compatible = "samsung,exynos4-gpio";
			reg = <0x03860000 0x20>;
			#gpio-cells = <4>;
		};
	};
};
Loading