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

Commit 9a2c1c3b authored by Tomasz Figa's avatar Tomasz Figa Committed by Linus Walleij
Browse files

pinctrl: samsung: Allow grouping multiple pinmux/pinconf nodes



One of remaining limitations of current pinctrl-samsung driver was
the inability to parse multiple pinmux/pinconf group nodes grouped
inside a single device tree node. It made defining groups of pins for
single purpose, but with different parameters very inconvenient.

This patch implements Tegra-like support for grouping multiple pinctrl
groups inside one device tree node, by completely changing the way
pin groups and functions are parsed from device tree. The code creating
pinctrl maps from DT nodes has been borrowed from pinctrl-tegra, while
the initial creation of groups and functions has been completely
rewritten with following assumptions:
 - each group consists of just one pin and does not depend on data
   from device tree,
 - each function is represented by a device tree child node of the
   pin controller, which in turn can contain multiple child nodes
   for pins that need to have different configuration values.

Device Tree bindings are fully backwards compatible. New functionality
can be used by defining a new pinctrl group consisting of several child
nodes, as on following example:

	sd4_bus8: sd4-bus-width8 {
		part-1 {
			samsung,pins = "gpk0-3", "gpk0-4",
					"gpk0-5", "gpk0-6";
			samsung,pin-function = <3>;
			samsung,pin-pud = <3>;
			samsung,pin-drv = <3>;
		};
		part-2 {
			samsung,pins = "gpk1-3", "gpk1-4",
					"gpk1-5", "gpk1-6";
			samsung,pin-function = <4>;
			samsung,pin-pud = <4>;
			samsung,pin-drv = <3>;
		};
	};

Tested on Exynos4210-Trats board and a custom Exynos4212-based one.

Signed-off-by: default avatarTomasz Figa <t.figa@samsung.com>
Acked-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Reviewed-by: default avatarStephen Warren <swarren@nvidia.com>
Cc: devicetree@vger.kernel.org
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 2e4a4fda
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -44,7 +44,11 @@ Required Properties:
- 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
  as child nodes of the pin-controller node. There should be atleast one
  child node and there is no limit on the count of these child nodes.
  child node and there is no limit on the count of these child nodes. It is
  also possible for a child node to consist of several further child nodes
  to allow grouping multiple pinctrl groups into one. The format of second
  level child nodes is exactly the same as for first level ones and is
  described below.

  The child node should contain a list of pin(s) on which a particular pin
  function selection or pin configuration (or both) have to applied. This
@@ -249,6 +253,23 @@ Example 1: A pin-controller node with pin groups.
			samsung,pin-pud = <3>;
			samsung,pin-drv = <0>;
		};

		sd4_bus8: sd4-bus-width8 {
			part-1 {
				samsung,pins = "gpk0-3", "gpk0-4",
						"gpk0-5", "gpk0-6";
				samsung,pin-function = <3>;
				samsung,pin-pud = <3>;
				samsung,pin-drv = <3>;
			};
			part-2 {
				samsung,pins = "gpk1-3", "gpk1-4",
						"gpk1-5", "gpk1-6";
				samsung,pin-function = <4>;
				samsung,pin-pud = <4>;
				samsung,pin-drv = <3>;
			};
		};
	};

Example 2: A pin-controller node with external wakeup interrupt controller node.
+361 −252

File changed.

Preview size limit exceeded, changes collapsed.

+1 −0
Original line number Diff line number Diff line
@@ -231,6 +231,7 @@ struct samsung_pmx_func {
	const char		*name;
	const char		**groups;
	u8			num_groups;
	u32			val;
};

/* list of all exported SoC specific data */