diff mbox

[U-Boot,v2,2/2] usb: exynos5: arndale: Add network support

Message ID 1388655719-8851-3-git-send-email-inderpal.singh@linaro.org
State Accepted
Delegated to: Marek Vasut
Headers show

Commit Message

Inderpal Singh Jan. 2, 2014, 9:41 a.m. UTC
Arndale board has AX88760, which is USB 2.0 Hub & USB 2.0 Ethernet Combo
controller, connected to HSIC Phy of USB host controller via USB3503 hub.

This patch implements a board specific board_usb_init function in ehci driver
to perform reset sequence for USB3503 hub and enables the relevant config
options for network to work.

Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
---
 board/samsung/arndale/arndale.c |   13 +++++++++++++
 drivers/usb/host/ehci-exynos.c  |   10 ++++++++++
 include/configs/arndale.h       |    4 ++++
 3 files changed, 27 insertions(+)

Comments

Marek Vasut Jan. 3, 2014, 12:56 a.m. UTC | #1
On Thursday, January 02, 2014 at 10:41:59 AM, Inderpal Singh wrote:
> Arndale board has AX88760, which is USB 2.0 Hub & USB 2.0 Ethernet Combo
> controller, connected to HSIC Phy of USB host controller via USB3503 hub.
> 
> This patch implements a board specific board_usb_init function in ehci
> driver to perform reset sequence for USB3503 hub and enables the relevant
> config options for network to work.
> 
> Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
> Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
> ---
>  board/samsung/arndale/arndale.c |   13 +++++++++++++
>  drivers/usb/host/ehci-exynos.c  |   10 ++++++++++
>  include/configs/arndale.h       |    4 ++++
>  3 files changed, 27 insertions(+)
> 
> diff --git a/board/samsung/arndale/arndale.c
> b/board/samsung/arndale/arndale.c index 052fecd..deca348 100644
> --- a/board/samsung/arndale/arndale.c
> +++ b/board/samsung/arndale/arndale.c
> @@ -7,10 +7,23 @@
>  #include <common.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;
> 
> +#ifdef CONFIG_USB_EHCI_EXYNOS
> +void exynos_board_usb_init(int value)
> +{
> +	struct exynos5_gpio_part1 *gpio = (struct exynos5_gpio_part1 *)
> +						samsung_get_base_gpio_part1();
> +
> +	/* Configure gpios for usb 3503 hub's reset and connect */
> +	s5p_gpio_direction_output(&gpio->x3, 5, value);
> +	s5p_gpio_direction_output(&gpio->d1, 7, value);
> +}
> +#endif
> +
>  int board_init(void)
>  {
>  	gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
> diff --git a/drivers/usb/host/ehci-exynos.c
> b/drivers/usb/host/ehci-exynos.c index 88e6466..4be6a60 100644
> --- a/drivers/usb/host/ehci-exynos.c
> +++ b/drivers/usb/host/ehci-exynos.c
> @@ -175,6 +175,12 @@ static void reset_usb_phy(struct exynos_usb_phy *usb)
>  	set_usbhost_phy_ctrl(POWER_USB_HOST_PHY_CTRL_DISABLE);
>  }
> 
> +inline void __exynos_board_usb_init(int value)
> +{
> +}
> +void exynos_board_usb_init(int)
> +	 __attribute__((weak, alias("__exynos_board_usb_init")));
> +

Sorry, this is not happening. Why can you not use the existing board_usb_init() 
and instead have to invent new stuff ?

[..]
Inderpal Singh Jan. 3, 2014, 5:14 a.m. UTC | #2
Hi Marek,

Thanks for review.


On 3 January 2014 06:26, Marek Vasut <marex@denx.de> wrote:

> On Thursday, January 02, 2014 at 10:41:59 AM, Inderpal Singh wrote:
> > Arndale board has AX88760, which is USB 2.0 Hub & USB 2.0 Ethernet Combo
> > controller, connected to HSIC Phy of USB host controller via USB3503 hub.
> >
> > This patch implements a board specific board_usb_init function in ehci
> > driver to perform reset sequence for USB3503 hub and enables the relevant
> > config options for network to work.
> >
> > Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
> > Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
> > ---
> >  board/samsung/arndale/arndale.c |   13 +++++++++++++
> >  drivers/usb/host/ehci-exynos.c  |   10 ++++++++++
> >  include/configs/arndale.h       |    4 ++++
> >  3 files changed, 27 insertions(+)
> >
> > diff --git a/board/samsung/arndale/arndale.c
> > b/board/samsung/arndale/arndale.c index 052fecd..deca348 100644
> > --- a/board/samsung/arndale/arndale.c
> > +++ b/board/samsung/arndale/arndale.c
> > @@ -7,10 +7,23 @@
> >  #include <common.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;
> >
> > +#ifdef CONFIG_USB_EHCI_EXYNOS
> > +void exynos_board_usb_init(int value)
> > +{
> > +     struct exynos5_gpio_part1 *gpio = (struct exynos5_gpio_part1 *)
> > +
> samsung_get_base_gpio_part1();
> > +
> > +     /* Configure gpios for usb 3503 hub's reset and connect */
> > +     s5p_gpio_direction_output(&gpio->x3, 5, value);
> > +     s5p_gpio_direction_output(&gpio->d1, 7, value);
> > +}
> > +#endif
> > +
> >  int board_init(void)
> >  {
> >       gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
> > diff --git a/drivers/usb/host/ehci-exynos.c
> > b/drivers/usb/host/ehci-exynos.c index 88e6466..4be6a60 100644
> > --- a/drivers/usb/host/ehci-exynos.c
> > +++ b/drivers/usb/host/ehci-exynos.c
> > @@ -175,6 +175,12 @@ static void reset_usb_phy(struct exynos_usb_phy
> *usb)
> >       set_usbhost_phy_ctrl(POWER_USB_HOST_PHY_CTRL_DISABLE);
> >  }
> >
> > +inline void __exynos_board_usb_init(int value)
> > +{
> > +}
> > +void exynos_board_usb_init(int)
> > +      __attribute__((weak, alias("__exynos_board_usb_init")));
> > +
>
> Sorry, this is not happening. Why can you not use the existing
> board_usb_init()
> and instead have to invent new stuff ?
>

I did not use board_usb_init because it has 2 parameters which may not be
used as described in usb.h for my use case, which is to only configure
gpios for reset and connect of usb 3503 hub.

Let me know if you still feel that board_usb_init should be used. In that
case I will have to utilize index parameter in my own way.

Regards,
Inder


>
> [..]
>
Marek Vasut Jan. 4, 2014, 7:19 a.m. UTC | #3
On Friday, January 03, 2014 at 06:14:38 AM, Inderpal Singh wrote:
> Hi Marek,
> 
> Thanks for review.
> 
> On 3 January 2014 06:26, Marek Vasut <marex@denx.de> wrote:
> > On Thursday, January 02, 2014 at 10:41:59 AM, Inderpal Singh wrote:
> > > Arndale board has AX88760, which is USB 2.0 Hub & USB 2.0 Ethernet
> > > Combo controller, connected to HSIC Phy of USB host controller via
> > > USB3503 hub.
> > > 
> > > This patch implements a board specific board_usb_init function in ehci
> > > driver to perform reset sequence for USB3503 hub and enables the
> > > relevant config options for network to work.
> > > 
> > > Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
> > > Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
> > > ---
> > > 
> > >  board/samsung/arndale/arndale.c |   13 +++++++++++++
> > >  drivers/usb/host/ehci-exynos.c  |   10 ++++++++++
> > >  include/configs/arndale.h       |    4 ++++
> > >  3 files changed, 27 insertions(+)
> > > 
> > > diff --git a/board/samsung/arndale/arndale.c
> > > b/board/samsung/arndale/arndale.c index 052fecd..deca348 100644
> > > --- a/board/samsung/arndale/arndale.c
> > > +++ b/board/samsung/arndale/arndale.c
> > > @@ -7,10 +7,23 @@
> > > 
> > >  #include <common.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;
> > > 
> > > +#ifdef CONFIG_USB_EHCI_EXYNOS
> > > +void exynos_board_usb_init(int value)
> > > +{
> > > +     struct exynos5_gpio_part1 *gpio = (struct exynos5_gpio_part1 *)
> > > +
> > 
> > samsung_get_base_gpio_part1();
> > 
> > > +
> > > +     /* Configure gpios for usb 3503 hub's reset and connect */
> > > +     s5p_gpio_direction_output(&gpio->x3, 5, value);
> > > +     s5p_gpio_direction_output(&gpio->d1, 7, value);
> > > +}
> > > +#endif
> > > +
> > > 
> > >  int board_init(void)
> > >  {
> > >  
> > >       gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
> > > 
> > > diff --git a/drivers/usb/host/ehci-exynos.c
> > > b/drivers/usb/host/ehci-exynos.c index 88e6466..4be6a60 100644
> > > --- a/drivers/usb/host/ehci-exynos.c
> > > +++ b/drivers/usb/host/ehci-exynos.c
> > > @@ -175,6 +175,12 @@ static void reset_usb_phy(struct exynos_usb_phy
> > 
> > *usb)
> > 
> > >       set_usbhost_phy_ctrl(POWER_USB_HOST_PHY_CTRL_DISABLE);
> > >  
> > >  }
> > > 
> > > +inline void __exynos_board_usb_init(int value)
> > > +{
> > > +}
> > > +void exynos_board_usb_init(int)
> > > +      __attribute__((weak, alias("__exynos_board_usb_init")));
> > > +
> > 
> > Sorry, this is not happening. Why can you not use the existing
> > board_usb_init()
> > and instead have to invent new stuff ?
> 
> I did not use board_usb_init because it has 2 parameters which may not be
> used as described in usb.h for my use case, which is to only configure
> gpios for reset and connect of usb 3503 hub.
> 
> Let me know if you still feel that board_usb_init should be used. In that
> case I will have to utilize index parameter in my own way.

Shall I read that as "I will abuse API" ? You know that this will not happen ;-)

Why can you not reset the USB HUB in regular board_usb_init() simply by toggling 
the switch's reset gpio as done on the rest of the boards ?
Inderpal Singh Jan. 6, 2014, 6:22 a.m. UTC | #4
On 4 January 2014 12:49, Marek Vasut <marex@denx.de> wrote:

> On Friday, January 03, 2014 at 06:14:38 AM, Inderpal Singh wrote:
> > Hi Marek,
> >
> > Thanks for review.
> >
> > On 3 January 2014 06:26, Marek Vasut <marex@denx.de> wrote:
> > > On Thursday, January 02, 2014 at 10:41:59 AM, Inderpal Singh wrote:
> > > > Arndale board has AX88760, which is USB 2.0 Hub & USB 2.0 Ethernet
> > > > Combo controller, connected to HSIC Phy of USB host controller via
> > > > USB3503 hub.
> > > >
> > > > This patch implements a board specific board_usb_init function in
> ehci
> > > > driver to perform reset sequence for USB3503 hub and enables the
> > > > relevant config options for network to work.
> > > >
> > > > Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
> > > > Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
> > > > ---
> > > >
> > > >  board/samsung/arndale/arndale.c |   13 +++++++++++++
> > > >  drivers/usb/host/ehci-exynos.c  |   10 ++++++++++
> > > >  include/configs/arndale.h       |    4 ++++
> > > >  3 files changed, 27 insertions(+)
> > > >
> > > > diff --git a/board/samsung/arndale/arndale.c
> > > > b/board/samsung/arndale/arndale.c index 052fecd..deca348 100644
> > > > --- a/board/samsung/arndale/arndale.c
> > > > +++ b/board/samsung/arndale/arndale.c
> > > > @@ -7,10 +7,23 @@
> > > >
> > > >  #include <common.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;
> > > >
> > > > +#ifdef CONFIG_USB_EHCI_EXYNOS
> > > > +void exynos_board_usb_init(int value)
> > > > +{
> > > > +     struct exynos5_gpio_part1 *gpio = (struct exynos5_gpio_part1 *)
> > > > +
> > >
> > > samsung_get_base_gpio_part1();
> > >
> > > > +
> > > > +     /* Configure gpios for usb 3503 hub's reset and connect */
> > > > +     s5p_gpio_direction_output(&gpio->x3, 5, value);
> > > > +     s5p_gpio_direction_output(&gpio->d1, 7, value);
> > > > +}
> > > > +#endif
> > > > +
> > > >
> > > >  int board_init(void)
> > > >  {
> > > >
> > > >       gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
> > > >
> > > > diff --git a/drivers/usb/host/ehci-exynos.c
> > > > b/drivers/usb/host/ehci-exynos.c index 88e6466..4be6a60 100644
> > > > --- a/drivers/usb/host/ehci-exynos.c
> > > > +++ b/drivers/usb/host/ehci-exynos.c
> > > > @@ -175,6 +175,12 @@ static void reset_usb_phy(struct exynos_usb_phy
> > >
> > > *usb)
> > >
> > > >       set_usbhost_phy_ctrl(POWER_USB_HOST_PHY_CTRL_DISABLE);
> > > >
> > > >  }
> > > >
> > > > +inline void __exynos_board_usb_init(int value)
> > > > +{
> > > > +}
> > > > +void exynos_board_usb_init(int)
> > > > +      __attribute__((weak, alias("__exynos_board_usb_init")));
> > > > +
> > >
> > > Sorry, this is not happening. Why can you not use the existing
> > > board_usb_init()
> > > and instead have to invent new stuff ?
> >
> > I did not use board_usb_init because it has 2 parameters which may not be
> > used as described in usb.h for my use case, which is to only configure
> > gpios for reset and connect of usb 3503 hub.
> >
> > Let me know if you still feel that board_usb_init should be used. In that
> > case I will have to utilize index parameter in my own way.
>
> Shall I read that as "I will abuse API" ? You know that this will not
> happen ;-)
>

Yes, thats an abuse and have not done that yet :-)


>
> Why can you not reset the USB HUB in regular board_usb_init() simply by
> toggling
> the switch's reset gpio as done on the rest of the boards ?
>

Ok, let me try this. If it works I will send the updated patch.

Regards,
Inder
Marek Vasut Jan. 6, 2014, 3:46 p.m. UTC | #5
On Monday, January 06, 2014 at 07:22:11 AM, Inderpal Singh wrote:
> On 4 January 2014 12:49, Marek Vasut <marex@denx.de> wrote:
> > On Friday, January 03, 2014 at 06:14:38 AM, Inderpal Singh wrote:
> > > Hi Marek,
> > > 
> > > Thanks for review.
> > > 
> > > On 3 January 2014 06:26, Marek Vasut <marex@denx.de> wrote:
> > > > On Thursday, January 02, 2014 at 10:41:59 AM, Inderpal Singh wrote:
> > > > > Arndale board has AX88760, which is USB 2.0 Hub & USB 2.0 Ethernet
> > > > > Combo controller, connected to HSIC Phy of USB host controller via
> > > > > USB3503 hub.
> > > > > 
> > > > > This patch implements a board specific board_usb_init function in
> > 
> > ehci
> > 
> > > > > driver to perform reset sequence for USB3503 hub and enables the
> > > > > relevant config options for network to work.
> > > > > 
> > > > > Signed-off-by: Inderpal Singh <inderpal.singh@linaro.org>
> > > > > Signed-off-by: Chander Kashyap <chander.kashyap@linaro.org>
> > > > > ---
> > > > > 
> > > > >  board/samsung/arndale/arndale.c |   13 +++++++++++++
> > > > >  drivers/usb/host/ehci-exynos.c  |   10 ++++++++++
> > > > >  include/configs/arndale.h       |    4 ++++
> > > > >  3 files changed, 27 insertions(+)
> > > > > 
> > > > > diff --git a/board/samsung/arndale/arndale.c
> > > > > b/board/samsung/arndale/arndale.c index 052fecd..deca348 100644
> > > > > --- a/board/samsung/arndale/arndale.c
> > > > > +++ b/board/samsung/arndale/arndale.c
> > > > > @@ -7,10 +7,23 @@
> > > > > 
> > > > >  #include <common.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;
> > > > > 
> > > > > +#ifdef CONFIG_USB_EHCI_EXYNOS
> > > > > +void exynos_board_usb_init(int value)
> > > > > +{
> > > > > +     struct exynos5_gpio_part1 *gpio = (struct exynos5_gpio_part1
> > > > > *) +
> > > > 
> > > > samsung_get_base_gpio_part1();
> > > > 
> > > > > +
> > > > > +     /* Configure gpios for usb 3503 hub's reset and connect */
> > > > > +     s5p_gpio_direction_output(&gpio->x3, 5, value);
> > > > > +     s5p_gpio_direction_output(&gpio->d1, 7, value);
> > > > > +}
> > > > > +#endif
> > > > > +
> > > > > 
> > > > >  int board_init(void)
> > > > >  {
> > > > >  
> > > > >       gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
> > > > > 
> > > > > diff --git a/drivers/usb/host/ehci-exynos.c
> > > > > b/drivers/usb/host/ehci-exynos.c index 88e6466..4be6a60 100644
> > > > > --- a/drivers/usb/host/ehci-exynos.c
> > > > > +++ b/drivers/usb/host/ehci-exynos.c
> > > > > @@ -175,6 +175,12 @@ static void reset_usb_phy(struct
> > > > > exynos_usb_phy
> > > > 
> > > > *usb)
> > > > 
> > > > >       set_usbhost_phy_ctrl(POWER_USB_HOST_PHY_CTRL_DISABLE);
> > > > >  
> > > > >  }
> > > > > 
> > > > > +inline void __exynos_board_usb_init(int value)
> > > > > +{
> > > > > +}
> > > > > +void exynos_board_usb_init(int)
> > > > > +      __attribute__((weak, alias("__exynos_board_usb_init")));
> > > > > +
> > > > 
> > > > Sorry, this is not happening. Why can you not use the existing
> > > > board_usb_init()
> > > > and instead have to invent new stuff ?
> > > 
> > > I did not use board_usb_init because it has 2 parameters which may not
> > > be used as described in usb.h for my use case, which is to only
> > > configure gpios for reset and connect of usb 3503 hub.
> > > 
> > > Let me know if you still feel that board_usb_init should be used. In
> > > that case I will have to utilize index parameter in my own way.
> > 
> > Shall I read that as "I will abuse API" ? You know that this will not
> > happen ;-)
> 
> Yes, thats an abuse and have not done that yet :-)
> 
> > Why can you not reset the USB HUB in regular board_usb_init() simply by
> > toggling
> > the switch's reset gpio as done on the rest of the boards ?
> 
> Ok, let me try this. If it works I will send the updated patch.

Thank you!
diff mbox

Patch

diff --git a/board/samsung/arndale/arndale.c b/board/samsung/arndale/arndale.c
index 052fecd..deca348 100644
--- a/board/samsung/arndale/arndale.c
+++ b/board/samsung/arndale/arndale.c
@@ -7,10 +7,23 @@ 
 #include <common.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;
 
+#ifdef CONFIG_USB_EHCI_EXYNOS
+void exynos_board_usb_init(int value)
+{
+	struct exynos5_gpio_part1 *gpio = (struct exynos5_gpio_part1 *)
+						samsung_get_base_gpio_part1();
+
+	/* Configure gpios for usb 3503 hub's reset and connect */
+	s5p_gpio_direction_output(&gpio->x3, 5, value);
+	s5p_gpio_direction_output(&gpio->d1, 7, value);
+}
+#endif
+
 int board_init(void)
 {
 	gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL);
diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c
index 88e6466..4be6a60 100644
--- a/drivers/usb/host/ehci-exynos.c
+++ b/drivers/usb/host/ehci-exynos.c
@@ -175,6 +175,12 @@  static void reset_usb_phy(struct exynos_usb_phy *usb)
 	set_usbhost_phy_ctrl(POWER_USB_HOST_PHY_CTRL_DISABLE);
 }
 
+inline void __exynos_board_usb_init(int value)
+{
+}
+void exynos_board_usb_init(int)
+	 __attribute__((weak, alias("__exynos_board_usb_init")));
+
 /*
  * EHCI-initialization
  * Create the appropriate control structures to manage
@@ -201,8 +207,12 @@  int ehci_hcd_init(int index, enum usb_init_type init,
 		gpio_direction_output(ctx->vbus_gpio.gpio, 1);
 #endif
 
+	exynos_board_usb_init(0);
+
 	setup_usb_phy(ctx->usb);
 
+	exynos_board_usb_init(1);
+
 	*hccr = ctx->hcd;
 	*hcor = (struct ehci_hcor *)((uint32_t) *hccr
 				+ HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
diff --git a/include/configs/arndale.h b/include/configs/arndale.h
index b7fb29e..eda0e4f 100644
--- a/include/configs/arndale.h
+++ b/include/configs/arndale.h
@@ -116,6 +116,10 @@ 
 #define CONFIG_USB_EHCI_EXYNOS
 #define CONFIG_USB_STORAGE
 
+#define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS	3
+#define CONFIG_USB_HOST_ETHER
+#define CONFIG_USB_ETHER_ASIX
+
 /* MMC SPL */
 #define CONFIG_EXYNOS_SPL
 #define CONFIG_SPL