Skip to contentSkip to conversation

EXYNOS5: Add FDT support for USB

PATCH New Rajeshwari Shinde 3 participants 10 messages Dec 6, 2012

Subsystems (5)
lore
Share & tools
lore
#0 lore raw

v2 cover EXYNOS5: Add FDT support for USB

This patch set adds FDT support for USB device.

This patch set is based on
"EXYNOS5: MAX77686 add FDT support"

Changes in V2:
- Removed checkpatch errors.

Rajeshwari Shinde (3):
EHCI: Exynos: Add fdt support
EXYNOS5: Add devine node for USB.
EXYNOS5: FDT: Add compatible strings for USB

 arch/arm/dts/exynos5250.dtsi   |    7 +++++
 drivers/usb/host/ehci-exynos.c |   59 ++++++++++++++++++++++++++++++++++++---
 include/fdtdec.h               |    1 +
 lib/fdtdec.c                   |    1 +
 4 files changed, 63 insertions(+), 5 deletions(-)
Signature · 1 line
1.7.4.4
#1 lore raw

PATCH v2 1/3 EHCI: Exynos: Add fdt support

Adding fdt support to ehci-exynos in order to parse register base addresses from the device node.

---
Chnages in V2:
- Removed checkpatch errors.

 drivers/usb/host/ehci-exynos.c |   59 ++++++++++++++++++++++++++++++++++++---
 1 files changed, 54 insertions(+), 5 deletions(-)
drivers/usb/host/ehci-exynos.c +54 -5
index 9f0ed06..f9189a5 100644
@@ -21,6 +21,8 @@
  */
 
 #include <common.h>
+#include <fdtdec.h>
+#include <libfdt.h>
 #include <usb.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/ehci.h>
@@ -28,6 +30,9 @@
 #include <asm/arch/power.h>
 #include "ehci.h"
 
+/* Declare global data pointer */
+DECLARE_GLOBAL_DATA_PTR;
+
 /* Setup the EHCI host controller. */
 static void setup_usb_phy(struct exynos_usb_phy *usb)
 {
@@ -86,12 +91,39 @@ static void reset_usb_phy(struct exynos_usb_phy *usb)
  */
 int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
 {
-	struct exynos_usb_phy *usb;
+	struct exynos_usb_phy *usb = NULL;
+	unsigned int *hcd = NULL;
+	unsigned int node;
+
+	node = fdtdec_next_compatible(gd->fdt_blob, 0,
+					COMPAT_SAMSUNG_EXYNOS_EHCI);
+	if (node <= 0) {
+		debug("EHCI: Can't get device tree node for ehci\n");
+		return -1;
+	}
+
+	/*
+	 * Get the base address for usbphy from the device node
+	 */
+	usb = (struct exynos_usb_phy *)fdtdec_get_addr(gd->fdt_blob, node,
+								"phyreg");
+	if (usb == NULL) {
+		debug("Can't get the usbphy register address\n");
+		return -1;
+	}
 
-	usb = (struct exynos_usb_phy *)samsung_get_base_usb_phy();
 	setup_usb_phy(usb);
 
-	*hccr = (struct ehci_hccr *)samsung_get_base_usb_ehci();
+	/*
+	 * Get the base address for XHCI controller from the device node
+	 */
+	hcd = (unsigned int *)fdtdec_get_addr(gd->fdt_blob, node, "reg");
+	if (hcd == NULL) {
+		debug("Can't get the XHCI registere address\n");
+		return -1;
+	}
+
+	*hccr = (struct ehci_hccr *)hcd;
 	*hcor = (struct ehci_hcor *)((uint32_t) *hccr
 				+ HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
 
@@ -108,9 +140,26 @@ int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor **hcor)
  */
 int ehci_hcd_stop(int index)
 {
-	struct exynos_usb_phy *usb;
+	struct exynos_usb_phy *usb = NULL;
+	unsigned int node;
+
+	node = fdtdec_next_compatible(gd->fdt_blob, 0,
+					COMPAT_SAMSUNG_EXYNOS_EHCI);
+	if (node <= 0) {
+		debug("EHCI: Can't get device tree node for ehci\n");
+		return -1;
+	}
+
+	/*
+	 * Get the base address for usbphy from the device node
+	 */
+	usb = (struct exynos_usb_phy *)fdtdec_get_addr(gd->fdt_blob, node,
+								"phyreg");
+	if (usb == NULL) {
+		debug("Can't get the usbphy register address\n");
+		return -1;
+	}
 
-	usb = (struct exynos_usb_phy *)samsung_get_base_usb_phy();
 	reset_usb_phy(usb);
 
 	return 0;
Signature · 1 line
1.7.4.4
#2 lore raw

PATCH v2 1/3 EHCI: Exynos: Add fdt support

Dear Rajeshwari Shinde,

Quoted 38 lines

Adding fdt support to ehci-exynos in order to parse register base addresses from the device node.

---
Chnages in V2:
- Removed checkpatch errors.

 drivers/usb/host/ehci-exynos.c |   59

++++++++++++++++++++++++++++++++++++--- 1 files changed, 54 insertions(+), 5 deletions(-)

(quoted diff) +0 -0

b/drivers/usb/host/ehci-exynos.c index 9f0ed06..f9189a5 100644

drivers/usb/host/ehci-exynos.c +5 -0
@@ -21,6 +21,8 @@
  */
 
 #include <common.h>
+#include <fdtdec.h>
+#include <libfdt.h>
 #include <usb.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/ehci.h>
@@ -28,6 +30,9 @@
 #include <asm/arch/power.h>
 #include "ehci.h"
 
+/* Declare global data pointer */
+DECLARE_GLOBAL_DATA_PTR;
+
 /* Setup the EHCI host controller. */
 static void setup_usb_phy(struct exynos_usb_phy *usb)
 {
@@ -86,12 +91,39 @@ static void reset_usb_phy(struct exynos_usb_phy *usb)
  */
 int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor

drivers/usb/host/ehci-exynos.c static void reset_usb_phy(struct exynos_usb_phy *usb) · line 101

Quoted 10 lines
drivers/usb/host/ehci-exynos.c +8 -1
 **hcor) {
-	struct exynos_usb_phy *usb;
+	struct exynos_usb_phy *usb = NULL;
+	unsigned int *hcd = NULL;
+	unsigned int node;
+
+	node = fdtdec_next_compatible(gd->fdt_blob, 0,
+					COMPAT_SAMSUNG_EXYNOS_EHCI);
+	if (node <= 0) {
+		debug("EHCI: Can't get device tree node for ehci\n");

[...]

error output should be really puts() or printf() ...

You can also use errno.h instead of -1.

Rest is good

#3 lore raw

PATCH v2 1/3 EHCI: Exynos: Add fdt support

Hi Marek,

Quoted 52 lines · Marek Vasut

Dear Rajeshwari Shinde,

Quoted 48 lines

Adding fdt support to ehci-exynos in order to parse register base addresses from the device node.

---
Chnages in V2:
- Removed checkpatch errors.

 drivers/usb/host/ehci-exynos.c |   59

++++++++++++++++++++++++++++++++++++--- 1 files changed, 54 insertions(+), 5 deletions(-)

(quoted diff) +0 -0

b/drivers/usb/host/ehci-exynos.c index 9f0ed06..f9189a5 100644

drivers/usb/host/ehci-exynos.c +13 -1
@@ -21,6 +21,8 @@
  */
 
 #include <common.h>
+#include <fdtdec.h>
+#include <libfdt.h>
 #include <usb.h>
 #include <asm/arch/cpu.h>
 #include <asm/arch/ehci.h>
@@ -28,6 +30,9 @@
 #include <asm/arch/power.h>
 #include "ehci.h"
 
+/* Declare global data pointer */
+DECLARE_GLOBAL_DATA_PTR;
+
 /* Setup the EHCI host controller. */
 static void setup_usb_phy(struct exynos_usb_phy *usb)
 {
@@ -86,12 +91,39 @@ static void reset_usb_phy(struct exynos_usb_phy *usb)
  */
 int ehci_hcd_init(int index, struct ehci_hccr **hccr, struct ehci_hcor
 **hcor) {
-     struct exynos_usb_phy *usb;
+     struct exynos_usb_phy *usb = NULL;
+     unsigned int *hcd = NULL;
+     unsigned int node;
+
+     node = fdtdec_next_compatible(gd->fdt_blob, 0,
+                                     COMPAT_SAMSUNG_EXYNOS_EHCI);
+     if (node <= 0) {
+             debug("EHCI: Can't get device tree node for ehci\n");

[...]

Quoted 1 line

error output should be really puts() or printf() ...

Ick that bloats the code badly for an uncommon case. Would really prefer to avoid this.

Quoted 2 lines

You can also use errno.h instead of -1.

True, it might help debugging, although many times it is hard to map the error onto a suitable number designed for Linux. This 'return -1' is pretty common in U-Boot (generic error).

Quoted 2 lines

Rest is good

Regards,
Simon

#4 lore raw

PATCH v2 1/3 EHCI: Exynos: Add fdt support

Dear Simon Glass,

[...]

Quoted 6 lines
Quoted 3 lines

[...]

error output should be really puts() or printf() ...

Ick that bloats the code badly for an uncommon case. Would really prefer to avoid this.

What do you mean? Are you saying this debug() is correct and this is triggered often? How come?

Quoted 5 lines
Quoted 1 line

You can also use errno.h instead of -1.

True, it might help debugging, although many times it is hard to map the error onto a suitable number designed for Linux. This 'return -1' is pretty common in U-Boot (generic error).

I know, but it'd be nice if this changed. Just a suggestion.

Best regards,
Marek Vasut

#5 lore raw

PATCH v2 1/3 EHCI: Exynos: Add fdt support

Hi Marek,

Quoted 6 lines · Marek Vasut

Dear Simon Glass,

[...]

Quoted 2 lines
Quoted 2 lines

[...]

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

error output should be really puts() or printf() ...

Ick that bloats the code badly for an uncommon case. Would really prefer to avoid this.

What do you mean? Are you saying this debug() is correct and this is triggered often? How come?

I mean that debug() in a driver does not generate any code unless DEBUG is defined in that module. The way I do it is when I have a problem in a module I define DEBUG there, which makes all the messages work. But then in the normal case (when not debugging) the code size is not bloated by messages.

So I much prefer debug() to printf() for uncommon messages in drivers, etc.

Quoted 8 lines
Quoted 6 lines
Quoted 2 lines

You can also use errno.h instead of -1.

True, it might help debugging, although many times it is hard to map the error onto a suitable number designed for Linux. This 'return -1' is pretty common in U-Boot (generic error).

I know, but it'd be nice if this changed. Just a suggestion.

Yes agreed. I recently had a driver which could fail in about 12 different places (different stages of hardware init), so I just created an enum for 12 errors. It wouldn't have been sensible in that case to try and fail to map those onto the errno errors, but in many cases (with fewer error conditions) it would be useful.

Regards,
Simon

Quoted 3 lines

Best regards,
Marek Vasut

#6 lore raw

PATCH v2 1/3 EHCI: Exynos: Add fdt support

Dear Simon Glass,

Quoted 17 lines

Hi Marek,

Quoted 6 lines · Marek Vasut

Dear Simon Glass,

[...]

Quoted 2 lines
Quoted 2 lines

[...]

Quoted 7 lines
Quoted 4 lines
Quoted 1 line

error output should be really puts() or printf() ...

Ick that bloats the code badly for an uncommon case. Would really prefer to avoid this.

What do you mean? Are you saying this debug() is correct and this is triggered often? How come?

Quoted 7 lines

I mean that debug() in a driver does not generate any code unless DEBUG is defined in that module. The way I do it is when I have a problem in a module I define DEBUG there, which makes all the messages work. But then in the normal case (when not debugging) the code size is not bloated by messages.

So I much prefer debug() to printf() for uncommon messages in drivers, etc.

That's true ... and you're right if the FDT is correct, this will all work well. Ok, whichever way works for me.

Quoted 6 lines
Quoted 6 lines
Quoted 5 lines
Quoted 1 line

You can also use errno.h instead of -1.

True, it might help debugging, although many times it is hard to map the error onto a suitable number designed for Linux. This 'return -1' is pretty common in U-Boot (generic error).

Quoted 7 lines
Quoted 1 line

I know, but it'd be nice if this changed. Just a suggestion.

Yes agreed. I recently had a driver which could fail in about 12 different places (different stages of hardware init), so I just created an enum for 12 errors. It wouldn't have been sensible in that case to try and fail to map those onto the errno errors, but in many cases (with fewer error conditions) it would be useful.

Yup

Best regards,
Marek Vasut

#7 lore raw

PATCH v2 2/3 EXYNOS5: Add devine node for USB.

In reply to Rajeshwari Shinde

This patch adds the device node required for USB

---
Chnages in V2:
- None

 arch/arm/dts/exynos5250.dtsi |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
arch/arm/dts/exynos5250.dtsi +7 -0
index 2073ef2..dc727fc 100644
@@ -143,4 +143,11 @@
 		reg = <0x131b0000 0x30>;
 		interrupts = <0 130 0>;
 	};
+
+	ehci at 12110000 {
+		compatible = "samsung,exynos-ehci";
+		reg = <0x12110000 0x100>;
+		phyreg = <0x12130000>;
+	};
+
 };
Signature · 1 line
1.7.4.4
#8 lore raw

PATCH v2 2/3 EXYNOS5: Add devine node for USB.

Dear Rajeshwari Shinde,

Subject ... add "device" node ...

Quoted 15 lines

This patch adds the device node required for USB

---
Chnages in V2:
- None

 arch/arm/dts/exynos5250.dtsi |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)
arch/arm/dts/exynos5250.dtsi +0 -0
index 2073ef2..dc727fc 100644
@@ -143,4 +143,11 @@
 		reg = <0x131b0000 0x30>;

arch/arm/dts/exynos5250.dtsi line 153

Quoted 10 lines
arch/arm/dts/exynos5250.dtsi +7 -0
 		interrupts = <0 130 0>;
 	};
+
+	ehci at 12110000 {
+		compatible = "samsung,exynos-ehci";
+		reg = <0x12110000 0x100>;
+		phyreg = <0x12130000>;
+	};
+
 };

Best regards,
Marek Vasut

#9 lore raw

PATCH v2 3/3 EXYNOS5: FDT: Add compatible strings for USB

In reply to Rajeshwari Shinde

Add required compatible information for USB

---
Changes in V2:
- None.

 include/fdtdec.h |    1 +
 lib/fdtdec.c     |    1 +
 2 files changed, 2 insertions(+), 0 deletions(-)
include/fdtdec.h +1 -0
index 5934af1..c464d58 100644
@@ -74,6 +74,7 @@ enum fdt_compat_id {
 	COMPAT_WOLFSON_WM8994_CODEC,	/* Wolfson WM8994 Sound Codec */
 	COMPAT_SAMSUNG_EXYNOS_SPI,	/* Exynos SPI */
 	COMPAT_MAXIM_MAX77686_PMIC,	/* MAX77686 PMIC */
+	COMPAT_SAMSUNG_EXYNOS_EHCI,	/* Exynos EHCI controller */
 
 	COMPAT_COUNT,
 };
lib/fdtdec.c +1 -0
index 6bc57c5..eb2ff6c 100644
@@ -51,6 +51,7 @@ static const char * const compat_names[COMPAT_COUNT] = {
 	COMPAT(WOLFSON_WM8994_CODEC, "wolfson,wm8994-codec"),
 	COMPAT(SAMSUNG_EXYNOS_SPI, "samsung,exynos-spi"),
 	COMPAT(MAXIM_MAX77686_PMIC, "maxim,MAX77686_PMIC"),
+	COMPAT(SAMSUNG_EXYNOS_EHCI, "samsung,exynos-ehci"),
 };
 
 const char *fdtdec_get_compatible(enum fdt_compat_id id)
Signature · 1 line
1.7.4.4