[RFC PATCH 0/3] Fix i2c bus hang on A0 version of the Armada XP SoCs

STALE4594d

Revision rfc of 6 in this series.

7 messages, 3 authors, 2014-01-02 · open the first message on its own page

[RFC PATCH 0/3] Fix i2c bus hang on A0 version of the Armada XP SoCs

From: Gregory CLEMENT <hidden>
Date: 2013-12-31 16:44:50

Hi,

This series is an RFC to fix the i2c bus hang on A0 version of the
Armada XP SoCs. It occured on the the eraly release of the OpenBlocks
AX3-4 bords. Indeed the first variants of Armada XP SoCs (A0 stepping)
have issues related to the i2c controller which prevent to use the
offload mechanism and lead to a kernel hang during boot.

The best solution will be to detect the SoCs version at runtime and
use it in the driver, but I chosed to submit this version in case CPU
version detection feature takes more time than expected (and we
already reached the rc6 kernel).

Thanks,

Gregory


Gregory CLEMENT (3):
  arm: mvebu: add new dts file for old variant of Openblocks AX3-4
  i2c: mv64xxx: Fix bus hang on A0 version of the Armada XP SoCs
  i2c: mv64xxx: Document the newly introduced Armada XP A0 compatible

 .../devicetree/bindings/i2c/i2c-mv64xxx.txt        |   2 +-
 .../arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts |  40 +++++
 .../dts/armada-xp-common-openblocks-ax3-4.dtsi     | 177 +++++++++++++++++++++
 arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts   | 164 +------------------
 drivers/i2c/busses/i2c-mv64xxx.c                   |   8 +
 5 files changed, 227 insertions(+), 164 deletions(-)
 create mode 100644 arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
 create mode 100644 arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi

-- 
1.8.1.2

[RFC PATCH 1/3] arm: mvebu: add new dts file for old variant of Openblocks AX3-4

From: Gregory CLEMENT <hidden>
Date: 2013-12-31 16:44:51

The first variants of Openblocks AX3-4 used the revision A0 of the
Armada XP SoCs. These early variants have issues related to the i2c
controller which prevent to use the offload mechanism and lead to a
kernel hang during boot.

The new dts file uses the compatible string marvell,mv78230-a0-i2c for
the i2c controller, thanks to this the driver disable the offload
mechanism and the kernel no more hangs on these boards.

Signed-off-by: Gregory CLEMENT <redacted>
---
 .../arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts |  40 +++++
 .../dts/armada-xp-common-openblocks-ax3-4.dtsi     | 177 +++++++++++++++++++++
 arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts   | 164 +------------------
 3 files changed, 218 insertions(+), 163 deletions(-)
 create mode 100644 arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
 create mode 100644 arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi
diff --git a/arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
new file mode 100644
index 000000000000..b3ea65255c19
--- /dev/null
+++ b/arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
@@ -0,0 +1,40 @@
+/*
+ * Device Tree file for OpenBlocks AX3-4 board with A0 SoC
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Gregory CLEMENT <gregory.clement@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+/dts-v1/;
+#include "armada-xp-common-openblocks-ax3-4.dtsi"
+
+/ {
+	model = "PlatHome OpenBlocks AX3-4 board (A0 SoC)";
+	compatible = "plathome,openblocks-ax3-4", "marvell,armadaxp-mv78260", "marvell,armadaxp", "marvell,armada-370-xp";
+
+	chosen {
+		bootargs = "console=ttyS0,115200 earlyprintk";
+	};
+
+	memory {
+		device_type = "memory";
+		reg = <0 0x00000000 0 0xC0000000>; /* 3 GB */
+	};
+
+	soc {
+
+		internal-regs {
+			i2c at 11000 {
+				compatible = "marvell,mv78230-a0-i2c", "marvell,mv64xxx-i2c";
+			};
+			i2c at 11100 {
+				compatible = "marvell,mv78230-a0-i2c", "marvell,mv64xxx-i2c";
+			};
+		};
+	};
+};
diff --git a/arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi b/arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi
new file mode 100644
index 000000000000..0d452b07baf5
--- /dev/null
+++ b/arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi
@@ -0,0 +1,177 @@
+/*
+ * Device Tree file for OpenBlocks AX3-4 board
+ *
+ * Copyright (C) 2012 Marvell
+ *
+ * Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ *
+ * This file is licensed under the terms of the GNU General Public
+ * License version 2.  This program is licensed "as is" without any
+ * warranty of any kind, whether express or implied.
+ */
+
+#include "armada-xp-mv78260.dtsi"
+
+/ {
+	soc {
+		ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
+			  MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
+			  MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
+
+		devbus-bootcs {
+			status = "okay";
+
+			/* Device Bus parameters are required */
+
+			/* Read parameters */
+			devbus,bus-width    = <8>;
+			devbus,turn-off-ps  = <60000>;
+			devbus,badr-skew-ps = <0>;
+			devbus,acc-first-ps = <124000>;
+			devbus,acc-next-ps  = <248000>;
+			devbus,rd-setup-ps  = <0>;
+			devbus,rd-hold-ps   = <0>;
+
+			/* Write parameters */
+			devbus,sync-enable = <0>;
+			devbus,wr-high-ps  = <60000>;
+			devbus,wr-low-ps   = <60000>;
+			devbus,ale-wr-ps   = <60000>;
+
+			/* NOR 128 MiB */
+			nor at 0 {
+				compatible = "cfi-flash";
+				reg = <0 0x8000000>;
+				bank-width = <2>;
+			};
+		};
+
+		pcie-controller {
+			status = "okay";
+			/* Internal mini-PCIe connector */
+			pcie at 1,0 {
+				/* Port 0, Lane 0 */
+				status = "okay";
+			};
+		};
+
+		internal-regs {
+			serial at 12000 {
+				clock-frequency = <250000000>;
+				status = "okay";
+			};
+			serial at 12100 {
+				clock-frequency = <250000000>;
+				status = "okay";
+			};
+			pinctrl {
+				led_pins: led-pins-0 {
+					marvell,pins = "mpp49", "mpp51", "mpp53";
+					marvell,function = "gpio";
+				};
+			};
+			leds {
+				compatible = "gpio-leds";
+				pinctrl-names = "default";
+				pinctrl-0 = <&led_pins>;
+
+				red_led {
+					label = "red_led";
+					gpios = <&gpio1 17 1>;
+					default-state = "off";
+				};
+
+				yellow_led {
+					label = "yellow_led";
+					gpios = <&gpio1 19 1>;
+					default-state = "off";
+				};
+
+				green_led {
+					label = "green_led";
+					gpios = <&gpio1 21 1>;
+					default-state = "off";
+					linux,default-trigger = "heartbeat";
+				};
+			};
+
+			gpio_keys {
+				compatible = "gpio-keys";
+				#address-cells = <1>;
+				#size-cells = <0>;
+
+				button at 1 {
+					label = "Init Button";
+					linux,code = <116>;
+					gpios = <&gpio1 28 0>;
+				};
+			};
+
+			mdio {
+				phy0: ethernet-phy at 0 {
+					reg = <0>;
+				};
+
+				phy1: ethernet-phy at 1 {
+					reg = <1>;
+				};
+
+				phy2: ethernet-phy at 2 {
+					reg = <2>;
+				};
+
+				phy3: ethernet-phy at 3 {
+					reg = <3>;
+				};
+			};
+
+			ethernet at 70000 {
+				status = "okay";
+				phy = <&phy0>;
+				phy-mode = "sgmii";
+			};
+			ethernet at 74000 {
+				status = "okay";
+				phy = <&phy1>;
+				phy-mode = "sgmii";
+			};
+			ethernet at 30000 {
+				status = "okay";
+				phy = <&phy2>;
+				phy-mode = "sgmii";
+			};
+			ethernet at 34000 {
+				status = "okay";
+				phy = <&phy3>;
+				phy-mode = "sgmii";
+			};
+			i2c at 11000 {
+				status = "okay";
+				clock-frequency = <400000>;
+			};
+			i2c at 11100 {
+				status = "okay";
+				clock-frequency = <400000>;
+
+				s35390a: s35390a at 30 {
+					compatible = "s35390a";
+					reg = <0x30>;
+				};
+			};
+			sata at a0000 {
+				nr-ports = <2>;
+				status = "okay";
+			};
+
+			/* Front side USB 0 */
+			usb at 50000 {
+				status = "okay";
+			};
+
+			/* Front side USB 1 */
+			usb at 51000 {
+				status = "okay";
+			};
+		};
+	};
+};
diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
index 5695afcc04bf..1983de77c3ff 100644
--- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
+++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
@@ -11,7 +11,7 @@
  */
 
 /dts-v1/;
-#include "armada-xp-mv78260.dtsi"
+#include "armada-xp-common-openblocks-ax3-4.dtsi"
 
 / {
 	model = "PlatHome OpenBlocks AX3-4 board";
@@ -25,166 +25,4 @@
 		device_type = "memory";
 		reg = <0 0x00000000 0 0xC0000000>; /* 3 GB */
 	};
-
-	soc {
-		ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
-			  MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
-			  MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
-
-		devbus-bootcs {
-			status = "okay";
-
-			/* Device Bus parameters are required */
-
-			/* Read parameters */
-			devbus,bus-width    = <8>;
-			devbus,turn-off-ps  = <60000>;
-			devbus,badr-skew-ps = <0>;
-			devbus,acc-first-ps = <124000>;
-			devbus,acc-next-ps  = <248000>;
-			devbus,rd-setup-ps  = <0>;
-			devbus,rd-hold-ps   = <0>;
-
-			/* Write parameters */
-			devbus,sync-enable = <0>;
-			devbus,wr-high-ps  = <60000>;
-			devbus,wr-low-ps   = <60000>;
-			devbus,ale-wr-ps   = <60000>;
-
-			/* NOR 128 MiB */
-			nor at 0 {
-				compatible = "cfi-flash";
-				reg = <0 0x8000000>;
-				bank-width = <2>;
-			};
-		};
-
-		pcie-controller {
-			status = "okay";
-			/* Internal mini-PCIe connector */
-			pcie at 1,0 {
-				/* Port 0, Lane 0 */
-				status = "okay";
-			};
-		};
-
-		internal-regs {
-			serial at 12000 {
-				clock-frequency = <250000000>;
-				status = "okay";
-			};
-			serial at 12100 {
-				clock-frequency = <250000000>;
-				status = "okay";
-			};
-			pinctrl {
-				led_pins: led-pins-0 {
-					marvell,pins = "mpp49", "mpp51", "mpp53";
-					marvell,function = "gpio";
-				};
-			};
-			leds {
-				compatible = "gpio-leds";
-				pinctrl-names = "default";
-				pinctrl-0 = <&led_pins>;
-
-				red_led {
-					label = "red_led";
-					gpios = <&gpio1 17 1>;
-					default-state = "off";
-				};
-
-				yellow_led {
-					label = "yellow_led";
-					gpios = <&gpio1 19 1>;
-					default-state = "off";
-				};
-
-				green_led {
-					label = "green_led";
-					gpios = <&gpio1 21 1>;
-					default-state = "off";
-					linux,default-trigger = "heartbeat";
-				};
-			};
-
-			gpio_keys {
-				compatible = "gpio-keys";
-				#address-cells = <1>;
-				#size-cells = <0>;
-
-				button at 1 {
-					label = "Init Button";
-					linux,code = <116>;
-					gpios = <&gpio1 28 0>;
-				};
-			};
-
-			mdio {
-				phy0: ethernet-phy at 0 {
-					reg = <0>;
-				};
-
-				phy1: ethernet-phy at 1 {
-					reg = <1>;
-				};
-
-				phy2: ethernet-phy at 2 {
-					reg = <2>;
-				};
-
-				phy3: ethernet-phy at 3 {
-					reg = <3>;
-				};
-			};
-
-			ethernet at 70000 {
-				status = "okay";
-				phy = <&phy0>;
-				phy-mode = "sgmii";
-			};
-			ethernet at 74000 {
-				status = "okay";
-				phy = <&phy1>;
-				phy-mode = "sgmii";
-			};
-			ethernet at 30000 {
-				status = "okay";
-				phy = <&phy2>;
-				phy-mode = "sgmii";
-			};
-			ethernet at 34000 {
-				status = "okay";
-				phy = <&phy3>;
-				phy-mode = "sgmii";
-			};
-			i2c at 11000 {
-				status = "okay";
-				clock-frequency = <400000>;
-			};
-			i2c at 11100 {
-				status = "okay";
-				clock-frequency = <400000>;
-
-				s35390a: s35390a at 30 {
-					compatible = "s35390a";
-					reg = <0x30>;
-				};
-			};
-			sata at a0000 {
-				nr-ports = <2>;
-				status = "okay";
-			};
-
-			/* Front side USB 0 */
-			usb at 50000 {
-				status = "okay";
-			};
-
-			/* Front side USB 1 */
-			usb at 51000 {
-				status = "okay";
-			};
-		};
-	};
 };
-- 
1.8.1.2

[RFC PATCH 2/3] i2c: mv64xxx: Fix bus hang on A0 version of the Armada XP SoCs

From: Gregory CLEMENT <hidden>
Date: 2013-12-31 16:44:52

The first variants of Armada XP SoCs (A0 stepping) have issues related
to the i2c controller which prevent to use the offload mechanism and
lead to a kernel hang during boot.

The commit introduces a new the compatible string
marvell,mv78230-a0-i2c for the i2c controller. When this compatible
string is used the driver disables the offload mechanism and the
kernel no more hangs on these SoCs.

Signed-off-by: Gregory CLEMENT <redacted>
---
 drivers/i2c/busses/i2c-mv64xxx.c | 8 ++++++++
 1 file changed, 8 insertions(+)
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c
index 8be7e42aa4de..f424c0f89946 100644
--- a/drivers/i2c/busses/i2c-mv64xxx.c
+++ b/drivers/i2c/busses/i2c-mv64xxx.c
@@ -692,6 +692,10 @@ static const struct of_device_id mv64xxx_i2c_of_match_table[] = {
 	{ .compatible = "allwinner,sun4i-i2c", .data = &mv64xxx_i2c_regs_sun4i},
 	{ .compatible = "marvell,mv64xxx-i2c", .data = &mv64xxx_i2c_regs_mv64xxx},
 	{ .compatible = "marvell,mv78230-i2c", .data = &mv64xxx_i2c_regs_mv64xxx},
+	{
+		.compatible = "marvell,mv78230-a0-i2c",
+		.data = &mv64xxx_i2c_regs_mv64xxx
+	},
 	{}
 };
 MODULE_DEVICE_TABLE(of, mv64xxx_i2c_of_match_table);
@@ -783,6 +787,10 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data,
 		drv_data->errata_delay = true;
 	}
 
+	if (of_device_is_compatible(np, "marvell,mv78230-a0-i2c")) {
+		drv_data->offload_enabled = false;
+		drv_data->errata_delay = true;
+	}
 out:
 	return rc;
 #endif
-- 
1.8.1.2

[RFC PATCH 3/3] i2c: mv64xxx: Document the newly introduced Armada XP A0 compatible

From: Gregory CLEMENT <hidden>
Date: 2013-12-31 16:44:53

Signed-off-by: Gregory CLEMENT <redacted>
---
 Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
index 82e8f6f17179..9410ed72ec45 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
@@ -5,7 +5,7 @@ Required properties :
 
  - reg             : Offset and length of the register set for the device
  - compatible      : Should be "marvell,mv64xxx-i2c" or "allwinner,sun4i-i2c"
-                     or "marvell,mv78230-i2c"
+                     or "marvell,mv78230-i2c" or "marvell,mv78230-a0-i2c"
  - interrupts      : The interrupt number
 
 Optional properties :
-- 
1.8.1.2

[RFC PATCH 3/3] i2c: mv64xxx: Document the newly introduced Armada XP A0 compatible

From: Jason Cooper <hidden>
Date: 2014-01-01 21:44:36

On Tue, Dec 31, 2013 at 05:44:53PM +0100, Gregory CLEMENT wrote:
quoted hunk
Signed-off-by: Gregory CLEMENT <redacted>
---
 Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
index 82e8f6f17179..9410ed72ec45 100644
--- a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
+++ b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt
@@ -5,7 +5,7 @@ Required properties :
 
  - reg             : Offset and length of the register set for the device
  - compatible      : Should be "marvell,mv64xxx-i2c" or "allwinner,sun4i-i2c"
-                     or "marvell,mv78230-i2c"
+                     or "marvell,mv78230-i2c" or "marvell,mv78230-a0-i2c"
Once we nail down how we want to do this, Please add an explanation of
the differences between the compatibles.  eg 'offloading broken'.

thx,

Jason.
  - interrupts      : The interrupt number
 
 Optional properties :
-- 
1.8.1.2

[RFC PATCH 0/3] Fix i2c bus hang on A0 version of the Armada XP SoCs

From: andrew@lunn.ch (Andrew Lunn)
Date: 2014-01-01 19:28:16

On Tue, Dec 31, 2013 at 05:44:50PM +0100, Gregory CLEMENT wrote:
Hi,

This series is an RFC to fix the i2c bus hang on A0 version of the
Armada XP SoCs. It occured on the the eraly release of the OpenBlocks
AX3-4 bords. Indeed the first variants of Armada XP SoCs (A0 stepping)
have issues related to the i2c controller which prevent to use the
offload mechanism and lead to a kernel hang during boot.

The best solution will be to detect the SoCs version at runtime and
use it in the driver, but I chosed to submit this version in case CPU
version detection feature takes more time than expected (and we
already reached the rc6 kernel).

Thanks,

Gregory
Hi Gregory

Thanks for these RFC patches. I can confirm they work on my Openblocks
device with an A0 stepping SoC. I can now access the RTC.

You missed adding the new DTS file to the Makefile. Depending on how
the discussion goes about auto detecting stepping or not, i would of
used different filenames, probably:

armada-xp-openblocks-ax3-4.dts
armada-xp-openblocks-ax3-4-a0.dts
armada-xp-openblocks-ax3-4-common.dts

Keeps all the files together when listed alphabetically

Thanks
	Andrew

[RFC PATCH 0/3] Fix i2c bus hang on A0 version of the Armada XP SoCs

From: Gregory CLEMENT <hidden>
Date: 2014-01-02 16:22:04

Hi Andrew,

On 01/01/2014 20:28, Andrew Lunn wrote:
On Tue, Dec 31, 2013 at 05:44:50PM +0100, Gregory CLEMENT wrote:
quoted
Hi,

This series is an RFC to fix the i2c bus hang on A0 version of the
Armada XP SoCs. It occured on the the eraly release of the OpenBlocks
AX3-4 bords. Indeed the first variants of Armada XP SoCs (A0 stepping)
have issues related to the i2c controller which prevent to use the
offload mechanism and lead to a kernel hang during boot.

The best solution will be to detect the SoCs version at runtime and
use it in the driver, but I chosed to submit this version in case CPU
version detection feature takes more time than expected (and we
already reached the rc6 kernel).

Thanks,

Gregory
Hi Gregory

Thanks for these RFC patches. I can confirm they work on my Openblocks
device with an A0 stepping SoC. I can now access the RTC.

You missed adding the new DTS file to the Makefile. Depending on how
the discussion goes about auto detecting stepping or not, i would of
used different filenames, probably:
Thanks for your feedback. In case there will be a second version I will
take them into account. However I hope we won't need it as I sent a
new series to fix this bug by dynamically getting the SoC revision.
armada-xp-openblocks-ax3-4.dts
armada-xp-openblocks-ax3-4-a0.dts
armada-xp-openblocks-ax3-4-common.dts
you probably meant armada-xp-openblocks-ax3-4-common.dtsi, but I got the
point and I agree.
Keeps all the files together when listed alphabetically

-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help