Patchwork [U-Boot,1/3,V2] EHCI: Exynos: Add fdt support

login
register
mail settings
Submitter Rajeshwari Birje
Date Dec. 6, 2012, 6:32 a.m.
Message ID <1354775556-23212-2-git-send-email-rajeshwari.s@samsung.com>
Download mbox | patch
Permalink /patch/204140/
State Changes Requested
Delegated to: Minkyu Kang
Headers show

Comments

Rajeshwari Birje - Dec. 6, 2012, 6:32 a.m.
Adding fdt support to ehci-exynos in order to parse
register base addresses from the device node.

Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
---
Chnages in V2:
	- Removed checkpatch errors.
 drivers/usb/host/ehci-exynos.c |   59 ++++++++++++++++++++++++++++++++++++---
 1 files changed, 54 insertions(+), 5 deletions(-)
Marek Vasut - Dec. 6, 2012, 5:39 p.m.
Dear Rajeshwari Shinde,

> Adding fdt support to ehci-exynos in order to parse
> register base addresses from the device node.
> 
> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
> ---
> Chnages in V2:
> 	- Removed checkpatch errors.
>  drivers/usb/host/ehci-exynos.c |   59
> ++++++++++++++++++++++++++++++++++++--- 1 files changed, 54 insertions(+),
> 5 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-exynos.c
> b/drivers/usb/host/ehci-exynos.c index 9f0ed06..f9189a5 100644
> --- a/drivers/usb/host/ehci-exynos.c
> +++ b/drivers/usb/host/ehci-exynos.c
> @@ -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");
[...]

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

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

Rest is good
Simon Glass - Dec. 6, 2012, 5:57 p.m.
Hi Marek,

On Thu, Dec 6, 2012 at 9:39 AM, Marek Vasut <marex@denx.de> wrote:
> Dear Rajeshwari Shinde,
>
>> Adding fdt support to ehci-exynos in order to parse
>> register base addresses from the device node.
>>
>> Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
>> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
>> ---
>> Chnages in V2:
>>       - Removed checkpatch errors.
>>  drivers/usb/host/ehci-exynos.c |   59
>> ++++++++++++++++++++++++++++++++++++--- 1 files changed, 54 insertions(+),
>> 5 deletions(-)
>>
>> diff --git a/drivers/usb/host/ehci-exynos.c
>> b/drivers/usb/host/ehci-exynos.c index 9f0ed06..f9189a5 100644
>> --- a/drivers/usb/host/ehci-exynos.c
>> +++ b/drivers/usb/host/ehci-exynos.c
>> @@ -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");
> [...]
>
> error output should be really puts() or printf() ...

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

>
> 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).

>
> Rest is good

Regards,
Simon
Marek Vasut - Dec. 6, 2012, 6:02 p.m.
Dear Simon Glass,

[...]

> > [...]
> > 
> > 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?

> > 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
Simon Glass - Dec. 6, 2012, 6:07 p.m.
Hi Marek,

On Thu, Dec 6, 2012 at 10:02 AM, Marek Vasut <marex@denx.de> wrote:
> Dear Simon Glass,
>
> [...]
>
>> > [...]
>> >
>> > 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.

>
>> > 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

>
> Best regards,
> Marek Vasut
Marek Vasut - Dec. 6, 2012, 6:13 p.m.
Dear Simon Glass,

> Hi Marek,
> 
> On Thu, Dec 6, 2012 at 10:02 AM, Marek Vasut <marex@denx.de> wrote:
> > Dear Simon Glass,
> > 
> > [...]
> > 
> >> > [...]
> >> > 
> >> > 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.

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

> >> > 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.

Yup

Best regards,
Marek Vasut

Patch

diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c
index 9f0ed06..f9189a5 100644
--- a/drivers/usb/host/ehci-exynos.c
+++ b/drivers/usb/host/ehci-exynos.c
@@ -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;