Skip to contentSkip to conversation

Enable driver model for GPIOs on Tegra and Exynos

PATCH Superseded Simon Glass 2 participants 21 messages Oct 15, 2014 – Oct 20, 2014

Subsystems (4)

v9 of 10 Superseded Latest is v10 →

lore
Share & tools
lore
#0 lore raw

v9 cover Enable driver model for GPIOs on Tegra and Exynos

(Note: Tegra patches have been applied, I am resending with exynos only)

Now that driver model is part of U-Boot, the task of converting drivers over to it begins. GPIO is one of the easiest to convert, since it already has a sandbox driver and a uclass driver.

The Tegra GPIO driver is relatively simple since it has a linear numbering and already uses the generic GPIO framework. Each GPIO bank has a separate device. Some arguments have been made that a single device should support all the GPIO banks, but currently the driver model uclass does not work that way and it would require a second-level data structure to handle the bank feature.

This driver has been tested on:

- Seaboard (Tegra 20)
- Beaver (Tegra 30)
- Jetson-TK1 (Tegra 124).

I don't have a Tegra 114 board (Dalmore seems to be the only one with U-Boot support) but I am quite confident that it works.

For exynos, the pinctrl device tree files are brought in from the kernel and cut down to remove the groupings which we don't yet use. Very small additions are made to avoid replicating the awful tables that Linux has for every exynos SoC. This series sits on top of the exynos refactors.

The 'gpio' command is updated to support display of only the allocated GPIOs. This is much more friendly than displaying a large table.

A few related clean-ups are provided as well.

This series is available at u-boot-dm.git, branch working.

Changes in v9:
- Change compatible string to s5pc110-pinctrl for s5p_goni
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Adjust odroid device tree file to use #include instead of /include/
- Add missing special case reg property for exynos5420 GPX0
- Add patch containing pinctrl settings for s5p_goni
- Add patch containing pinctrl settings for s5p_goni
- Add new patch to move smdkc100 to generic board
- Add new patch to move s5p_goni to generic board
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6:
- Fix typo in compatible string
- Remove exynos5420.dtsi which is not used in U-Boot
- Move U-Boot changes into their own file
- Use exynos54xx everywhere instead of exynos5420

Changes in v5:
- Put this patch before the others to avoid breaking bisectability
- Add additional gpio_request() calls for other samsung boards
- Use a mask instead of division in gpio_request() naming call
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

Simon Glass (12):
dm: exynos: dts: Convert /include/ to #include
dm: exynos: Bring in pinctrl dts files from Linux kernel
dm: exynos: dts: Remove unused pinctrl information to save space
dm: exynos: dts: Adjust device tree files for U-Boot
dm: exynos: Add pinctrl settings for smdkc100
dm: exynos: Add pinctrl settings for s5p_goni
dm: exynos: Move smdkc100 to generic board
dm: exynos: Move s5p_goni to generic board
dm: exynos: Tidy up GPIO headers
dm: exynos: Tidy up GPIO defines
dm: exynos: Make sure that GPIOs are requested
dm: exynos: gpio: Convert to driver model

 arch/arm/cpu/armv7/exynos/pinmux.c         |   5 +-
 arch/arm/dts/exynos4.dtsi                  |   9 +-
 arch/arm/dts/exynos4210-origen.dts         |   4 +-
 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi |  27 ++
 arch/arm/dts/exynos4210-pinctrl.dtsi       | 306 ++++++++++++++++++++
 arch/arm/dts/exynos4210-smdkv310.dts       |   2 +-
 arch/arm/dts/exynos4210-trats.dts          |   2 +-
 arch/arm/dts/exynos4210-universal_c210.dts |   2 +-
 arch/arm/dts/exynos4210.dtsi               | 155 ++++++++++
 arch/arm/dts/exynos4412-odroid.dts         |   2 +-
 arch/arm/dts/exynos4412-trats2.dts         |   2 +-
 arch/arm/dts/exynos4412.dtsi               |  38 +++
 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi |  46 +++
 arch/arm/dts/exynos4x12-pinctrl.dtsi       | 346 ++++++++++++++++++++++
 arch/arm/dts/exynos4x12.dtsi               | 114 ++++++++
 arch/arm/dts/exynos5.dtsi                  |  56 +++-
 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi |  40 +++
 arch/arm/dts/exynos5250-pinctrl.dtsi       | 333 +++++++++++++++++++++
 arch/arm/dts/exynos5250-smdk5250.dts       |   2 +-
 arch/arm/dts/exynos5250-snow.dts           |   2 +-
 arch/arm/dts/exynos5250.dtsi               |  40 ++-
 arch/arm/dts/exynos5420-peach-pit.dts      |   2 +-
 arch/arm/dts/exynos5420-smdk5420.dts       |   2 +-
 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi |  40 +++
 arch/arm/dts/exynos54xx-pinctrl.dtsi       | 305 ++++++++++++++++++++
 arch/arm/dts/exynos54xx.dtsi               |  44 ++-
 arch/arm/dts/s5pc100-pinctrl.dtsi          | 180 ++++++++++++
 arch/arm/dts/s5pc110-pinctrl.dtsi          | 273 ++++++++++++++++++
 arch/arm/dts/s5pc1xx-goni.dts              |   7 +
 arch/arm/dts/s5pc1xx-smdkc100.dts          |   7 +
 arch/arm/include/asm/arch-exynos/gpio.h    |   5 -
 arch/arm/include/asm/arch-s5pc1xx/gpio.h   |   4 -
 board/samsung/arndale/arndale.c            |   4 +-
 board/samsung/common/board.c               |   2 +-
 board/samsung/common/misc.c                |   3 +-
 board/samsung/goni/goni.c                  |   4 +-
 board/samsung/origen/origen.c              |   2 +-
 board/samsung/smdk5250/exynos5-dt.c        |   7 +
 board/samsung/smdk5420/smdk5420.c          |   6 +-
 board/samsung/smdkc100/smdkc100.c          |   2 +-
 board/samsung/smdkv310/smdkv310.c          |   2 +-
 board/samsung/trats/trats.c                |  17 +-
 board/samsung/trats2/trats2.c              |  27 +-
 board/samsung/universal_c210/universal.c   |   4 +-
 drivers/gpio/s5p_gpio.c                    | 446 +++++++++++++++++++----------
 drivers/mmc/s5p_sdhci.c                    |   7 +-
 include/configs/exynos-common.h            |   4 +
 include/configs/s5p_goni.h                 |   5 +
 include/configs/smdkc100.h                 |   5 +
 49 files changed, 2758 insertions(+), 191 deletions(-)
 create mode 100644 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos4210-pinctrl.dtsi
 create mode 100644 arch/arm/dts/exynos4210.dtsi
 create mode 100644 arch/arm/dts/exynos4412.dtsi
 create mode 100644 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos4x12-pinctrl.dtsi
 create mode 100644 arch/arm/dts/exynos4x12.dtsi
 create mode 100644 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos5250-pinctrl.dtsi
 create mode 100644 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos54xx-pinctrl.dtsi
 create mode 100644 arch/arm/dts/s5pc100-pinctrl.dtsi
 create mode 100644 arch/arm/dts/s5pc110-pinctrl.dtsi
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#1 lore raw

PATCH v9 1/12 dm: exynos: dts: Convert /include/ to #include

We should be consistent about this. The kernel has moved to #include which breaks error reporting to some extent but does allow us to include binding files.

---

Changes in v9: None
Changes in v8:
- Adjust odroid device tree file to use #include instead of /include/

Changes in v7: None
Changes in v6: None
Changes in v5:
- Put this patch before the others to avoid breaking bisectability

Changes in v4: None

 arch/arm/dts/exynos4.dtsi                  | 2 +-
 arch/arm/dts/exynos4210-origen.dts         | 4 ++--
 arch/arm/dts/exynos4210-smdkv310.dts       | 2 +-
 arch/arm/dts/exynos4210-trats.dts          | 2 +-
 arch/arm/dts/exynos4210-universal_c210.dts | 2 +-
 arch/arm/dts/exynos4412-odroid.dts         | 2 +-
 arch/arm/dts/exynos4412-trats2.dts         | 2 +-
 arch/arm/dts/exynos5.dtsi                  | 2 +-
 arch/arm/dts/exynos5250-smdk5250.dts       | 2 +-
 arch/arm/dts/exynos5250-snow.dts           | 2 +-
 arch/arm/dts/exynos5250.dtsi               | 2 +-
 arch/arm/dts/exynos5420-peach-pit.dts      | 2 +-
 arch/arm/dts/exynos5420-smdk5420.dts       | 2 +-
 arch/arm/dts/exynos54xx.dtsi               | 2 +-
 14 files changed, 15 insertions(+), 15 deletions(-)
arch/arm/dts/exynos4.dtsi +1 -1
index 110eb43..6b83516 100644
@@ -7,7 +7,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
-/include/ "skeleton.dtsi"
+#include "skeleton.dtsi"
 
 / {
 	serial at 13800000 {
arch/arm/dts/exynos4210-origen.dts +2 -2
index 15059d2..556a3a2 100644
@@ -8,8 +8,8 @@
  */
 
 /dts-v1/;
-/include/ "skeleton.dtsi"
-/include/ "exynos4.dtsi"
+#include "skeleton.dtsi"
+#include "exynos4.dtsi"
 
 / {
 	model = "Insignal Origen evaluation board based on Exynos4210";
arch/arm/dts/exynos4210-smdkv310.dts +1 -1
index c390c8f..00cad04 100644
@@ -7,7 +7,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos4.dtsi"
+#include "exynos4.dtsi"
 
 / {
 	model = "Samsung SMDKV310 on Exynos4210";
arch/arm/dts/exynos4210-trats.dts +1 -1
index 0ff6939..71202d0 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos4.dtsi"
+#include "exynos4.dtsi"
 
 / {
 	model = "Samsung Trats based on Exynos4210";
arch/arm/dts/exynos4210-universal_c210.dts +1 -1
index 6941906..d30f131 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos4.dtsi"
+#include "exynos4.dtsi"
 
 / {
 	model = "Samsung Universal C210 based on Exynos4210 rev0";
arch/arm/dts/exynos4412-odroid.dts +1 -1
index 24d0bf1..4c5e2b3 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos4.dtsi"
+#include "exynos4.dtsi"
 
 / {
 	model = "Odroid based on Exynos4412";
arch/arm/dts/exynos4412-trats2.dts +1 -1
index cc58c87..9d22de7 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos4.dtsi"
+#include "exynos4.dtsi"
 
 / {
 	model = "Samsung Trats2 based on Exynos4412";
arch/arm/dts/exynos5.dtsi +1 -1
index a2b533a..329a89a 100644
@@ -5,7 +5,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
-/include/ "skeleton.dtsi"
+#include "skeleton.dtsi"
 
 / {
 	compatible = "samsung,exynos5";
arch/arm/dts/exynos5250-smdk5250.dts +1 -1
index 9020382..8850409 100644
@@ -10,7 +10,7 @@
 */
 
 /dts-v1/;
-/include/ "exynos5250.dtsi"
+#include "exynos5250.dtsi"
 
 / {
 	model = "SAMSUNG SMDK5250 board based on EXYNOS5250";
arch/arm/dts/exynos5250-snow.dts +1 -1
index ab4f2f8..2003412 100644
@@ -10,7 +10,7 @@
 */
 
 /dts-v1/;
-/include/ "exynos5250.dtsi"
+#include "exynos5250.dtsi"
 
 / {
 	model = "Google Snow";
arch/arm/dts/exynos5250.dtsi +1 -1
index 0c644e7..771f8d3 100644
@@ -5,7 +5,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
-/include/ "exynos5.dtsi"
+#include "exynos5.dtsi"
 
 / {
 	i2c at 12ca0000 {
arch/arm/dts/exynos5420-peach-pit.dts +1 -1
index 995e62b..c4c4b8e 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos54xx.dtsi"
+#include "exynos54xx.dtsi"
 
 / {
 	model = "Samsung/Google Peach Pit board based on Exynos5420";
arch/arm/dts/exynos5420-smdk5420.dts +1 -1
index 1bc6256..6855027 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-/include/ "exynos54xx.dtsi"
+#include "exynos54xx.dtsi"
 
 / {
 	model = "SAMSUNG SMDK5420 board based on EXYNOS5420";
arch/arm/dts/exynos54xx.dtsi +1 -1
index c21d798..7892345 100644
@@ -5,7 +5,7 @@
  * SPDX-License-Identifier:	GPL-2.0+
  */
 
-/include/ "exynos5.dtsi"
+#include "exynos5.dtsi"
 
 / {
 	config {
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#2 lore raw

PATCH v9 2/12 dm: exynos: Bring in pinctrl dts files from Linux kernel

In reply to Simon Glass

Bring in required device tree files for pinctrl from Linux v3.14. These are initially unchanged and have a number of pieces not needed by U-Boot.

Note that exynos5420 is renamed to exynos54xx here since we want to support exynos5422 also.

---

Changes in v9: None
Changes in v8: None
Changes in v7: None
Changes in v6:
- Fix typo in compatible string
- Remove exynos5420.dtsi which is not used in U-Boot

Changes in v5: None
Changes in v4: None

 arch/arm/dts/exynos4.dtsi                  |   7 +
 arch/arm/dts/exynos4210-origen.dts         |   2 +-
 arch/arm/dts/exynos4210-pinctrl.dtsi       | 847 +++++++++++++++++++++++++
 arch/arm/dts/exynos4210-trats.dts          |   2 +-
 arch/arm/dts/exynos4210-universal_c210.dts |   2 +-
 arch/arm/dts/exynos4210.dtsi               | 155 +++++
 arch/arm/dts/exynos4412-trats2.dts         |   2 +-
 arch/arm/dts/exynos4412.dtsi               |  38 ++
 arch/arm/dts/exynos4x12-pinctrl.dtsi       | 956 +++++++++++++++++++++++++++++
 arch/arm/dts/exynos4x12.dtsi               | 214 +++++++
 arch/arm/dts/exynos5.dtsi                  |  54 ++
 arch/arm/dts/exynos5250-pinctrl.dtsi       | 790 ++++++++++++++++++++++++
 arch/arm/dts/exynos5250.dtsi               |  38 ++
 arch/arm/dts/exynos54xx-pinctrl.dtsi       | 687 +++++++++++++++++++++
 arch/arm/dts/exynos54xx.dtsi               |  41 ++
 15 files changed, 3831 insertions(+), 4 deletions(-)
 create mode 100644 arch/arm/dts/exynos4210-pinctrl.dtsi
 create mode 100644 arch/arm/dts/exynos4210.dtsi
 create mode 100644 arch/arm/dts/exynos4412.dtsi
 create mode 100644 arch/arm/dts/exynos4x12-pinctrl.dtsi
 create mode 100644 arch/arm/dts/exynos4x12.dtsi
 create mode 100644 arch/arm/dts/exynos5250-pinctrl.dtsi
 create mode 100644 arch/arm/dts/exynos54xx-pinctrl.dtsi
arch/arm/dts/exynos4.dtsi +7 -0
index 6b83516..77fad48 100644
@@ -10,6 +10,13 @@
 #include "skeleton.dtsi"
 
 / {
+	combiner: interrupt-controller at 10440000 {
+		compatible = "samsung,exynos4210-combiner";
+		#interrupt-cells = <2>;
+		interrupt-controller;
+		reg = <0x10440000 0x1000>;
+	};
+
 	serial at 13800000 {
 		compatible = "samsung,exynos4210-uart";
 		reg = <0x13800000 0x3c>;
arch/arm/dts/exynos4210-origen.dts +1 -1
index 556a3a2..dd2476c 100644
@@ -9,7 +9,7 @@
 
 /dts-v1/;
 #include "skeleton.dtsi"
-#include "exynos4.dtsi"
+#include "exynos4210.dtsi"
 
 / {
 	model = "Insignal Origen evaluation board based on Exynos4210";
arch/arm/dts/exynos4210-pinctrl.dtsi new file +847 -0

847 lines not on this page · raw message

arch/arm/dts/exynos4210-trats.dts +1 -1
index 71202d0..81188bc 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-#include "exynos4.dtsi"
+#include "exynos4210.dtsi"
 
 / {
 	model = "Samsung Trats based on Exynos4210";
arch/arm/dts/exynos4210-universal_c210.dts +1 -1
index d30f131..cf3354f 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-#include "exynos4.dtsi"
+#include "exynos4210.dtsi"
 
 / {
 	model = "Samsung Universal C210 based on Exynos4210 rev0";
arch/arm/dts/exynos4210.dtsi new file +155 -0

155 lines not on this page · raw message

arch/arm/dts/exynos4412-trats2.dts +1 -1
index 9d22de7..3b1e458 100644
@@ -8,7 +8,7 @@
  */
 
 /dts-v1/;
-#include "exynos4.dtsi"
+#include "exynos4412.dtsi"
 
 / {
 	model = "Samsung Trats2 based on Exynos4412";
arch/arm/dts/exynos4412.dtsi new file +38 -0
new file mode 100644
index 0000000..87b339c
@@ -0,0 +1,38 @@
+/*
+ * Samsung's Exynos4412 SoC device tree source
+ *
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *		http://www.samsung.com
+ *
+ * Samsung's Exynos4412 SoC device nodes are listed in this file. Exynos4412
+ * based board files can include this file and provide values for board specfic
+ * bindings.
+ *
+ * Note: This file does not include device nodes for all the controllers in
+ * Exynos4412 SoC. As device tree coverage for Exynos4412 increases, additional
+ * nodes can be added to this file.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+*/
+
+#include "exynos4x12.dtsi"
+
+/ {
+	compatible = "samsung,exynos4412";
+
+	gic: interrupt-controller at 10490000 {
+		cpu-offset = <0x4000>;
+	};
+
+	interrupt-controller at 10440000 {
+		samsung,combiner-nr = <20>;
+		interrupts = <0 0 0>, <0 1 0>, <0 2 0>, <0 3 0>,
+			     <0 4 0>, <0 5 0>, <0 6 0>, <0 7 0>,
+			     <0 8 0>, <0 9 0>, <0 10 0>, <0 11 0>,
+			     <0 12 0>, <0 13 0>, <0 14 0>, <0 15 0>,
+			     <0 107 0>, <0 108 0>, <0 48 0>, <0 42 0>;
+	};
+
+};
arch/arm/dts/exynos4x12-pinctrl.dtsi new file +956 -0

956 lines not on this page · raw message

arch/arm/dts/exynos4x12.dtsi new file +214 -0

214 lines not on this page · raw message

arch/arm/dts/exynos5.dtsi +54 -0

66 lines not on this page · raw message

arch/arm/dts/exynos5250-pinctrl.dtsi new file +790 -0

679 lines not on this page · raw message

arch/arm/dts/exynos5250.dtsi +38 -0
index 771f8d3..16581dd 100644

Lines of this file are not shown. View the raw message.

arch/arm/dts/exynos54xx-pinctrl.dtsi new file +687 -0

687 lines not on this page · raw message

arch/arm/dts/exynos54xx.dtsi +41 -0

41 lines not on this page · raw message

The rest of this diff is not shown. View the raw message.

Signature · 1 line
2.1.0.rc2.206.gedb03e5

Part of the diff is not shown here. View the raw message.

#3 lore raw

PATCH v9 3/12 dm: exynos: dts: Remove unused pinctrl information to save space

In reply to Simon Glass

We don't include the pinctrl functions for U-Boot as they use up quite a bit of space and are not used.

We could instead perhaps eliminate this material with fdtgrep, but so far this tool has not made it to upstream.

---

Changes in v9: None
Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 arch/arm/dts/exynos4210-pinctrl.dtsi | 543 -------------------------------
 arch/arm/dts/exynos4x12-pinctrl.dtsi | 612 -----------------------------------
 arch/arm/dts/exynos4x12.dtsi         | 100 ------
 arch/arm/dts/exynos5250-pinctrl.dtsi | 459 --------------------------
 arch/arm/dts/exynos54xx-pinctrl.dtsi | 384 ----------------------
 5 files changed, 2098 deletions(-)
arch/arm/dts/exynos4210-pinctrl.dtsi +0 -543
index a7c2128..bda17f7 100644
@@ -144,281 +144,6 @@
 			#interrupt-cells = <2>;
 		};
 
-		uart0_data: uart0-data {
-			samsung,pins = "gpa0-0", "gpa0-1";
-			samsung,pin-function = <0x2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart0_fctl: uart0-fctl {
-			samsung,pins = "gpa0-2", "gpa0-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart1_data: uart1-data {
-			samsung,pins = "gpa0-4", "gpa0-5";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart1_fctl: uart1-fctl {
-			samsung,pins = "gpa0-6", "gpa0-7";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c2_bus: i2c2-bus {
-			samsung,pins = "gpa0-6", "gpa0-7";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart2_data: uart2-data {
-			samsung,pins = "gpa1-0", "gpa1-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart2_fctl: uart2-fctl {
-			samsung,pins = "gpa1-2", "gpa1-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart_audio_a: uart-audio-a {
-			samsung,pins = "gpa1-0", "gpa1-1";
-			samsung,pin-function = <4>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c3_bus: i2c3-bus {
-			samsung,pins = "gpa1-2", "gpa1-3";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart3_data: uart3-data {
-			samsung,pins = "gpa1-4", "gpa1-5";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		uart_audio_b: uart-audio-b {
-			samsung,pins = "gpa1-4", "gpa1-5";
-			samsung,pin-function = <4>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		spi0_bus: spi0-bus {
-			samsung,pins = "gpb-0", "gpb-2", "gpb-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c4_bus: i2c4-bus {
-			samsung,pins = "gpb-2", "gpb-3";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		spi1_bus: spi1-bus {
-			samsung,pins = "gpb-4", "gpb-6", "gpb-7";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c5_bus: i2c5-bus {
-			samsung,pins = "gpb-6", "gpb-7";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2s1_bus: i2s1-bus {
-			samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
-					"gpc0-4";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		pcm1_bus: pcm1-bus {
-			samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
-					"gpc0-4";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		ac97_bus: ac97-bus {
-			samsung,pins = "gpc0-0", "gpc0-1", "gpc0-2", "gpc0-3",
-					"gpc0-4";
-			samsung,pin-function = <4>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2s2_bus: i2s2-bus {
-			samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
-					"gpc1-4";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		pcm2_bus: pcm2-bus {
-			samsung,pins = "gpc1-0", "gpc1-1", "gpc1-2", "gpc1-3",
-					"gpc1-4";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		spdif_bus: spdif-bus {
-			samsung,pins = "gpc1-0", "gpc1-1";
-			samsung,pin-function = <4>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c6_bus: i2c6-bus {
-			samsung,pins = "gpc1-3", "gpc1-4";
-			samsung,pin-function = <4>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		spi2_bus: spi2-bus {
-			samsung,pins = "gpc1-1", "gpc1-2", "gpc1-3", "gpc1-4";
-			samsung,pin-function = <5>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c7_bus: i2c7-bus {
-			samsung,pins = "gpd0-2", "gpd0-3";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c0_bus: i2c0-bus {
-			samsung,pins = "gpd1-0", "gpd1-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		i2c1_bus: i2c1-bus {
-			samsung,pins = "gpd1-2", "gpd1-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <0>;
-		};
-
-		pwm0_out: pwm0-out {
-			samsung,pins = "gpd0-0";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		pwm1_out: pwm1-out {
-			samsung,pins = "gpd0-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		pwm2_out: pwm2-out {
-			samsung,pins = "gpd0-2";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		pwm3_out: pwm3-out {
-			samsung,pins = "gpd0-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_ctrl: lcd-ctrl {
-			samsung,pins = "gpd0-0", "gpd0-1";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_sync: lcd-sync {
-			samsung,pins = "gpf0-0", "gpf0-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_en: lcd-en {
-			samsung,pins = "gpe3-4";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_clk: lcd-clk {
-			samsung,pins = "gpf0-0", "gpf0-1", "gpf0-2", "gpf0-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_data16: lcd-data-width16 {
-			samsung,pins = "gpf0-7", "gpf1-0", "gpf1-1", "gpf1-2",
-					"gpf1-3", "gpf1-6", "gpf1-7", "gpf2-0",
-					"gpf2-1", "gpf2-2", "gpf2-3", "gpf2-7",
-					"gpf3-0", "gpf3-1", "gpf3-2", "gpf3-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_data18: lcd-data-width18 {
-			samsung,pins = "gpf0-6", "gpf0-7", "gpf1-0", "gpf1-1",
-					"gpf1-2", "gpf1-3", "gpf1-6", "gpf1-7",
-					"gpf2-0", "gpf2-1", "gpf2-2", "gpf2-3",
-					"gpf2-6", "gpf2-7", "gpf3-0", "gpf3-1",
-					"gpf3-2", "gpf3-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		lcd_data24: lcd-data-width24 {
-			samsung,pins = "gpf0-4", "gpf0-5", "gpf0-6", "gpf0-7",
-					"gpf1-0", "gpf1-1", "gpf1-2", "gpf1-3",
-					"gpf1-4", "gpf1-5", "gpf1-6", "gpf1-7",
-					"gpf2-0", "gpf2-1", "gpf2-2", "gpf2-3",
-					"gpf2-4", "gpf2-5", "gpf2-6", "gpf2-7",
-					"gpf3-0", "gpf3-1", "gpf3-2", "gpf3-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
 	};
 
 	pinctrl at 11000000 {
@@ -567,259 +292,6 @@
 			#interrupt-cells = <2>;
 		};
 
-		sd0_clk: sd0-clk {
-			samsung,pins = "gpk0-0";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd0_cmd: sd0-cmd {
-			samsung,pins = "gpk0-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd0_cd: sd0-cd {
-			samsung,pins = "gpk0-2";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd0_bus1: sd0-bus-width1 {
-			samsung,pins = "gpk0-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd0_bus4: sd0-bus-width4 {
-			samsung,pins = "gpk0-3", "gpk0-4", "gpk0-5", "gpk0-6";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd0_bus8: sd0-bus-width8 {
-			samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd4_clk: sd4-clk {
-			samsung,pins = "gpk0-0";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd4_cmd: sd4-cmd {
-			samsung,pins = "gpk0-1";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd4_cd: sd4-cd {
-			samsung,pins = "gpk0-2";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd4_bus1: sd4-bus-width1 {
-			samsung,pins = "gpk0-3";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd4_bus4: sd4-bus-width4 {
-			samsung,pins = "gpk0-3", "gpk0-4", "gpk0-5", "gpk0-6";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd4_bus8: sd4-bus-width8 {
-			samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <4>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd1_clk: sd1-clk {
-			samsung,pins = "gpk1-0";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd1_cmd: sd1-cmd {
-			samsung,pins = "gpk1-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd1_cd: sd1-cd {
-			samsung,pins = "gpk1-2";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd1_bus1: sd1-bus-width1 {
-			samsung,pins = "gpk1-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd1_bus4: sd1-bus-width4 {
-			samsung,pins = "gpk1-3", "gpk1-4", "gpk1-5", "gpk1-6";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd2_clk: sd2-clk {
-			samsung,pins = "gpk2-0";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd2_cmd: sd2-cmd {
-			samsung,pins = "gpk2-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd2_cd: sd2-cd {
-			samsung,pins = "gpk2-2";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd2_bus1: sd2-bus-width1 {
-			samsung,pins = "gpk2-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd2_bus4: sd2-bus-width4 {
-			samsung,pins = "gpk2-3", "gpk2-4", "gpk2-5", "gpk2-6";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd2_bus8: sd2-bus-width8 {
-			samsung,pins = "gpk3-3", "gpk3-4", "gpk3-5", "gpk3-6";
-			samsung,pin-function = <3>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd3_clk: sd3-clk {
-			samsung,pins = "gpk3-0";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd3_cmd: sd3-cmd {
-			samsung,pins = "gpk3-1";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd3_cd: sd3-cd {
-			samsung,pins = "gpk3-2";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd3_bus1: sd3-bus-width1 {
-			samsung,pins = "gpk3-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		sd3_bus4: sd3-bus-width4 {
-			samsung,pins = "gpk3-3", "gpk3-4", "gpk3-5", "gpk3-6";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <3>;
-			samsung,pin-drv = <3>;
-		};
-
-		eint0: ext-int0 {
-			samsung,pins = "gpx0-0";
-			samsung,pin-function = <0xf>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		eint8: ext-int8 {
-			samsung,pins = "gpx1-0";
-			samsung,pin-function = <0xf>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		eint15: ext-int15 {
-			samsung,pins = "gpx1-7";
-			samsung,pin-function = <0xf>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		eint16: ext-int16 {
-			samsung,pins = "gpx2-0";
-			samsung,pin-function = <0xf>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		eint31: ext-int31 {
-			samsung,pins = "gpx3-7";
-			samsung,pin-function = <0xf>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		cam_port_a_io: cam-port-a-io {
-			samsung,pins = "gpj0-0", "gpj0-1", "gpj0-2", "gpj0-3",
-					"gpj0-4", "gpj0-5", "gpj0-6", "gpj0-7",
-					"gpj1-0", "gpj1-1", "gpj1-2", "gpj1-4";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		cam_port_a_clk_active: cam-port-a-clk-active {
-			samsung,pins = "gpj1-3";
-			samsung,pin-function = <2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <3>;
-		};
-
-		cam_port_a_clk_idle: cam-port-a-clk-idle {
-			samsung,pins = "gpj1-3";
-			samsung,pin-function = <0>;
-			samsung,pin-pud = <1>;
-			samsung,pin-drv = <0>;
-		};
 	};
 
 	pinctrl at 03860000 {
@@ -828,20 +300,5 @@
 			#gpio-cells = <2>;
 		};
 
-		i2s0_bus: i2s0-bus {
-			samsung,pins = "gpz-0", "gpz-1", "gpz-2", "gpz-3",
-					"gpz-4", "gpz-5", "gpz-6";
-			samsung,pin-function = <0x2>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
-
-		pcm0_bus: pcm0-bus {
-			samsung,pins = "gpz-0", "gpz-1", "gpz-2", "gpz-3",
-					"gpz-4";
-			samsung,pin-function = <0x3>;
-			samsung,pin-pud = <0>;
-			samsung,pin-drv = <0>;
-		};
 	};
 };
arch/arm/dts/exynos4x12-pinctrl.dtsi +0 -612

635 lines not on this page · raw message

arch/arm/dts/exynos4x12.dtsi +0 -100

112 lines not on this page · raw message

arch/arm/dts/exynos5250-pinctrl.dtsi +0 -459

482 lines not on this page · raw message

arch/arm/dts/exynos54xx-pinctrl.dtsi +0 -384

413 lines not on this page · raw message

Signature · 1 line
2.1.0.rc2.206.gedb03e5
#4 lore raw

PATCH v9 4/12 dm: exynos: dts: Adjust device tree files for U-Boot

In reply to Simon Glass

The pinctrl bindings used by Linux are an incomplete description of the hardware. It is possible in most cases to determine the register address of each, but not in all cases. By adding an additional property we can fix this, and avoid adding a table to U-Boot for every single Exynos SOC.

---

Changes in v9: None
Changes in v8:
- Add missing special case reg property for exynos5420 GPX0

Changes in v7: None
Changes in v6:
- Move U-Boot changes into their own file
- Use exynos54xx everywhere instead of exynos5420

Changes in v5: None
Changes in v4: None

 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi | 27 ++++++++++++++++++
 arch/arm/dts/exynos4210-pinctrl.dtsi       |  2 ++
 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi | 46 ++++++++++++++++++++++++++++++
 arch/arm/dts/exynos4x12-pinctrl.dtsi       |  2 ++
 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi | 40 ++++++++++++++++++++++++++
 arch/arm/dts/exynos5250-pinctrl.dtsi       |  2 ++
 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi | 40 ++++++++++++++++++++++++++
 arch/arm/dts/exynos54xx-pinctrl.dtsi       |  2 ++
 arch/arm/dts/exynos54xx.dtsi               |  1 +
 9 files changed, 162 insertions(+)
 create mode 100644 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi
 create mode 100644 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi
arch/arm/dts/exynos4210-pinctrl-uboot.dtsi new file +27 -0
new file mode 100644
index 0000000..ee071c1
@@ -0,0 +1,27 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/{
+	pinctrl_0: pinctrl at 11400000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		compatible = "samsung,exynos4210-pinctrl";
+	};
+
+	pinctrl_1: pinctrl at 11000000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		gpy0: gpy0 {
+			reg = <0xc00>;
+		};
+	};
+
+	pinctrl_2: pinctrl at 03860000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+
+};
arch/arm/dts/exynos4210-pinctrl.dtsi +2 -0
index bda17f7..87f162b 100644
@@ -14,6 +14,8 @@
  * published by the Free Software Foundation.
 */
 
+#include "exynos4210-pinctrl-uboot.dtsi"
+
 / {
 	pinctrl at 11400000 {
 		gpa0: gpa0 {
arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi new file +46 -0

46 lines not on this page · raw message

arch/arm/dts/exynos4x12-pinctrl.dtsi +2 -0
index 93f3998..f40de1f 100644
@@ -12,6 +12,8 @@
  * published by the Free Software Foundation.
 */
 
+#include "exynos4x12-pinctrl-uboot.dtsi"
+
 / {
 	pinctrl at 11400000 {
 		gpa0: gpa0 {
arch/arm/dts/exynos5250-pinctrl-uboot.dtsi new file +40 -0
new file mode 100644
index 0000000..7edb0ca
@@ -0,0 +1,40 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/{
+	pinctrl_0: pinctrl at 11400000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		gpc4: gpc4 {
+			reg = <0x2e0>;
+		};
+		gpx0: gpx0 {
+			reg = <0xc00>;
+		};
+	};
+
+	pinctrl_1: pinctrl at 13400000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+
+	pinctrl_2: pinctrl at 10d10000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		gpv2: gpv2 {
+			reg = <0x060>;
+		};
+		gpv4: gpv4 {
+			reg = <0xc0>;
+		};
+	};
+
+	pinctrl_3: pinctrl at 03860000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+
+};
arch/arm/dts/exynos5250-pinctrl.dtsi +2 -0
index 67755a1..706b888 100644
@@ -12,6 +12,8 @@
  * published by the Free Software Foundation.
 */
 
+#include "exynos5250-pinctrl-uboot.dtsi"
+
 / {
 	pinctrl at 11400000 {
 		gpa0: gpa0 {
arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi new file +40 -0
new file mode 100644
index 0000000..5a86211
@@ -0,0 +1,40 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/{
+	/*
+	 * Replicate the ordering of arch/arm/include/asm/arch-exynos/gpio.h
+	 * TODO(sjg at chromium.org): This ordering ceases to matter once GPIO
+	 * numbers are not needed in U-Boot for exynos.
+	 */
+	pinctrl at 14010000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+	pinctrl at 13400000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		gpy7 {
+		};
+
+		gpx0 {
+			reg = <0xc00>;
+		};
+	};
+	pinctrl at 13410000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+	pinctrl at 14000000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+	pinctrl at 03860000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+
+};
arch/arm/dts/exynos54xx-pinctrl.dtsi +2 -0
index b3e63d1..775d956 100644
@@ -12,6 +12,8 @@
  * published by the Free Software Foundation.
 */
 
+#include "exynos54xx-pinctrl-uboot.dtsi"
+
 / {
 	pinctrl at 13400000 {
 		gpy7: gpy7 {
arch/arm/dts/exynos54xx.dtsi +1 -0
index 887b034..916cf3a 100644
@@ -6,6 +6,7 @@
  */
 
 #include "exynos5.dtsi"
+#include "exynos54xx-pinctrl.dtsi"
 
 / {
 	config {
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#5 lore raw

PATCH v9 4/12 dm: exynos: dts: Adjust device tree files for U-Boot

Hello Simon,

Quoted 36 lines · Simon Glass

The pinctrl bindings used by Linux are an incomplete description of the hardware. It is possible in most cases to determine the register address of each, but not in all cases. By adding an additional property we can fix this, and avoid adding a table to U-Boot for every single Exynos SOC.

---

Changes in v9: None
Changes in v8:
- Add missing special case reg property for exynos5420 GPX0

Changes in v7: None
Changes in v6:
- Move U-Boot changes into their own file
- Use exynos54xx everywhere instead of exynos5420

Changes in v5: None
Changes in v4: None

  arch/arm/dts/exynos4210-pinctrl-uboot.dtsi | 27 ++++++++++++++++++
  arch/arm/dts/exynos4210-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi | 46 ++++++++++++++++++++++++++++++
  arch/arm/dts/exynos4x12-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos5250-pinctrl-uboot.dtsi | 40 ++++++++++++++++++++++++++
  arch/arm/dts/exynos5250-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi | 40 ++++++++++++++++++++++++++
  arch/arm/dts/exynos54xx-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos54xx.dtsi               |  1 +
  9 files changed, 162 insertions(+)

create mode 100644 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi

... snip ...

Quoted 19 lines
arch/arm/dts/exynos4210-pinctrl.dtsi +2 -0
index bda17f7..87f162b 100644
@@ -14,6 +14,8 @@
   * published by the Free Software Foundation.
  */
 
+#include "exynos4210-pinctrl-uboot.dtsi"
+
  / {
  	pinctrl at 11400000 {
  		gpa0: gpa0 {
arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi new file +0 -0
new file mode 100644
index 0000000..c02796d

arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi line 10

Quoted 10 lines
arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi new file +10 -0
@@ -0,0 +1,46 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/{
+	pinctrl_0: pinctrl at 11400000 {
+		#address-cells = <1>;
+		#size-cells = <0>;

The first issue with Exynos GPIO driver starts here. If you put pinctrl* node data in a separated file, then the order of nodes in dtb is changed. So for the pinctrl 0, the first subnode is gpf0, instead of gpa0. And the same is for other pinctrls.

This means that function gpio_exynos_bind(), which expects proper subnodes order assign wrong base addresses to some GPIO pins.

Move "reg" properties into arch/arm/dts/exynos4x12-pinctrl.dtsi fixes this issue. But in this case, the file *-pinctrl-uboot.dtsi is quite useless - since the cells size can be moved to pinctrl.dtsi too.

This probably will touch all *pinctrl-uboot.dtsi files.

#6 lore raw

PATCH v9 4/12 dm: exynos: dts: Adjust device tree files for U-Boot

Hi,

Quoted 86 lines · Przemyslaw Marczak

Hello Simon,

Quoted 40 lines · Simon Glass

The pinctrl bindings used by Linux are an incomplete description of the hardware. It is possible in most cases to determine the register address of each, but not in all cases. By adding an additional property we can fix this, and avoid adding a table to U-Boot for every single Exynos SOC.

---

Changes in v9: None
Changes in v8:
- Add missing special case reg property for exynos5420 GPX0

Changes in v7: None
Changes in v6:
- Move U-Boot changes into their own file
- Use exynos54xx everywhere instead of exynos5420

Changes in v5: None
Changes in v4: None

  arch/arm/dts/exynos4210-pinctrl-uboot.dtsi | 27 ++++++++++++++++++
  arch/arm/dts/exynos4210-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi | 46
++++++++++++++++++++++++++++++
  arch/arm/dts/exynos4x12-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos5250-pinctrl-uboot.dtsi | 40
++++++++++++++++++++++++++
  arch/arm/dts/exynos5250-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi | 40
++++++++++++++++++++++++++
  arch/arm/dts/exynos54xx-pinctrl.dtsi       |  2 ++
  arch/arm/dts/exynos54xx.dtsi               |  1 +
  9 files changed, 162 insertions(+)

create mode 100644 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi

... snip ...

Quoted 21 lines
arch/arm/dts/exynos4210-pinctrl.dtsi +2 -0
index bda17f7..87f162b 100644
@@ -14,6 +14,8 @@
   * published by the Free Software Foundation.
  */
 
+#include "exynos4210-pinctrl-uboot.dtsi"
+
  / {
        pinctrl at 11400000 {
                gpa0: gpa0 {
arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi new file +0 -0
new file mode 100644
index 0000000..c02796d

arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi line 10

Quoted 10 lines
arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi new file +10 -0
@@ -0,0 +1,46 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/{
+       pinctrl_0: pinctrl at 11400000 {
+               #address-cells = <1>;
+               #size-cells = <0>;

The first issue with Exynos GPIO driver starts here. If you put pinctrl* node data in a separated file, then the order of nodes in dtb is changed. So for the pinctrl 0, the first subnode is gpf0, instead of gpa0. And the same is for other pinctrls.

Quoted 8 lines

This means that function gpio_exynos_bind(), which expects proper subnodes order assign wrong base addresses to some GPIO pins.

Move "reg" properties into arch/arm/dts/exynos4x12-pinctrl.dtsi fixes this issue. But in this case, the file *-pinctrl-uboot.dtsi is quite useless - since the cells size can be moved to pinctrl.dtsi too.

This probably will touch all *pinctrl-uboot.dtsi files.

Yes this was a mistake in the series. I have pushed an updated series to u-boot-dm/next. I will go through your comments as well before I see if a new series is warranted, or just a few patch updates.

Regards,
Simon

#7 lore raw

PATCH v9 5/12 dm: exynos: Add pinctrl settings for smdkc100

In reply to Simon Glass

These describe the GPIOs in enough detail for U-Boot's GPIO driver to operate.

---

Changes in v9: None
Changes in v8:
- Add patch containing pinctrl settings for s5p_goni

Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 arch/arm/dts/s5pc100-pinctrl.dtsi | 180 ++++++++++++++++++++++++++++++++++++++
 arch/arm/dts/s5pc1xx-smdkc100.dts |   7 ++
 2 files changed, 187 insertions(+)
 create mode 100644 arch/arm/dts/s5pc100-pinctrl.dtsi
arch/arm/dts/s5pc100-pinctrl.dtsi new file +180 -0
new file mode 100644
index 0000000..bd9f97c
@@ -0,0 +1,180 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/ {
+	pinctrl at e0300000 {
+		gpa0: gpa0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpa1: gpa1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpb: gpb {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpc: gpc {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpd: gpd {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpe0: gpe0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpe1: gpe1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf0: gpf0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf1: gpf1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf2: gpf2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf3: gpf3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg0: gpg0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg1: gpg1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg2: gpg2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg3: gpg3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpi: gpi {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj0: gpj0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj1: gpj1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj2: gpj2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj3: gpj3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj4: gpj4 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpk0: gpk0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpk1: gpk1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpk2: gpk2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpk3: gpk3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpl0: gpl0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpl1: gpl1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpl2: gpl2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpl3: gpl3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpl4: gpl4 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph0: gph0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph1: gph1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph2: gph2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph3: gph3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+	};
+};
arch/arm/dts/s5pc1xx-smdkc100.dts +7 -0
index 42754ce..95f15ed 100644
@@ -9,6 +9,7 @@
 /dts-v1/;
 
 #include "skeleton.dtsi"
+#include "s5pc100-pinctrl.dtsi"
 
 / {
 	model = "Samsung SMDKC100 based on S5PC100";
@@ -17,6 +18,12 @@
 	aliases {
 		serial0 = "/serial at ec000000";
 		console = "/serial at ec000000";
+		pinctrl0 = &pinctrl0;
+	};
+
+	pinctrl0: pinctrl at e0300000 {
+		compatible = "samsung,s5pc100-pinctrl";
+		reg = <0xe0200000 0x1000>;
 	};
 
 	serial at ec000000 {
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#8 lore raw

PATCH v9 6/12 dm: exynos: Add pinctrl settings for s5p_goni

In reply to Simon Glass

These describe the GPIOs in enough detail for U-Boot's GPIO driver to operate.

---

Changes in v9:
- Change compatible string to s5pc110-pinctrl for s5p_goni

Changes in v8:
- Add patch containing pinctrl settings for s5p_goni

Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 arch/arm/dts/s5pc110-pinctrl.dtsi | 273 ++++++++++++++++++++++++++++++++++++++
 arch/arm/dts/s5pc1xx-goni.dts     |   7 +
 2 files changed, 280 insertions(+)
 create mode 100644 arch/arm/dts/s5pc110-pinctrl.dtsi
arch/arm/dts/s5pc110-pinctrl.dtsi new file +273 -0
new file mode 100644
index 0000000..d21b6ab
@@ -0,0 +1,273 @@
+/*
+ * U-Boot additions to enable a generic Exynos GPIO driver
+ *
+ * Copyright (c) 2014 Google, Inc
+ */
+
+/ {
+	pinctrl at e0200000 {
+		#address-cells = <1>;
+		#size-cells = <0>;
+		gpa0: gpa0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpa1: gpa1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpb: gpb {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpc0: gpc0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpc1: gpc1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpd0: gpd0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpd1: gpd1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpe0: gpe0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpe1: gpe1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf0: gpf0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf1: gpf1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf2: gpf2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpf3: gpf3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg0: gpg0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg1: gpg1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg2: gpg2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpg3: gpg3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpi: gpi {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj0: gpj0 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj1: gpj1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj2: gpj2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj3: gpj3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpj4: gpj4 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp01: gpmp01 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp02: gpmp02 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp03: gpmp03 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp04: gpmp04 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp05: gpmp05 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp06: gpmp06 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp07: gpmp07 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp10: gpmp10 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp11: gpmp11 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp12: gpmp12 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp13: gpmp13 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp14: gpmp14 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp15: gpmp15 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp16: gpmp16 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp17: gpmp17 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp18: gpmp18 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp20: gpmp20 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp21: gpmp21 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp22: gpmp22 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp23: gpmp23 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp24: gpmp24 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp25: gpmp25 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp26: gpmp26 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp27: gpmp27 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gpmp28: gpmp28 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph0: gph0 {
+			reg = <0xc00>;
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph1: gph1 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph2: gph2 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+		gph3: gph3 {
+			gpio-controller;
+			#gpio-cells = <2>;
+		};
+
+	};
+};
arch/arm/dts/s5pc1xx-goni.dts +7 -0
index 2e671bb..7bbfe59 100644
@@ -9,6 +9,7 @@
 /dts-v1/;
 
 #include "skeleton.dtsi"
+#include "s5pc110-pinctrl.dtsi"
 
 / {
 	model = "Samsung Goni based on S5PC110";
@@ -17,6 +18,12 @@
 	aliases {
 		serial2 = "/serial at e2900800";
 		console = "/serial at e2900800";
+		pinctrl0 = &pinctrl0;
+	};
+
+	pinctrl0: pinctrl at e0200000 {
+		compatible = "samsung,s5pc110-pinctrl";
+		reg = <0xe0200000 0x1000>;
 	};
 
 	serial at e2900800 {
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#9 lore raw

PATCH v9 7/12 dm: exynos: Move smdkc100 to generic board

In reply to Simon Glass

The generic board deadline is approaching, and we need this feature to enable driver model. Enable CONFIG_SYS_GENERIC_BOARD for smdkc100.

---

Changes in v9: None
Changes in v8:
- Add new patch to move smdkc100 to generic board

Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 include/configs/smdkc100.h | 2 ++
 1 file changed, 2 insertions(+)
include/configs/smdkc100.h +2 -0
index 22835ff..a7eb33e 100644
@@ -223,4 +223,6 @@
 
 #define CONFIG_OF_LIBFDT
 
+#define CONFIG_SYS_GENERIC_BOARD
+
 #endif	/* __CONFIG_H */
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#10 lore raw

PATCH v9 8/12 dm: exynos: Move s5p_goni to generic board

In reply to Simon Glass

The generic board deadline is approaching, and we need this feature to enable driver model. Enable CONFIG_SYS_GENERIC_BOARD for s5p_goni.

---

Changes in v9: None
Changes in v8:
- Add new patch to move s5p_goni to generic board

Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 include/configs/s5p_goni.h | 2 ++
 1 file changed, 2 insertions(+)
include/configs/s5p_goni.h +2 -0
index 0c6e9c7..fa0e737 100644
@@ -286,4 +286,6 @@
 
 #define CONFIG_OF_LIBFDT
 
+#define CONFIG_SYS_GENERIC_BOARD
+
 #endif	/* __CONFIG_H */
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#11 lore raw

PATCH v9 9/12 dm: exynos: Tidy up GPIO headers

In reply to Simon Glass

The wrong header is being included, thus requiring the code to re-declare the generic GPIO interface in each GPIO header.

Fix this.

---

Changes in v9: None
Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 arch/arm/cpu/armv7/exynos/pinmux.c       | 2 +-
 arch/arm/include/asm/arch-exynos/gpio.h  | 5 -----
 arch/arm/include/asm/arch-s5pc1xx/gpio.h | 4 ----
 board/samsung/arndale/arndale.c          | 2 +-
 board/samsung/common/board.c             | 2 +-
 board/samsung/common/misc.c              | 1 -
 board/samsung/goni/goni.c                | 2 +-
 board/samsung/origen/origen.c            | 2 +-
 board/samsung/smdk5420/smdk5420.c        | 2 +-
 board/samsung/smdkc100/smdkc100.c        | 2 +-
 board/samsung/smdkv310/smdkv310.c        | 2 +-
 board/samsung/trats/trats.c              | 2 +-
 board/samsung/trats2/trats2.c            | 1 +
 board/samsung/universal_c210/universal.c | 1 -
 drivers/gpio/s5p_gpio.c                  | 3 +--
 15 files changed, 11 insertions(+), 22 deletions(-)
arch/arm/cpu/armv7/exynos/pinmux.c +1 -1
index b929486..2caeb3e 100644
@@ -7,7 +7,7 @@
 
 #include <common.h>
 #include <fdtdec.h>
-#include <asm/arch/gpio.h>
+#include <asm/gpio.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/sromc.h>
 
arch/arm/include/asm/arch-exynos/gpio.h +0 -5
index 8fb5c23..ba169b9 100644
@@ -1504,12 +1504,7 @@ static const struct gpio_name_num_table exynos5420_gpio_table[] = {
 void gpio_cfg_pin(int gpio, int cfg);
 void gpio_set_pull(int gpio, int mode);
 void gpio_set_drv(int gpio, int mode);
-int gpio_direction_input(unsigned gpio);
-int gpio_direction_output(unsigned gpio, int value);
-int gpio_set_value(unsigned gpio, int value);
-int gpio_get_value(unsigned gpio);
 void gpio_set_rate(int gpio, int mode);
-struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned gpio);
 int s5p_gpio_get_pin(unsigned gpio);
 #endif
 
arch/arm/include/asm/arch-s5pc1xx/gpio.h +0 -4
index d5dbc22..bd6f2d2 100644
@@ -815,11 +815,7 @@ static const struct gpio_name_num_table s5pc110_gpio_table[] = {
 void gpio_cfg_pin(int gpio, int cfg);
 void gpio_set_pull(int gpio, int mode);
 void gpio_set_drv(int gpio, int mode);
-int gpio_direction_output(unsigned gpio, int value);
-int gpio_set_value(unsigned gpio, int value);
-int gpio_get_value(unsigned gpio);
 void gpio_set_rate(int gpio, int mode);
-struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned gpio);
 int s5p_gpio_get_pin(unsigned gpio);
 
 /* GPIO pins per bank  */
board/samsung/arndale/arndale.c +1 -1
index 83fd3bd..e39795d 100644
@@ -6,9 +6,9 @@
 
 #include <common.h>
 #include <usb.h>
+#include <asm/gpio.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/dwmmc.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/power.h>
 
 DECLARE_GLOBAL_DATA_PTR;
board/samsung/common/board.c +1 -1
index 5c3c5bb..c119641 100644
@@ -13,10 +13,10 @@
 #include <tmu.h>
 #include <netdev.h>
 #include <asm/io.h>
+#include <asm/gpio.h>
 #include <asm/arch/board.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/dwmmc.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/power.h>
board/samsung/common/misc.c +0 -1
index 8766f0c..b935922 100644
@@ -14,7 +14,6 @@
 #include <malloc.h>
 #include <linux/sizes.h>
 #include <asm/arch/cpu.h>
-#include <asm/arch/gpio.h>
 #include <asm/gpio.h>
 #include <linux/input.h>
 #include <power/pmic.h>
board/samsung/goni/goni.c +1 -1
index eb0f9bf..01be714 100644
@@ -7,7 +7,7 @@
  */
 
 #include <common.h>
-#include <asm/arch/gpio.h>
+#include <asm/gpio.h>
 #include <asm/arch/mmc.h>
 #include <power/pmic.h>
 #include <usb/s3c_udc.h>
board/samsung/origen/origen.c +1 -1
index a539267..99a2fac 100644
@@ -6,8 +6,8 @@
 
 #include <common.h>
 #include <asm/io.h>
+#include <asm/gpio.h>
 #include <asm/arch/cpu.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/periph.h>
 #include <asm/arch/pinmux.h>
board/samsung/smdk5420/smdk5420.c +1 -1
index 270ee83..47998ab 100644
@@ -11,9 +11,9 @@
 #include <lcd.h>
 #include <spi.h>
 #include <errno.h>
+#include <asm/gpio.h>
 #include <asm/arch/board.h>
 #include <asm/arch/cpu.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/system.h>
 #include <asm/arch/dp_info.h>
board/samsung/smdkc100/smdkc100.c +1 -1
index e009564..66b6a98 100644
@@ -7,9 +7,9 @@
  */
 
 #include <common.h>
+#include <asm/gpio.h>
 #include <asm/io.h>
 #include <asm/arch/sromc.h>
-#include <asm/arch/gpio.h>
 #include <netdev.h>
 
 DECLARE_GLOBAL_DATA_PTR;
board/samsung/smdkv310/smdkv310.c +1 -1
index 8eca358..cb7f9b0 100644
@@ -5,10 +5,10 @@
  */
 
 #include <common.h>
+#include <asm/gpio.h>
 #include <asm/io.h>
 #include <netdev.h>
 #include <asm/arch/cpu.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/periph.h>
 #include <asm/arch/pinmux.h>
board/samsung/trats/trats.c +1 -1
index 3dd340b..9e76b5d 100644
@@ -10,8 +10,8 @@
 #include <common.h>
 #include <lcd.h>
 #include <asm/io.h>
+#include <asm/gpio.h>
 #include <asm/arch/cpu.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/clock.h>
 #include <asm/arch/mipi_dsim.h>
board/samsung/trats2/trats2.c +1 -0
index fa26e61..2924ee6 100644
@@ -8,6 +8,7 @@
 
 #include <common.h>
 #include <lcd.h>
+#include <asm/gpio.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/power.h>
 #include <asm/arch/mipi_dsim.h>
board/samsung/universal_c210/universal.c +0 -1
index 47e7f53..f9d3325 100644
@@ -12,7 +12,6 @@
 #include <asm/io.h>
 #include <asm/gpio.h>
 #include <asm/arch/adc.h>
-#include <asm/arch/gpio.h>
 #include <asm/arch/pinmux.h>
 #include <asm/arch/watchdog.h>
 #include <ld9040.h>
drivers/gpio/s5p_gpio.c +1 -2
index db7b673..aa60188 100644
@@ -8,7 +8,6 @@
 #include <common.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
-#include <asm/arch/gpio.h>
 
 #define S5P_GPIO_GET_PIN(x)	(x % GPIO_PER_BANK)
 
@@ -222,7 +221,7 @@ static void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int gpio, int mode)
 	writel(value, &bank->drv);
 }
 
-struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned int gpio)
+static struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned int gpio)
 {
 	const struct gpio_info *data;
 	unsigned int upto;
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#12 lore raw

PATCH v9 10/12 dm: exynos: Tidy up GPIO defines

In reply to Simon Glass

The defines at the top of the GPIO driver use single-character names for parameters which are not very descriptive.

Improve these to use descriptive parameter names.

---

Changes in v9: None
Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5: None
Changes in v4: None

 drivers/gpio/s5p_gpio.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)
drivers/gpio/s5p_gpio.c +11 -10
index aa60188..99f2dd8 100644
@@ -11,19 +11,20 @@
 
 #define S5P_GPIO_GET_PIN(x)	(x % GPIO_PER_BANK)
 
-#define CON_MASK(x)		(0xf << ((x) << 2))
-#define CON_SFR(x, v)		((v) << ((x) << 2))
+#define CON_MASK(val)			(0xf << ((val) << 2))
+#define CON_SFR(gpio, cfg)		((cfg) << ((gpio) << 2))
+#define CON_SFR_UNSHIFT(val, gpio)	((val) >> ((gpio) << 2))
 
-#define DAT_MASK(x)		(0x1 << (x))
-#define DAT_SET(x)		(0x1 << (x))
+#define DAT_MASK(gpio)			(0x1 << (gpio))
+#define DAT_SET(gpio)			(0x1 << (gpio))
 
-#define PULL_MASK(x)		(0x3 << ((x) << 1))
-#define PULL_MODE(x, v)		((v) << ((x) << 1))
+#define PULL_MASK(gpio)		(0x3 << ((gpio) << 1))
+#define PULL_MODE(gpio, pull)		((pull) << ((gpio) << 1))
 
-#define DRV_MASK(x)		(0x3 << ((x) << 1))
-#define DRV_SET(x, m)		((m) << ((x) << 1))
-#define RATE_MASK(x)		(0x1 << (x + 16))
-#define RATE_SET(x)		(0x1 << (x + 16))
+#define DRV_MASK(gpio)			(0x3 << ((gpio) << 1))
+#define DRV_SET(gpio, mode)		((mode) << ((gpio) << 1))
+#define RATE_MASK(gpio)		(0x1 << (gpio + 16))
+#define RATE_SET(gpio)			(0x1 << (gpio + 16))
 
 #define name_to_gpio(n) s5p_name_to_gpio(n)
 static inline int s5p_name_to_gpio(const char *name)
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#13 lore raw

PATCH v9 11/12 dm: exynos: Make sure that GPIOs are requested

In reply to Simon Glass

With driver model GPIOs must be requested before use. Make sure this is done correctly.

(Note that the soft SPI part of universal is omitted, since this driver is about to be replaced with a driver-model-aware version)

---

Changes in v9: None
Changes in v8: None
Changes in v7: None
Changes in v6: None
Changes in v5:
- Add additional gpio_request() calls for other samsung boards
- Use a mask instead of division in gpio_request() naming call

Changes in v4: None

 arch/arm/cpu/armv7/exynos/pinmux.c       |  3 +++
 board/samsung/arndale/arndale.c          |  2 ++
 board/samsung/common/misc.c              |  2 ++
 board/samsung/goni/goni.c                |  2 ++
 board/samsung/smdk5250/exynos5-dt.c      |  7 +++++++
 board/samsung/smdk5420/smdk5420.c        |  4 ++++
 board/samsung/trats/trats.c              | 15 ++++++++++++---
 board/samsung/trats2/trats2.c            | 26 +++++++++++++++++++++-----
 board/samsung/universal_c210/universal.c |  3 +++
 drivers/mmc/s5p_sdhci.c                  |  7 ++++++-
 10 files changed, 62 insertions(+), 9 deletions(-)
arch/arm/cpu/armv7/exynos/pinmux.c +3 -0
index 2caeb3e..3d95dc3 100644
@@ -172,6 +172,9 @@ static int exynos5420_mmc_config(int peripheral, int flags)
 		 * this same assumption.
 		 */
 		if ((peripheral == PERIPH_ID_SDMMC0) && (i == (start + 2))) {
+#ifndef CONFIG_SPL_BUILD
+			gpio_request(i, "sdmmc0_vdden");
+#endif
 			gpio_set_value(i, 1);
 			gpio_cfg_pin(i, S5P_GPIO_OUTPUT);
 		} else {
board/samsung/arndale/arndale.c +2 -0
index e39795d..881d080 100644
@@ -19,6 +19,8 @@ int board_usb_init(int index, enum usb_init_type init)
 	/* Configure gpios for usb 3503 hub:
 	 * disconnect, toggle reset and connect
 	 */
+	gpio_request(EXYNOS5_GPIO_D17, "usb_connect");
+	gpio_request(EXYNOS5_GPIO_X35, "usb_reset");
 	gpio_direction_output(EXYNOS5_GPIO_D17, 0);
 	gpio_direction_output(EXYNOS5_GPIO_X35, 0);
 
board/samsung/common/misc.c +2 -0
index b935922..4538ac7 100644
@@ -411,6 +411,8 @@ void check_boot_mode(void)
 void keys_init(void)
 {
 	/* Set direction to input */
+	gpio_request(KEY_VOL_UP_GPIO, "volume-up");
+	gpio_request(KEY_VOL_DOWN_GPIO, "volume-down");
 	gpio_direction_input(KEY_VOL_UP_GPIO);
 	gpio_direction_input(KEY_VOL_DOWN_GPIO);
 }
board/samsung/goni/goni.c +2 -0
index 01be714..22f4995 100644
@@ -80,6 +80,7 @@ int board_mmc_init(bd_t *bis)
 	int i, ret, ret_sd = 0;
 
 	/* MASSMEMORY_EN: XMSMDATA7: GPJ2[7] output high */
+	gpio_request(S5PC110_GPIO_J27, "massmemory_en");
 	gpio_direction_output(S5PC110_GPIO_J27, 1);
 
 	/*
@@ -108,6 +109,7 @@ int board_mmc_init(bd_t *bis)
 	 * SD card (T_FLASH) detect and init
 	 * T_FLASH_DETECT: EINT28: GPH3[4] input mode
 	 */
+	gpio_request(S5PC110_GPIO_H34, "t_flash_detect");
 	gpio_cfg_pin(S5PC110_GPIO_H34, S5P_GPIO_INPUT);
 	gpio_set_pull(S5PC110_GPIO_H34, S5P_GPIO_PULL_UP);
 
board/samsung/smdk5250/exynos5-dt.c +7 -0
index d6ce133..53ff706 100644
@@ -29,6 +29,7 @@ DECLARE_GLOBAL_DATA_PTR;
 static void board_enable_audio_codec(void)
 {
 	/* Enable MAX98095 Codec */
+	gpio_request(EXYNOS5_GPIO_X17, "max98095_enable");
 	gpio_direction_output(EXYNOS5_GPIO_X17, 1);
 	gpio_set_pull(EXYNOS5_GPIO_X17, S5P_GPIO_PULL_NONE);
 }
@@ -199,16 +200,19 @@ static int board_dp_bridge_setup(void)
 	/* Setup the GPIOs */
 
 	/* PD is ACTIVE_LOW, and initially de-asserted */
+	gpio_request(EXYNOS5_GPIO_Y25, "dp_bridge_pd");
 	gpio_set_pull(EXYNOS5_GPIO_Y25, S5P_GPIO_PULL_NONE);
 	gpio_direction_output(EXYNOS5_GPIO_Y25, 1);
 
 	/* Reset is ACTIVE_LOW */
+	gpio_request(EXYNOS5_GPIO_X15, "dp_bridge_reset");
 	gpio_set_pull(EXYNOS5_GPIO_X15, S5P_GPIO_PULL_NONE);
 	gpio_direction_output(EXYNOS5_GPIO_X15, 0);
 
 	udelay(10);
 	gpio_set_value(EXYNOS5_GPIO_X15, 1);
 
+	gpio_request(EXYNOS5_GPIO_X07, "dp_bridge_hpd");
 	gpio_direction_input(EXYNOS5_GPIO_X07);
 
 	/*
@@ -236,10 +240,12 @@ static int board_dp_bridge_setup(void)
 void exynos_cfg_lcd_gpio(void)
 {
 	/* For Backlight */
+	gpio_request(EXYNOS5_GPIO_B20, "lcd_backlight");
 	gpio_cfg_pin(EXYNOS5_GPIO_B20, S5P_GPIO_OUTPUT);
 	gpio_set_value(EXYNOS5_GPIO_B20, 1);
 
 	/* LCD power on */
+	gpio_request(EXYNOS5_GPIO_X15, "lcd_power");
 	gpio_cfg_pin(EXYNOS5_GPIO_X15, S5P_GPIO_OUTPUT);
 	gpio_set_value(EXYNOS5_GPIO_X15, 1);
 
@@ -276,6 +282,7 @@ void exynos_backlight_on(unsigned int on)
 	mdelay(10);
 
 	/* board_dp_backlight_en */
+	gpio_request(EXYNOS5_GPIO_X30, "board_dp_backlight_en");
 	gpio_direction_output(EXYNOS5_GPIO_X30, 1);
 #endif
 }
board/samsung/smdk5420/smdk5420.c +4 -0
index 47998ab..a691222 100644
@@ -74,9 +74,12 @@ void exynos_lcd_power_on(void)
 	mdelay(5);
 
 	/* TODO(ajaykumar.rs at samsung.com): Use device tree */
+	gpio_request(EXYNOS5420_GPIO_X35, "edp_slp#");
 	gpio_direction_output(EXYNOS5420_GPIO_X35, 1);	/* EDP_SLP# */
 	mdelay(10);
+	gpio_request(EXYNOS5420_GPIO_Y77, "edp_rst#");
 	gpio_direction_output(EXYNOS5420_GPIO_Y77, 1);	/* EDP_RST# */
+	gpio_request(EXYNOS5420_GPIO_X26, "edp_hpd");
 	gpio_direction_input(EXYNOS5420_GPIO_X26);	/* EDP_HPD */
 	gpio_set_pull(EXYNOS5420_GPIO_X26, S5P_GPIO_PULL_NONE);
 
@@ -88,6 +91,7 @@ void exynos_lcd_power_on(void)
 void exynos_backlight_on(unsigned int onoff)
 {
 	/* For PWM */
+	gpio_request(EXYNOS5420_GPIO_B20, "backlight_on");
 	gpio_cfg_pin(EXYNOS5420_GPIO_B20, S5P_GPIO_FUNC(0x1));
 	gpio_set_value(EXYNOS5420_GPIO_B20, 1);
 
board/samsung/trats/trats.c +12 -3
index 9e76b5d..e163e45 100644
@@ -63,6 +63,8 @@ void i2c_init_board(void)
 	}
 
 	/* I2C_8 -> FG */
+	gpio_request(EXYNOS4_GPIO_Y40, "i2c_clk");
+	gpio_request(EXYNOS4_GPIO_Y41, "i2c_data");
 	gpio_direction_output(EXYNOS4_GPIO_Y40, 1);
 	gpio_direction_output(EXYNOS4_GPIO_Y41, 1);
 }
@@ -346,12 +348,17 @@ int exynos_power_init(void)
 static unsigned int get_hw_revision(void)
 {
 	int hwrev = 0;
+	char str[10];
 	int i;
 
 	/* hw_rev[3:0] == GPE1[3:0] */
-	for (i = EXYNOS4_GPIO_E10; i < EXYNOS4_GPIO_E14; i++) {
-		gpio_cfg_pin(i, S5P_GPIO_INPUT);
-		gpio_set_pull(i, S5P_GPIO_PULL_NONE);
+	for (i = 0; i < 4; i++) {
+		int pin = i + EXYNOS4_GPIO_E10;
+
+		sprintf(str, "hw_rev%d", i);
+		gpio_request(pin, str);
+		gpio_cfg_pin(pin, S5P_GPIO_INPUT);
+		gpio_set_pull(pin, S5P_GPIO_PULL_NONE);
 	}
 
 	udelay(1);
@@ -517,6 +524,7 @@ static void board_power_init(void)
 static void exynos_uart_init(void)
 {
 	/* UART_SEL GPY4[7] (part2)@EXYNOS4 */
+	gpio_request(EXYNOS4_GPIO_Y47, "uart_sel");
 	gpio_set_pull(EXYNOS4_GPIO_Y47, S5P_GPIO_PULL_UP);
 	gpio_direction_output(EXYNOS4_GPIO_Y47, 1);
 }
@@ -534,6 +542,7 @@ int exynos_early_init_f(void)
 
 void exynos_reset_lcd(void)
 {
+	gpio_request(EXYNOS4_GPIO_Y45, "lcd_reset");
 	gpio_direction_output(EXYNOS4_GPIO_Y45, 1);
 	udelay(10000);
 	gpio_direction_output(EXYNOS4_GPIO_Y45, 0);
board/samsung/trats2/trats2.c +21 -5
index 2924ee6..a737749 100644
@@ -33,6 +33,7 @@ static inline u32 get_model_rev(void);
 static void check_hw_revision(void)
 {
 	int modelrev = 0;
+	char str[12];
 	int i;
 
 	/*
@@ -41,13 +42,22 @@ static void check_hw_revision(void)
 	 * TRM say that it may cause unexcepted state and leakage current.
 	 * and pull-none is only for output function.
 	 */
-	for (i = EXYNOS4X12_GPIO_M10; i < EXYNOS4X12_GPIO_M12; i++)
-		gpio_cfg_pin(i, S5P_GPIO_INPUT);
+	for (i = 0; i < 2; i++) {
+		int pin = i + EXYNOS4X12_GPIO_M10;
+
+		sprintf(str, "model_rev%d", i);
+		gpio_request(pin, str);
+		gpio_cfg_pin(pin, S5P_GPIO_INPUT);
+	}
 
 	/* GPM1[5:2]: HW_REV[3:0] */
-	for (i = EXYNOS4X12_GPIO_M12; i < EXYNOS4X12_GPIO_M16; i++) {
-		gpio_cfg_pin(i, S5P_GPIO_INPUT);
-		gpio_set_pull(i, S5P_GPIO_PULL_NONE);
+	for (i = 0; i < 4; i++) {
+		int pin = i + EXYNOS4X12_GPIO_M12;
+
+		sprintf(str, "hw_rev%d", i);
+		gpio_request(pin, str);
+		gpio_cfg_pin(pin, S5P_GPIO_INPUT);
+		gpio_set_pull(pin, S5P_GPIO_PULL_NONE);
 	}
 
 	/* GPM1[1:0]: MODEL_REV[1:0] */
@@ -103,10 +113,14 @@ static void board_init_i2c(void)
 	}
 
 	/* I2C_8 */
+	gpio_request(EXYNOS4X12_GPIO_F14, "i2c8_clk");
+	gpio_request(EXYNOS4X12_GPIO_F15, "i2c8_data");
 	gpio_direction_output(EXYNOS4X12_GPIO_F14, 1);
 	gpio_direction_output(EXYNOS4X12_GPIO_F15, 1);
 
 	/* I2C_9 */
+	gpio_request(EXYNOS4X12_GPIO_M21, "i2c9_clk");
+	gpio_request(EXYNOS4X12_GPIO_M20, "i2c9_data");
 	gpio_direction_output(EXYNOS4X12_GPIO_M21, 1);
 	gpio_direction_output(EXYNOS4X12_GPIO_M20, 1);
 }
@@ -388,6 +402,7 @@ void exynos_lcd_power_on(void)
 	struct pmic *p = pmic_get("MAX77686_PMIC");
 
 	/* LCD_2.2V_EN: GPC0[1] */
+	gpio_request(EXYNOS4X12_GPIO_C01, "lcd_2v2_en");
 	gpio_set_pull(EXYNOS4X12_GPIO_C01, S5P_GPIO_PULL_UP);
 	gpio_direction_output(EXYNOS4X12_GPIO_C01, 1);
 
@@ -400,6 +415,7 @@ void exynos_lcd_power_on(void)
 void exynos_reset_lcd(void)
 {
 	/* reset lcd */
+	gpio_request(EXYNOS4X12_GPIO_F21, "lcd_reset");
 	gpio_direction_output(EXYNOS4X12_GPIO_F21, 0);
 	udelay(10);
 	gpio_set_value(EXYNOS4X12_GPIO_F21, 1);
board/samsung/universal_c210/universal.c +3 -0
index f9d3325..c04f48c 100644
@@ -330,6 +330,7 @@ void exynos_cfg_lcd_gpio(void)
 	}
 
 	/* gpio pad configuration for LCD reset. */
+	gpio_request(EXYNOS4_GPIO_Y45, "lcd_reset");
 	gpio_cfg_pin(EXYNOS4_GPIO_Y45, S5P_GPIO_OUTPUT);
 
 	spi_init();
@@ -386,6 +387,7 @@ int exynos_init(void)
 		 * you should set it HIGH since it removes the inverter
 		 */
 		/* MASSMEMORY_EN: XMDMDATA_6: GPE3[6] */
+		gpio_request(EXYNOS4_GPIO_E36, "ldo_en");
 		gpio_direction_output(EXYNOS4_GPIO_E36, 0);
 		break;
 	default:
@@ -394,6 +396,7 @@ int exynos_init(void)
 		 * But set it as HIGH to ensure
 		 */
 		/* MASSMEMORY_EN: XMDMADDR_3: GPE1[3] */
+		gpio_request(EXYNOS4_GPIO_E13, "massmemory_en");
 		gpio_direction_output(EXYNOS4_GPIO_E13, 1);
 		break;
 	}
drivers/mmc/s5p_sdhci.c +6 -1
index 637dd97..0dea45d 100644
@@ -102,6 +102,7 @@ struct sdhci_host sdhci_host[SDHCI_MAX_HOSTS];
 
 static int do_sdhci_init(struct sdhci_host *host)
 {
+	char str[20];
 	int dev_id, flag;
 	int err = 0;
 
@@ -109,6 +110,8 @@ static int do_sdhci_init(struct sdhci_host *host)
 	dev_id = host->index + PERIPH_ID_SDMMC0;
 
 	if (fdt_gpio_isvalid(&host->pwr_gpio)) {
+		sprintf(str, "sdhci%d_power", host->index & 0xf);
+		gpio_request(host->pwr_gpio.gpio, str);
 		gpio_direction_output(host->pwr_gpio.gpio, 1);
 		err = exynos_pinmux_config(dev_id, flag);
 		if (err) {
@@ -118,7 +121,9 @@ static int do_sdhci_init(struct sdhci_host *host)
 	}
 
 	if (fdt_gpio_isvalid(&host->cd_gpio)) {
-		gpio_direction_output(host->cd_gpio.gpio, 0xf);
+		sprintf(str, "sdhci%d_cd", host->index & 0xf);
+		gpio_request(host->cd_gpio.gpio, str);
+		gpio_direction_output(host->cd_gpio.gpio, 1);
 		if (gpio_get_value(host->cd_gpio.gpio))
 			return -ENODEV;
 
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#14 lore raw

PATCH v9 12/12 dm: exynos: gpio: Convert to driver model

In reply to Simon Glass

Convert the exynos GPIO driver to driver model. This implements the generic GPIO interface but not the extra Exynos-specific functions.

---

Changes in v9:
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6: None
Changes in v5:
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

 drivers/gpio/s5p_gpio.c         | 424 +++++++++++++++++++++++++++-------------
 include/configs/exynos-common.h |   4 +
 include/configs/s5p_goni.h      |   3 +
 include/configs/smdkc100.h      |   3 +
 4 files changed, 298 insertions(+), 136 deletions(-)
drivers/gpio/s5p_gpio.c +288 -136
index 99f2dd8..13d74eb 100644
@@ -6,8 +6,15 @@
  */
 
 #include <common.h>
+#include <dm.h>
+#include <errno.h>
+#include <fdtdec.h>
+#include <malloc.h>
 #include <asm/io.h>
 #include <asm/gpio.h>
+#include <dm/device-internal.h>
+
+DECLARE_GLOBAL_DATA_PTR;
 
 #define S5P_GPIO_GET_PIN(x)	(x % GPIO_PER_BANK)
 
@@ -26,100 +33,45 @@
 #define RATE_MASK(gpio)		(0x1 << (gpio + 16))
 #define RATE_SET(gpio)			(0x1 << (gpio + 16))
 
-#define name_to_gpio(n) s5p_name_to_gpio(n)
-static inline int s5p_name_to_gpio(const char *name)
+#define GPIO_NAME_SIZE			20
+
+/* Platform data for each bank */
+struct exynos_gpio_platdata {
+	struct s5p_gpio_bank *bank;
+	const char *bank_name;	/* Name of port, e.g. 'gpa0" */
+};
+
+/* Information about each bank@run-time */
+struct exynos_bank_info {
+	char label[GPIO_PER_BANK][GPIO_NAME_SIZE];
+	struct s5p_gpio_bank *bank;
+};
+
+static struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned int gpio)
 {
-	unsigned num, irregular_set_number, irregular_bank_base;
-	const struct gpio_name_num_table *tabp;
-	char this_bank, bank_name, irregular_bank_name;
-	char *endp;
-
-	/*
-	 * The gpio name starts with either 'g' or 'gp' followed by the bank
-	 * name character. Skip one or two characters depending on the prefix.
-	 */
-	if (name[0] == 'g' && name[1] == 'p')
-		name += 2;
-	else if (name[0] == 'g')
-		name++;
-	else
-		return -1; /* Name must start with 'g' */
-
-	bank_name = *name++;
-	if (!*name)
-		return -1; /* At least one digit is required/expected. */
-
-	/*
-	 * On both exynos5 and exynos5420 architectures there is a bank of
-	 * GPIOs which does not fall into the regular address pattern. Those
-	 * banks are c4 on Exynos5 and y7 on Exynos5420. The rest of the below
-	 * assignments help to handle these irregularities.
-	 */
-#if defined(CONFIG_EXYNOS4) || defined(CONFIG_EXYNOS5)
-	if (cpu_is_exynos5()) {
-		if (proid_is_exynos5420()) {
-			tabp = exynos5420_gpio_table;
-			irregular_bank_name = 'y';
-			irregular_set_number = '7';
-			irregular_bank_base = EXYNOS5420_GPIO_Y70;
-		} else {
-			tabp = exynos5_gpio_table;
-			irregular_bank_name = 'c';
-			irregular_set_number = '4';
-			irregular_bank_base = EXYNOS5_GPIO_C40;
-		}
-	} else {
-		if (proid_is_exynos4412())
-			tabp = exynos4x12_gpio_table;
-		else
-			tabp = exynos4_gpio_table;
-		irregular_bank_name = 0;
-		irregular_set_number = 0;
-		irregular_bank_base = 0;
-	}
-#else
-	if (cpu_is_s5pc110())
-		tabp = s5pc110_gpio_table;
-	else
-		tabp = s5pc100_gpio_table;
-	irregular_bank_name = 0;
-	irregular_set_number = 0;
-	irregular_bank_base = 0;
-#endif
+	const struct gpio_info *data;
+	unsigned int upto;
+	int i, count;
 
-	this_bank = tabp->bank;
-	do {
-		if (bank_name == this_bank) {
-			unsigned pin_index; /* pin number within the bank */
-			if ((bank_name == irregular_bank_name) &&
-			    (name[0] == irregular_set_number)) {
-				pin_index = name[1] - '0';
-				/* Irregular sets have 8 pins. */
-				if (pin_index >= GPIO_PER_BANK)
-					return -1;
-				num = irregular_bank_base + pin_index;
-			} else {
-				pin_index = simple_strtoul(name, &endp, 8);
-				pin_index -= tabp->bank_offset;
-				/*
-				 * Sanity check: bunk 'z' has no set number,
-				 * for all other banks there must be exactly
-				 * two octal digits, and the resulting number
-				 * should not exceed the number of pins in the
-				 * bank.
-				 */
-				if (((bank_name != 'z') && !name[1]) ||
-				    *endp ||
-				    (pin_index >= tabp->bank_size))
-					return -1;
-				num = tabp->base + pin_index;
-			}
-			return num;
+	data = get_gpio_data();
+	count = get_bank_num();
+	upto = 0;
+
+	for (i = 0; i < count; i++) {
+		debug("i=%d, upto=%d\n", i, upto);
+		if (gpio < data->max_gpio) {
+			struct s5p_gpio_bank *bank;
+			bank = (struct s5p_gpio_bank *)data->reg_addr;
+			bank += (gpio - upto) / GPIO_PER_BANK;
+			debug("gpio=%d, bank=%p\n", gpio, bank);
+			return bank;
 		}
-		this_bank = (++tabp)->bank;
-	} while (this_bank);
 
-	return -1;
+		upto = data->max_gpio;
+		data++;
+	}
+
+	return NULL;
 }
 
 static void s5p_gpio_cfg_pin(struct s5p_gpio_bank *bank, int gpio, int cfg)
@@ -143,16 +95,23 @@ static void s5p_gpio_set_value(struct s5p_gpio_bank *bank, int gpio, int en)
 	writel(value, &bank->dat);
 }
 
-static void s5p_gpio_direction_output(struct s5p_gpio_bank *bank,
-				      int gpio, int en)
+#ifdef CONFIG_SPL_BUILD
+/* Common GPIO API - SPL does not support driver model yet */
+int gpio_set_value(unsigned gpio, int value)
 {
-	s5p_gpio_cfg_pin(bank, gpio, S5P_GPIO_OUTPUT);
-	s5p_gpio_set_value(bank, gpio, en);
-}
+	s5p_gpio_set_value(s5p_gpio_get_bank(gpio),
+			   s5p_gpio_get_pin(gpio), value);
 
-static void s5p_gpio_direction_input(struct s5p_gpio_bank *bank, int gpio)
+	return 0;
+}
+#else
+static int s5p_gpio_get_cfg_pin(struct s5p_gpio_bank *bank, int gpio)
 {
-	s5p_gpio_cfg_pin(bank, gpio, S5P_GPIO_INPUT);
+	unsigned int value;
+
+	value = readl(&bank->con);
+	value &= CON_MASK(gpio);
+	return CON_SFR_UNSHIFT(value, gpio);
 }
 
 static unsigned int s5p_gpio_get_value(struct s5p_gpio_bank *bank, int gpio)
@@ -162,6 +121,7 @@ static unsigned int s5p_gpio_get_value(struct s5p_gpio_bank *bank, int gpio)
 	value = readl(&bank->dat);
 	return !!(value & DAT_MASK(gpio));
 }
+#endif /* CONFIG_SPL_BUILD */
 
 static void s5p_gpio_set_pull(struct s5p_gpio_bank *bank, int gpio, int mode)
 {
@@ -222,78 +182,156 @@ static void s5p_gpio_set_rate(struct s5p_gpio_bank *bank, int gpio, int mode)
 	writel(value, &bank->drv);
 }
 
-static struct s5p_gpio_bank *s5p_gpio_get_bank(unsigned int gpio)
+int s5p_gpio_get_pin(unsigned gpio)
 {
-	const struct gpio_info *data;
-	unsigned int upto;
-	int i, count;
+	return S5P_GPIO_GET_PIN(gpio);
+}
 
-	data = get_gpio_data();
-	count = get_bank_num();
-	upto = 0;
+/* Driver model interface */
+#ifndef CONFIG_SPL_BUILD
+static int exynos_gpio_get_state(struct udevice *dev, unsigned int offset,
+				char *buf, int bufsize)
+{
+	struct gpio_dev_priv *uc_priv = dev->uclass_priv;
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	const char *label;
+	bool is_output;
+	int size;
+	int cfg;
+
+	label = state->label[offset];
+	cfg = s5p_gpio_get_cfg_pin(state->bank, offset);
+	is_output = cfg == S5P_GPIO_OUTPUT;
+	size = snprintf(buf, bufsize, "%s%d: ",
+			uc_priv->bank_name ? uc_priv->bank_name : "", offset);
+	buf += size;
+	bufsize -= size;
+	if (is_output || cfg == S5P_GPIO_INPUT) {
+		snprintf(buf, bufsize, "%s: %d [%c]%s%s",
+			 is_output ? "out" : " in",
+			 s5p_gpio_get_value(state->bank, offset),
+			 *label ? 'x' : ' ',
+			 *label ? " " : "",
+			 label);
+	} else {
+		snprintf(buf, bufsize, "sfpio");
+	}
 
-	for (i = 0; i < count; i++) {
-		debug("i=%d, upto=%d\n", i, upto);
-		if (gpio < data->max_gpio) {
-			struct s5p_gpio_bank *bank;
-			bank = (struct s5p_gpio_bank *)data->reg_addr;
-			bank += (gpio - upto) / GPIO_PER_BANK;
-			debug("gpio=%d, bank=%p\n", gpio, bank);
-			return bank;
-		}
+	return 0;
+}
 
-		upto = data->max_gpio;
-		data++;
+static int check_reserved(struct udevice *dev, unsigned offset,
+			  const char *func)
+{
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	struct gpio_dev_priv *uc_priv = dev->uclass_priv;
+
+	if (!*state->label[offset]) {
+		printf("exynos_gpio: %s: error: gpio %s%d not reserved\n",
+		       func, uc_priv->bank_name, offset);
+		return -EPERM;
 	}
 
-	return NULL;
+	return 0;
 }
 
-int s5p_gpio_get_pin(unsigned gpio)
+/* set GPIO pin 'gpio' as an input */
+static int exynos_gpio_direction_input(struct udevice *dev, unsigned offset)
 {
-	return S5P_GPIO_GET_PIN(gpio);
-}
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	int ret;
 
-/* Common GPIO API */
+	ret = check_reserved(dev, offset, __func__);
+	if (ret)
+		return ret;
+
+	/* Configure GPIO direction as input. */
+	s5p_gpio_cfg_pin(state->bank, offset, S5P_GPIO_INPUT);
 
-int gpio_request(unsigned gpio, const char *label)
-{
 	return 0;
 }
 
-int gpio_free(unsigned gpio)
+/* set GPIO pin 'gpio' as an output, with polarity 'value' */
+static int exynos_gpio_direction_output(struct udevice *dev, unsigned offset,
+				       int value)
 {
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	int ret;
+
+	ret = check_reserved(dev, offset, __func__);
+	if (ret)
+		return ret;
+
+	/* Configure GPIO output value. */
+	s5p_gpio_set_value(state->bank, offset, value);
+
+	/* Configure GPIO direction as output. */
+	s5p_gpio_cfg_pin(state->bank, offset, S5P_GPIO_OUTPUT);
+
 	return 0;
 }
 
-int gpio_direction_input(unsigned gpio)
+/* read GPIO IN value of pin 'gpio' */
+static int exynos_gpio_get_value(struct udevice *dev, unsigned offset)
 {
-	s5p_gpio_direction_input(s5p_gpio_get_bank(gpio),
-				s5p_gpio_get_pin(gpio));
-	return 0;
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	int ret;
+
+	ret = check_reserved(dev, offset, __func__);
+	if (ret)
+		return ret;
+
+	return s5p_gpio_get_value(state->bank, offset);
 }
 
-int gpio_direction_output(unsigned gpio, int value)
+/* write GPIO OUT value to pin 'gpio' */
+static int exynos_gpio_set_value(struct udevice *dev, unsigned offset,
+				 int value)
 {
-	s5p_gpio_direction_output(s5p_gpio_get_bank(gpio),
-				 s5p_gpio_get_pin(gpio), value);
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	int ret;
+
+	ret = check_reserved(dev, offset, __func__);
+	if (ret)
+		return ret;
+
+	s5p_gpio_set_value(state->bank, offset, value);
+
 	return 0;
 }
 
-int gpio_get_value(unsigned gpio)
+static int exynos_gpio_request(struct udevice *dev, unsigned offset,
+			      const char *label)
 {
-	return (int) s5p_gpio_get_value(s5p_gpio_get_bank(gpio),
-				       s5p_gpio_get_pin(gpio));
+	struct exynos_bank_info *state = dev_get_priv(dev);
+
+	if (*state->label[offset])
+		return -EBUSY;
+
+	strncpy(state->label[offset], label, GPIO_NAME_SIZE);
+	state->label[offset][GPIO_NAME_SIZE - 1] = '\0';
+
+	return 0;
 }
 
-int gpio_set_value(unsigned gpio, int value)
+static int exynos_gpio_free(struct udevice *dev, unsigned offset)
 {
-	s5p_gpio_set_value(s5p_gpio_get_bank(gpio),
-			  s5p_gpio_get_pin(gpio), value);
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	int ret;
+
+	ret = check_reserved(dev, offset, __func__);
+	if (ret)
+		return ret;
+	state->label[offset][0] = '\0';
 
 	return 0;
 }
+#endif /* nCONFIG_SPL_BUILD */
 
+/*
+ * There is no common GPIO API for pull, drv, pin, rate (yet). These
+ * functions are kept here to preserve function ordering for review.
+ */
 void gpio_set_pull(int gpio, int mode)
 {
 	s5p_gpio_set_pull(s5p_gpio_get_bank(gpio),
@@ -317,3 +355,117 @@ void gpio_set_rate(int gpio, int mode)
 	s5p_gpio_set_rate(s5p_gpio_get_bank(gpio),
 			  s5p_gpio_get_pin(gpio), mode);
 }
+
+#ifndef CONFIG_SPL_BUILD
+static int exynos_gpio_get_function(struct udevice *dev, unsigned offset)
+{
+	struct exynos_bank_info *state = dev_get_priv(dev);
+	int cfg;
+
+	if (!*state->label[offset])
+		return GPIOF_UNUSED;
+	cfg = s5p_gpio_get_cfg_pin(state->bank, offset);
+	if (cfg == S5P_GPIO_OUTPUT)
+		return GPIOF_OUTPUT;
+	else if (cfg == S5P_GPIO_INPUT)
+		return GPIOF_INPUT;
+	else
+		return GPIOF_FUNC;
+}
+
+static const struct dm_gpio_ops gpio_exynos_ops = {
+	.request		= exynos_gpio_request,
+	.free			= exynos_gpio_free,
+	.direction_input	= exynos_gpio_direction_input,
+	.direction_output	= exynos_gpio_direction_output,
+	.get_value		= exynos_gpio_get_value,
+	.set_value		= exynos_gpio_set_value,
+	.get_function		= exynos_gpio_get_function,
+	.get_state		= exynos_gpio_get_state,
+};
+
+static int gpio_exynos_probe(struct udevice *dev)
+{
+	struct gpio_dev_priv *uc_priv = dev->uclass_priv;
+	struct exynos_bank_info *priv = dev->priv;
+	struct exynos_gpio_platdata *plat = dev->platdata;
+
+	/* Only child devices have ports */
+	if (!plat)
+		return 0;
+
+	priv->bank = plat->bank;
+
+	uc_priv->gpio_count = GPIO_PER_BANK;
+	uc_priv->bank_name = plat->bank_name;
+
+	return 0;
+}
+
+/**
+ * We have a top-level GPIO device with no actual GPIOs. It has a child
+ * device for each Exynos GPIO bank.
+ */
+static int gpio_exynos_bind(struct udevice *parent)
+{
+	struct exynos_gpio_platdata *plat = parent->platdata;
+	struct s5p_gpio_bank *bank, *base;
+	const void *blob = gd->fdt_blob;
+	int node;
+
+	/* If this is a child device, there is nothing to do here */
+	if (plat)
+		return 0;
+
+	base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob,
+						   parent->of_offset, "reg");
+	for (node = fdt_first_subnode(blob, parent->of_offset), bank = base;
+	     node > 0;
+	     node = fdt_next_subnode(blob, node), bank++) {
+		struct exynos_gpio_platdata *plat;
+		struct udevice *dev;
+		fdt_addr_t reg;
+		int ret;
+
+		if (!fdtdec_get_bool(blob, node, "gpio-controller"))
+			continue;
+		plat = calloc(1, sizeof(*plat));
+		if (!plat)
+			return -ENOMEM;
+		reg = fdtdec_get_addr(blob, node, "reg");
+		if (reg != FDT_ADDR_T_NONE)
+			bank = (struct s5p_gpio_bank *)((ulong)base + reg);
+		plat->bank = bank;
+		plat->bank_name = fdt_get_name(blob, node, NULL);
+		debug("dev at %p: %s\n", bank, plat->bank_name);
+
+		ret = device_bind(parent, parent->driver,
+					plat->bank_name, plat, -1, &dev);
+		if (ret)
+			return ret;
+		dev->of_offset = parent->of_offset;
+	}
+
+	return 0;
+}
+
+static const struct udevice_id exynos_gpio_ids[] = {
+	{ .compatible = "samsung,s5pc100-pinctrl" },
+	{ .compatible = "samsung,s5pc110-pinctrl" },
+	{ .compatible = "samsung,exynos4210-pinctrl" },
+	{ .compatible = "samsung,exynos4x12-pinctrl" },
+	{ .compatible = "samsung,exynos5250-pinctrl" },
+	{ .compatible = "samsung,exynos5420-pinctrl" },
+	{ }
+};
+
+U_BOOT_DRIVER(gpio_exynos) = {
+	.name	= "gpio_exynos",
+	.id	= UCLASS_GPIO,
+	.of_match = exynos_gpio_ids,
+	.bind	= gpio_exynos_bind,
+	.probe = gpio_exynos_probe,
+	.priv_auto_alloc_size = sizeof(struct exynos_bank_info),
+	.ops	= &gpio_exynos_ops,
+};
+#endif
include/configs/exynos-common.h +4 -0
index 371f32d..4a4b22b 100644
@@ -17,6 +17,10 @@
 #include <linux/sizes.h>
 
 #define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DM
+#define CONFIG_CMD_DM
+#define CONFIG_DM_GPIO
+
 #define CONFIG_ARCH_CPU_INIT
 #define CONFIG_DISPLAY_CPUINFO
 #define CONFIG_DISPLAY_BOARDINFO
include/configs/s5p_goni.h +3 -0
index fa0e737..fb1a7db 100644
@@ -287,5 +287,8 @@
 #define CONFIG_OF_LIBFDT
 
 #define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DM
+#define CONFIG_CMD_DM
+#define CONFIG_DM_GPIO
 
 #endif	/* __CONFIG_H */
include/configs/smdkc100.h +3 -0
index a7eb33e..424e130 100644
@@ -224,5 +224,8 @@
 #define CONFIG_OF_LIBFDT
 
 #define CONFIG_SYS_GENERIC_BOARD
+#define CONFIG_DM
+#define CONFIG_CMD_DM
+#define CONFIG_DM_GPIO
 
 #endif	/* __CONFIG_H */
Signature · 1 line
2.1.0.rc2.206.gedb03e5
#15 lore raw

PATCH v9 12/12 dm: exynos: gpio: Convert to driver model

Hello Simon,

Quoted 37 lines · Simon Glass

Convert the exynos GPIO driver to driver model. This implements the generic GPIO interface but not the extra Exynos-specific functions.

---

Changes in v9:
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6: None
Changes in v5:
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

  drivers/gpio/s5p_gpio.c         | 424 +++++++++++++++++++++++++++-------------
  include/configs/exynos-common.h |   4 +
  include/configs/s5p_goni.h      |   3 +
  include/configs/smdkc100.h      |   3 +
  4 files changed, 298 insertions(+), 136 deletions(-)
drivers/gpio/s5p_gpio.c +0 -0
index 99f2dd8..13d74eb 100644
@@ -6,8 +6,15 @@
   */
 

..snip..

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+/**
+ * We have a top-level GPIO device with no actual GPIOs. It has a child
+ * device for each Exynos GPIO bank.
+ */
+static int gpio_exynos_bind(struct udevice *parent)
+{
+	struct exynos_gpio_platdata *plat = parent->platdata;
+	struct s5p_gpio_bank *bank, *base;
+	const void *blob = gd->fdt_blob;
+	int node;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 424

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+
+	/* If this is a child device, there is nothing to do here */
+	if (plat)
+		return 0;
+
+	base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob,
+						   parent->of_offset, "reg");
+	for (node = fdt_first_subnode(blob, parent->of_offset), bank = base;
+	     node > 0;
+	     node = fdt_next_subnode(blob, node), bank++) {

Here (bank++) you assume, that order of subnodes of each pinctrl is the same like in dts file - as I wrote in comment to patch 04 - it isn't.

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 434

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+		struct exynos_gpio_platdata *plat;
+		struct udevice *dev;
+		fdt_addr_t reg;
+		int ret;
+
+		if (!fdtdec_get_bool(blob, node, "gpio-controller"))
+			continue;
+		plat = calloc(1, sizeof(*plat));
+		if (!plat)
+			return -ENOMEM;

Some parts of GPIO banks, for which "reg" can be found are prober.

Quoted 15 lines
drivers/gpio/s5p_gpio.c +15 -0
+		reg = fdtdec_get_addr(blob, node, "reg");
+		if (reg != FDT_ADDR_T_NONE)
+			bank = (struct s5p_gpio_bank *)((ulong)base + reg);
+		plat->bank = bank;
+		plat->bank_name = fdt_get_name(blob, node, NULL);
+		debug("dev at %p: %s\n", bank, plat->bank_name);
+
+		ret = device_bind(parent, parent->driver,
+					plat->bank_name, plat, -1, &dev);
+		if (ret)
+			return ret;
+		dev->of_offset = parent->of_offset;
+	}
+
+	return 0;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 459

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+}
+
+static const struct udevice_id exynos_gpio_ids[] = {
+	{ .compatible = "samsung,s5pc100-pinctrl" },
+	{ .compatible = "samsung,s5pc110-pinctrl" },
+	{ .compatible = "samsung,exynos4210-pinctrl" },
+	{ .compatible = "samsung,exynos4x12-pinctrl" },
+	{ .compatible = "samsung,exynos5250-pinctrl" },
+	{ .compatible = "samsung,exynos5420-pinctrl" },
+	{ }

... snip ...

And this is not the end of issues:)

Unfortunately Exynos4xxx has a gaps in GPIO bank address space, and the big gpio enum lists includes that here:
arch/arm/include/asm/arch-exynos/gpio.h

This works for Exynos5, because it's enum list is linear.

And the driver gpio-uclass.c - assumes that the gpio numbers are linear. When I removed the gaps in enum for 4x12 -then gpio is mapped good.

And after remove the enum gaps, it also requires fitting the gpios in dts files, e.g. cd-gpio, pwr-gpios for sdhci host.

Sorry for such late reply in v9 but, before it seems working fine - I didn't try to check the sd card before.

I hope that after that fixes, everything will work fine:)

Best Regards,

Signature · 4 lines
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com
#16 lore raw

PATCH v9 12/12 dm: exynos: gpio: Convert to driver model

Hi,

Quoted 130 lines · Przemyslaw Marczak

Hello Simon,

Quoted 40 lines · Simon Glass

Convert the exynos GPIO driver to driver model. This implements the generic
GPIO interface but not the extra Exynos-specific functions.

---

Changes in v9:
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6: None
Changes in v5:
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

  drivers/gpio/s5p_gpio.c         | 424
+++++++++++++++++++++++++++-------------
  include/configs/exynos-common.h |   4 +
  include/configs/s5p_goni.h      |   3 +
  include/configs/smdkc100.h      |   3 +
  4 files changed, 298 insertions(+), 136 deletions(-)
drivers/gpio/s5p_gpio.c +0 -0
index 99f2dd8..13d74eb 100644
@@ -6,8 +6,15 @@
   */
 

..snip..

Quoted 20 lines
drivers/gpio/s5p_gpio.c +17 -0
+/**
+ * We have a top-level GPIO device with no actual GPIOs. It has a child
+ * device for each Exynos GPIO bank.
+ */
+static int gpio_exynos_bind(struct udevice *parent)
+{
+       struct exynos_gpio_platdata *plat = parent->platdata;
+       struct s5p_gpio_bank *bank, *base;
+       const void *blob = gd->fdt_blob;
+       int node;
+
+       /* If this is a child device, there is nothing to do here */
+       if (plat)
+               return 0;
+
+       base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob,
+                                                  parent->of_offset,

"reg");
+ for (node = fdt_first_subnode(blob, parent->of_offset), bank =
base;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 424

Quoted 2 lines
drivers/gpio/s5p_gpio.c +2 -0
+            node > 0;
+            node = fdt_next_subnode(blob, node), bank++) {

Here (bank++) you assume, that order of subnodes of each pinctrl is the same like in dts file - as I wrote in comment to patch 04 - it isn't.

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 434

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+               struct exynos_gpio_platdata *plat;
+               struct udevice *dev;
+               fdt_addr_t reg;
+               int ret;
+
+               if (!fdtdec_get_bool(blob, node, "gpio-controller"))
+                       continue;
+               plat = calloc(1, sizeof(*plat));
+               if (!plat)
+                       return -ENOMEM;

Some parts of GPIO banks, for which "reg" can be found are prober.

Quoted 16 lines
drivers/gpio/s5p_gpio.c +3 -0
+               reg = fdtdec_get_addr(blob, node, "reg");
+               if (reg != FDT_ADDR_T_NONE)
+                       bank = (struct s5p_gpio_bank *)((ulong)base +

reg);

drivers/gpio/s5p_gpio.c +12 -0
+               plat->bank = bank;
+               plat->bank_name = fdt_get_name(blob, node, NULL);
+               debug("dev at %p: %s\n", bank, plat->bank_name);
+
+               ret = device_bind(parent, parent->driver,
+                                       plat->bank_name, plat, -1, &dev);
+               if (ret)
+                       return ret;
+               dev->of_offset = parent->of_offset;
+       }
+
+       return 0;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 459

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+}
+
+static const struct udevice_id exynos_gpio_ids[] = {
+       { .compatible = "samsung,s5pc100-pinctrl" },
+       { .compatible = "samsung,s5pc110-pinctrl" },
+       { .compatible = "samsung,exynos4210-pinctrl" },
+       { .compatible = "samsung,exynos4x12-pinctrl" },
+       { .compatible = "samsung,exynos5250-pinctrl" },
+       { .compatible = "samsung,exynos5420-pinctrl" },
+       { }

... snip ...

And this is not the end of issues:)

Unfortunately Exynos4xxx has a gaps in GPIO bank address space, and the big gpio enum lists includes that here:
arch/arm/include/asm/arch-exynos/gpio.h

This works for Exynos5, because it's enum list is linear.

And the driver gpio-uclass.c - assumes that the gpio numbers are linear. When I removed the gaps in enum for 4x12 -then gpio is mapped good.

Quoted 7 lines

And after remove the enum gaps, it also requires fitting the gpios in dts files, e.g. cd-gpio, pwr-gpios for sdhci host.

Sorry for such late reply in v9 but, before it seems working fine - I didn't try to check the sd card before.

I hope that after that fixes, everything will work fine:)

Thanks very much for testing this. As mentioned on the other patch, please try u-boot-dm/next and see how things look.

Regards,
Simon

#17 lore raw

PATCH v9 12/12 dm: exynos: gpio: Convert to driver model

Hello,

Quoted 139 lines · Simon Glass

Hi,

Quoted 136 lines · Przemyslaw Marczak

Hello Simon,

Quoted 40 lines · Simon Glass

Convert the exynos GPIO driver to driver model. This implements the generic
GPIO interface but not the extra Exynos-specific functions.

---

Changes in v9:
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6: None
Changes in v5:
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

   drivers/gpio/s5p_gpio.c         | 424
+++++++++++++++++++++++++++-------------
   include/configs/exynos-common.h |   4 +
   include/configs/s5p_goni.h      |   3 +
   include/configs/smdkc100.h      |   3 +
   4 files changed, 298 insertions(+), 136 deletions(-)
drivers/gpio/s5p_gpio.c +0 -0
index 99f2dd8..13d74eb 100644
@@ -6,8 +6,15 @@
    */
 

..snip..

Quoted 20 lines
drivers/gpio/s5p_gpio.c +17 -0
+/**
+ * We have a top-level GPIO device with no actual GPIOs. It has a child
+ * device for each Exynos GPIO bank.
+ */
+static int gpio_exynos_bind(struct udevice *parent)
+{
+       struct exynos_gpio_platdata *plat = parent->platdata;
+       struct s5p_gpio_bank *bank, *base;
+       const void *blob = gd->fdt_blob;
+       int node;
+
+       /* If this is a child device, there is nothing to do here */
+       if (plat)
+               return 0;
+
+       base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob,
+                                                  parent->of_offset,

"reg");
+ for (node = fdt_first_subnode(blob, parent->of_offset), bank =
base;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 424

Quoted 2 lines
drivers/gpio/s5p_gpio.c +2 -0
+            node > 0;
+            node = fdt_next_subnode(blob, node), bank++) {

Here (bank++) you assume, that order of subnodes of each pinctrl is the same like in dts file - as I wrote in comment to patch 04 - it isn't.

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 434

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+               struct exynos_gpio_platdata *plat;
+               struct udevice *dev;
+               fdt_addr_t reg;
+               int ret;
+
+               if (!fdtdec_get_bool(blob, node, "gpio-controller"))
+                       continue;
+               plat = calloc(1, sizeof(*plat));
+               if (!plat)
+                       return -ENOMEM;

Some parts of GPIO banks, for which "reg" can be found are prober.

Quoted 16 lines
drivers/gpio/s5p_gpio.c +3 -0
+               reg = fdtdec_get_addr(blob, node, "reg");
+               if (reg != FDT_ADDR_T_NONE)
+                       bank = (struct s5p_gpio_bank *)((ulong)base +

reg);

drivers/gpio/s5p_gpio.c +12 -0
+               plat->bank = bank;
+               plat->bank_name = fdt_get_name(blob, node, NULL);
+               debug("dev at %p: %s\n", bank, plat->bank_name);
+
+               ret = device_bind(parent, parent->driver,
+                                       plat->bank_name, plat, -1, &dev);
+               if (ret)
+                       return ret;
+               dev->of_offset = parent->of_offset;
+       }
+
+       return 0;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 459

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+}
+
+static const struct udevice_id exynos_gpio_ids[] = {
+       { .compatible = "samsung,s5pc100-pinctrl" },
+       { .compatible = "samsung,s5pc110-pinctrl" },
+       { .compatible = "samsung,exynos4210-pinctrl" },
+       { .compatible = "samsung,exynos4x12-pinctrl" },
+       { .compatible = "samsung,exynos5250-pinctrl" },
+       { .compatible = "samsung,exynos5420-pinctrl" },
+       { }

... snip ...

And this is not the end of issues:)

Unfortunately Exynos4xxx has a gaps in GPIO bank address space, and the big gpio enum lists includes that here:
arch/arm/include/asm/arch-exynos/gpio.h

This works for Exynos5, because it's enum list is linear.

And the driver gpio-uclass.c - assumes that the gpio numbers are linear. When I removed the gaps in enum for 4x12 -then gpio is mapped good.

And after remove the enum gaps, it also requires fitting the gpios in dts files, e.g. cd-gpio, pwr-gpios for sdhci host.

Sorry for such late reply in v9 but, before it seems working fine - I didn't try to check the sd card before.

Quoted 8 lines
Quoted 1 line

I hope that after that fixes, everything will work fine:)

Thanks very much for testing this. As mentioned on the other patch, please try u-boot-dm/next and see how things look.

Regards,
Simon

No problem, it's also important for me. I will check the "next" in a few minutes.

Regards,

Signature · 4 lines
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com
#18 lore raw

PATCH v9 12/12 dm: exynos: gpio: Convert to driver model

Hello again,

Quoted 155 lines · Przemyslaw Marczak

Hello,

Quoted 152 lines · Simon Glass

Hi,

Quoted 139 lines · Przemyslaw Marczak

Hello Simon,

Quoted 41 lines · Simon Glass

Convert the exynos GPIO driver to driver model. This implements the generic
GPIO interface but not the extra Exynos-specific functions.

---

Changes in v9:
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6: None
Changes in v5:
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

   drivers/gpio/s5p_gpio.c         | 424
+++++++++++++++++++++++++++-------------
   include/configs/exynos-common.h |   4 +
   include/configs/s5p_goni.h      |   3 +
   include/configs/smdkc100.h      |   3 +
   4 files changed, 298 insertions(+), 136 deletions(-)
drivers/gpio/s5p_gpio.c +0 -0
index 99f2dd8..13d74eb 100644
@@ -6,8 +6,15 @@
    */
 

..snip..

Quoted 21 lines

+/**
+ * We have a top-level GPIO device with no actual GPIOs. It has a child
+ * device for each Exynos GPIO bank.
+ */

drivers/gpio/s5p_gpio.c +13 -0
+static int gpio_exynos_bind(struct udevice *parent)
+{
+       struct exynos_gpio_platdata *plat = parent->platdata;
+       struct s5p_gpio_bank *bank, *base;
+       const void *blob = gd->fdt_blob;
+       int node;
+
+       /* If this is a child device, there is nothing to do here */
+       if (plat)
+               return 0;
+
+       base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob,
+                                                  parent->of_offset,

"reg");
+ for (node = fdt_first_subnode(blob, parent->of_offset), bank =
base;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 424

Quoted 2 lines
drivers/gpio/s5p_gpio.c +2 -0
+            node > 0;
+            node = fdt_next_subnode(blob, node), bank++) {

Here (bank++) you assume, that order of subnodes of each pinctrl is the same
like in dts file - as I wrote in comment to patch 04 - it isn't.

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 434

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+               struct exynos_gpio_platdata *plat;
+               struct udevice *dev;
+               fdt_addr_t reg;
+               int ret;
+
+               if (!fdtdec_get_bool(blob, node, "gpio-controller"))
+                       continue;
+               plat = calloc(1, sizeof(*plat));
+               if (!plat)
+                       return -ENOMEM;

Some parts of GPIO banks, for which "reg" can be found are prober.

Quoted 17 lines
drivers/gpio/s5p_gpio.c +3 -0
+               reg = fdtdec_get_addr(blob, node, "reg");
+               if (reg != FDT_ADDR_T_NONE)
+                       bank = (struct s5p_gpio_bank *)((ulong)base +

reg);

drivers/gpio/s5p_gpio.c +6 -0
+               plat->bank = bank;
+               plat->bank_name = fdt_get_name(blob, node, NULL);
+               debug("dev at %p: %s\n", bank, plat->bank_name);
+
+               ret = device_bind(parent, parent->driver,
+                                       plat->bank_name, plat, -1,

&dev);

drivers/gpio/s5p_gpio.c +6 -0
+               if (ret)
+                       return ret;
+               dev->of_offset = parent->of_offset;
+       }
+
+       return 0;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 459

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+}
+
+static const struct udevice_id exynos_gpio_ids[] = {
+       { .compatible = "samsung,s5pc100-pinctrl" },
+       { .compatible = "samsung,s5pc110-pinctrl" },
+       { .compatible = "samsung,exynos4210-pinctrl" },
+       { .compatible = "samsung,exynos4x12-pinctrl" },
+       { .compatible = "samsung,exynos5250-pinctrl" },
+       { .compatible = "samsung,exynos5420-pinctrl" },
+       { }

... snip ...

And this is not the end of issues:)

Unfortunately Exynos4xxx has a gaps in GPIO bank address space, and the big
gpio enum lists includes that here:
arch/arm/include/asm/arch-exynos/gpio.h

This works for Exynos5, because it's enum list is linear.

And the driver gpio-uclass.c - assumes that the gpio numbers are linear. When I removed the gaps in enum for 4x12 -then gpio is mapped good.

And after remove the enum gaps, it also requires fitting the gpios in dts
files, e.g. cd-gpio, pwr-gpios for sdhci host.

Quoted 5 lines

Sorry for such late reply in v9 but, before it seems working fine - I didn't
try to check the sd card before.

I hope that after that fixes, everything will work fine:)

Thanks very much for testing this. As mentioned on the other patch, please try u-boot-dm/next and see how things look.

Quoted 8 lines
Quoted 3 lines

Regards,
Simon

No problem, it's also important for me. I will check the "next" in a few minutes.

Regards,

After a quick look into the code I suppose that the issues are not fixed, but it is tested for sure:)

So the main required changes:
1. Remove/fix all "**pinctrl-uboot.dtsi" files and move the cells size into "pinctrl.dtsi"

2. Remove the gaps in Exynos4xxx gpio enum:
arch/arm/include/asm/arch-exynos/gpio.

and now I checked that the same is for s5pc110, here:
arch/arm/include/asm/arch-s5pc1xx/gpio.h (only S5PC110_GPIO_H00)

3. Fix exynos4xxx boards *.dts after remove the gaps in gpio enum.

So I think, this is all.

Best Regards,

Signature · 4 lines
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com
#19 lore raw

PATCH v9 12/12 dm: exynos: gpio: Convert to driver model

Hi,

Quoted 177 lines · Przemyslaw Marczak

Hello again,

Quoted 163 lines · Przemyslaw Marczak

Hello,

Quoted 159 lines · Simon Glass

Hi,

Quoted 144 lines · Przemyslaw Marczak

Hello Simon,

Quoted 42 lines · Simon Glass

Convert the exynos GPIO driver to driver model. This implements the generic
GPIO interface but not the extra Exynos-specific functions.

---

Changes in v9:
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6: None
Changes in v5:
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

   drivers/gpio/s5p_gpio.c         | 424
+++++++++++++++++++++++++++-------------
   include/configs/exynos-common.h |   4 +
   include/configs/s5p_goni.h      |   3 +
   include/configs/smdkc100.h      |   3 +
   4 files changed, 298 insertions(+), 136 deletions(-)
drivers/gpio/s5p_gpio.c +0 -0
index 99f2dd8..13d74eb 100644
@@ -6,8 +6,15 @@
    */
 

..snip..

Quoted 21 lines

+/**
+ * We have a top-level GPIO device with no actual GPIOs. It has a child
+ * device for each Exynos GPIO bank.
+ */

drivers/gpio/s5p_gpio.c +13 -0
+static int gpio_exynos_bind(struct udevice *parent)
+{
+       struct exynos_gpio_platdata *plat = parent->platdata;
+       struct s5p_gpio_bank *bank, *base;
+       const void *blob = gd->fdt_blob;
+       int node;
+
+       /* If this is a child device, there is nothing to do here */
+       if (plat)
+               return 0;
+
+       base = (struct s5p_gpio_bank *)fdtdec_get_addr(gd->fdt_blob,
+                                                  parent->of_offset,

"reg");
+ for (node = fdt_first_subnode(blob, parent->of_offset), bank =
base;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 424

Quoted 2 lines
drivers/gpio/s5p_gpio.c +2 -0
+            node > 0;
+            node = fdt_next_subnode(blob, node), bank++) {

Here (bank++) you assume, that order of subnodes of each pinctrl is the same
like in dts file - as I wrote in comment to patch 04 - it isn't.

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 434

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+               struct exynos_gpio_platdata *plat;
+               struct udevice *dev;
+               fdt_addr_t reg;
+               int ret;
+
+               if (!fdtdec_get_bool(blob, node, "gpio-controller"))
+                       continue;
+               plat = calloc(1, sizeof(*plat));
+               if (!plat)
+                       return -ENOMEM;

Some parts of GPIO banks, for which "reg" can be found are prober.

Quoted 17 lines
drivers/gpio/s5p_gpio.c +3 -0
+               reg = fdtdec_get_addr(blob, node, "reg");
+               if (reg != FDT_ADDR_T_NONE)
+                       bank = (struct s5p_gpio_bank *)((ulong)base +

reg);

drivers/gpio/s5p_gpio.c +6 -0
+               plat->bank = bank;
+               plat->bank_name = fdt_get_name(blob, node, NULL);
+               debug("dev at %p: %s\n", bank, plat->bank_name);
+
+               ret = device_bind(parent, parent->driver,
+                                       plat->bank_name, plat, -1,

&dev);

drivers/gpio/s5p_gpio.c +6 -0
+               if (ret)
+                       return ret;
+               dev->of_offset = parent->of_offset;
+       }
+
+       return 0;

drivers/gpio/s5p_gpio.c void gpio_set_rate(int gpio, int mode) · line 459

Quoted 10 lines
drivers/gpio/s5p_gpio.c +10 -0
+}
+
+static const struct udevice_id exynos_gpio_ids[] = {
+       { .compatible = "samsung,s5pc100-pinctrl" },
+       { .compatible = "samsung,s5pc110-pinctrl" },
+       { .compatible = "samsung,exynos4210-pinctrl" },
+       { .compatible = "samsung,exynos4x12-pinctrl" },
+       { .compatible = "samsung,exynos5250-pinctrl" },
+       { .compatible = "samsung,exynos5420-pinctrl" },
+       { }

... snip ...

And this is not the end of issues:)

Unfortunately Exynos4xxx has a gaps in GPIO bank address space, and the big
gpio enum lists includes that here:
arch/arm/include/asm/arch-exynos/gpio.h

This works for Exynos5, because it's enum list is linear.

And the driver gpio-uclass.c - assumes that the gpio numbers are linear. When I removed the gaps in enum for 4x12 -then gpio is mapped good.

And after remove the enum gaps, it also requires fitting the gpios in dts
files, e.g. cd-gpio, pwr-gpios for sdhci host.

Quoted 5 lines

Sorry for such late reply in v9 but, before it seems working fine - I didn't
try to check the sd card before.

I hope that after that fixes, everything will work fine:)

Thanks very much for testing this. As mentioned on the other patch, please try u-boot-dm/next and see how things look.

Quoted 8 lines
Quoted 3 lines

Regards,
Simon

No problem, it's also important for me. I will check the "next" in a few minutes.

Regards,

Quoted 6 lines

After a quick look into the code I suppose that the issues are not fixed, but it is tested for sure:)

So the main required changes:
1. Remove/fix all "**pinctrl-uboot.dtsi" files and move the cells size into "pinctrl.dtsi"

I was asked to keep the U-Boot changes separate, at least until they can be sent to the kernel. I believe the new approach in that tree should fix the problem, since I had the files in the wrong order.

Quoted 6 lines

2. Remove the gaps in Exynos4xxx gpio enum:
arch/arm/include/asm/arch-exynos/gpio.

and now I checked that the same is for s5pc110, here:
arch/arm/include/asm/arch-s5pc1xx/gpio.h (only S5PC110_GPIO_H00)

OK I'll remove that.

Quoted 2 lines

3. Fix exynos4xxx boards *.dts after remove the gaps in gpio enum.

Will remove. Those gaps were a really horrible hack IMO!

I think I'll resend the whole series with these changes.

Regards,
iImon

#20 lore raw

v9 cover Enable driver model for GPIOs on Tegra and Exynos

In reply to Simon Glass

Hello Simon,
Everything seems fine, but there some issues. In last days I tried to run my Odroid with SD card and the card is not detected, then I found few things, that should be fixed. Please follow other patch comments.

Quoted 131 lines · Simon Glass

(Note: Tegra patches have been applied, I am resending with exynos only)

Now that driver model is part of U-Boot, the task of converting drivers over to it begins. GPIO is one of the easiest to convert, since it already has a sandbox driver and a uclass driver.

The Tegra GPIO driver is relatively simple since it has a linear numbering and already uses the generic GPIO framework. Each GPIO bank has a separate device. Some arguments have been made that a single device should support all the GPIO banks, but currently the driver model uclass does not work that way and it would require a second-level data structure to handle the bank feature.

This driver has been tested on:

- Seaboard (Tegra 20)
- Beaver (Tegra 30)
- Jetson-TK1 (Tegra 124).

I don't have a Tegra 114 board (Dalmore seems to be the only one with U-Boot support) but I am quite confident that it works.

For exynos, the pinctrl device tree files are brought in from the kernel and cut down to remove the groupings which we don't yet use. Very small additions are made to avoid replicating the awful tables that Linux has for every exynos SoC. This series sits on top of the exynos refactors.

The 'gpio' command is updated to support display of only the allocated GPIOs. This is much more friendly than displaying a large table.

A few related clean-ups are provided as well.

This series is available at u-boot-dm.git, branch working.

Changes in v9:
- Change compatible string to s5pc110-pinctrl for s5p_goni
- Add missing compatible strings from exynos_gpio_ids[]

Changes in v8:
- Adjust odroid device tree file to use #include instead of /include/
- Add missing special case reg property for exynos5420 GPX0
- Add patch containing pinctrl settings for s5p_goni
- Add patch containing pinctrl settings for s5p_goni
- Add new patch to move smdkc100 to generic board
- Add new patch to move s5p_goni to generic board
- Enable driver model for smdkc100 and s5p_goni separately

Changes in v7:
- Bring in patches from the SPI series to move post-reloc DM init earlier

Changes in v6:
- Fix typo in compatible string
- Remove exynos5420.dtsi which is not used in U-Boot
- Move U-Boot changes into their own file
- Use exynos54xx everywhere instead of exynos5420

Changes in v5:
- Put this patch before the others to avoid breaking bisectability
- Add additional gpio_request() calls for other samsung boards
- Use a mask instead of division in gpio_request() naming call
- Remove RFC label now that build errors are fixed
- Tidy up and update cover letter message
- Avoid reordering functions

Changes in v4:
- Add patches for exynos GPIO support

Simon Glass (12):
dm: exynos: dts: Convert /include/ to #include
dm: exynos: Bring in pinctrl dts files from Linux kernel
dm: exynos: dts: Remove unused pinctrl information to save space
dm: exynos: dts: Adjust device tree files for U-Boot
dm: exynos: Add pinctrl settings for smdkc100
dm: exynos: Add pinctrl settings for s5p_goni
dm: exynos: Move smdkc100 to generic board
dm: exynos: Move s5p_goni to generic board
dm: exynos: Tidy up GPIO headers
dm: exynos: Tidy up GPIO defines
dm: exynos: Make sure that GPIOs are requested
dm: exynos: gpio: Convert to driver model

  arch/arm/cpu/armv7/exynos/pinmux.c         |   5 +-
  arch/arm/dts/exynos4.dtsi                  |   9 +-
  arch/arm/dts/exynos4210-origen.dts         |   4 +-
  arch/arm/dts/exynos4210-pinctrl-uboot.dtsi |  27 ++
  arch/arm/dts/exynos4210-pinctrl.dtsi       | 306 ++++++++++++++++++++
  arch/arm/dts/exynos4210-smdkv310.dts       |   2 +-
  arch/arm/dts/exynos4210-trats.dts          |   2 +-
  arch/arm/dts/exynos4210-universal_c210.dts |   2 +-
  arch/arm/dts/exynos4210.dtsi               | 155 ++++++++++
  arch/arm/dts/exynos4412-odroid.dts         |   2 +-
  arch/arm/dts/exynos4412-trats2.dts         |   2 +-
  arch/arm/dts/exynos4412.dtsi               |  38 +++
  arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi |  46 +++
  arch/arm/dts/exynos4x12-pinctrl.dtsi       | 346 ++++++++++++++++++++++
  arch/arm/dts/exynos4x12.dtsi               | 114 ++++++++
  arch/arm/dts/exynos5.dtsi                  |  56 +++-
  arch/arm/dts/exynos5250-pinctrl-uboot.dtsi |  40 +++
  arch/arm/dts/exynos5250-pinctrl.dtsi       | 333 +++++++++++++++++++++
  arch/arm/dts/exynos5250-smdk5250.dts       |   2 +-
  arch/arm/dts/exynos5250-snow.dts           |   2 +-
  arch/arm/dts/exynos5250.dtsi               |  40 ++-
  arch/arm/dts/exynos5420-peach-pit.dts      |   2 +-
  arch/arm/dts/exynos5420-smdk5420.dts       |   2 +-
  arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi |  40 +++
  arch/arm/dts/exynos54xx-pinctrl.dtsi       | 305 ++++++++++++++++++++
  arch/arm/dts/exynos54xx.dtsi               |  44 ++-
  arch/arm/dts/s5pc100-pinctrl.dtsi          | 180 ++++++++++++
  arch/arm/dts/s5pc110-pinctrl.dtsi          | 273 ++++++++++++++++++
  arch/arm/dts/s5pc1xx-goni.dts              |   7 +
  arch/arm/dts/s5pc1xx-smdkc100.dts          |   7 +
  arch/arm/include/asm/arch-exynos/gpio.h    |   5 -
  arch/arm/include/asm/arch-s5pc1xx/gpio.h   |   4 -
  board/samsung/arndale/arndale.c            |   4 +-
  board/samsung/common/board.c               |   2 +-
  board/samsung/common/misc.c                |   3 +-
  board/samsung/goni/goni.c                  |   4 +-
  board/samsung/origen/origen.c              |   2 +-
  board/samsung/smdk5250/exynos5-dt.c        |   7 +
  board/samsung/smdk5420/smdk5420.c          |   6 +-
  board/samsung/smdkc100/smdkc100.c          |   2 +-
  board/samsung/smdkv310/smdkv310.c          |   2 +-
  board/samsung/trats/trats.c                |  17 +-
  board/samsung/trats2/trats2.c              |  27 +-
  board/samsung/universal_c210/universal.c   |   4 +-
  drivers/gpio/s5p_gpio.c                    | 446 +++++++++++++++++++----------
  drivers/mmc/s5p_sdhci.c                    |   7 +-
  include/configs/exynos-common.h            |   4 +
  include/configs/s5p_goni.h                 |   5 +
  include/configs/smdkc100.h                 |   5 +
  49 files changed, 2758 insertions(+), 191 deletions(-)
Quoted 14 lines

create mode 100644 arch/arm/dts/exynos4210-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos4210-pinctrl.dtsi create mode 100644 arch/arm/dts/exynos4210.dtsi create mode 100644 arch/arm/dts/exynos4412.dtsi create mode 100644 arch/arm/dts/exynos4x12-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos4x12-pinctrl.dtsi create mode 100644 arch/arm/dts/exynos4x12.dtsi create mode 100644 arch/arm/dts/exynos5250-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos5250-pinctrl.dtsi create mode 100644 arch/arm/dts/exynos54xx-pinctrl-uboot.dtsi create mode 100644 arch/arm/dts/exynos54xx-pinctrl.dtsi create mode 100644 arch/arm/dts/s5pc100-pinctrl.dtsi create mode 100644 arch/arm/dts/s5pc110-pinctrl.dtsi

Best Regards,

Signature · 4 lines
Przemyslaw Marczak
Samsung R&D Institute Poland
Samsung Electronics
p.marczak at samsung.com