Re: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support

2019-05-06 Thread Lukasz Majewski
Hi Neil,

> -BEGIN PGP SIGNED MESSAGE-
> Hash: SHA512
> 
> Hi Lukasw,
> 
> Le 19/04/2019 08:17, Lukasz Majewski a écrit :
> > Hi Neil,
> >   
> >> Adds support for Amlogic G12A USB Device mode.
> >>
> >> The DWC2 Controller behind the Glue can be connected to an OTG
> >> capable PHY. The Glue setups the PHY mode.
> >>
> >> This patch implements Device mode support by adding a
> >> board_usb_init/cleanup setting up the DWC2 controller and switch
> >> the OTG capable port to Device before starting the DWC2 controller
> >> in Device mode.
> >>
> >> Signed-off-by: Neil Armstrong   
> > 
> > I wanted to apply this series, but it turned out that it depends on:
> > [U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
> > board
> > 
> > Let's wait till the above one is pulled to master.  
> 
> Do you want me to resend the serie rebased on master ?

Yes, please. That would speed up the process considerably.

Thanks in advance for help.

> 
> Neil
> 
> >   
> >> ---
> >>  arch/arm/include/asm/arch-meson/usb.h |  12 +++
> >>  arch/arm/mach-meson/board-g12a.c  | 126
> >> ++ 2 files changed, 138 insertions(+)
> >>  create mode 100644 arch/arm/include/asm/arch-meson/usb.h
> >>
> >> diff --git a/arch/arm/include/asm/arch-meson/usb.h
> >> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
> >> index 00..b794b5ce77
> >> --- /dev/null
> >> +++ b/arch/arm/include/asm/arch-meson/usb.h
> >> @@ -0,0 +1,12 @@
> >> +/* SPDX-License-Identifier: GPL-2.0+ */
> >> +/*
> >> + * Copyright (C) 2019 BayLibre, SAS
> >> + * Author: Neil Armstrong 
> >> + */
> >> +
> >> +#ifndef __MESON_USB_H__
> >> +#define __MESON_USB_H__
> >> +
> >> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum
> >> usb_dr_mode mode); +
> >> +#endif /* __MESON_USB_H__ */
> >> diff --git a/arch/arm/mach-meson/board-g12a.c
> >> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd
> >> 100644 --- a/arch/arm/mach-meson/board-g12a.c
> >> +++ b/arch/arm/mach-meson/board-g12a.c
> >> @@ -12,7 +12,12 @@
> >>  #include 
> >>  #include 
> >>  #include 
> >> +#include 
> >> +#include 
> >> +#include 
> >> +#include 
> >>  #include 
> >> +#include 
> >>  
> >>  DECLARE_GLOBAL_DATA_PTR;
> >>  
> >> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
> >> unsigned int flags) /* Enable power gate */
> >>clrbits_le32(G12A_MEM_PD_REG_0,
> >> G12A_MEM_PD_REG_0_ETH_MASK); }
> >> +
> >> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
> >> +  CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
> >> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
> >> +
> >> +int board_usb_init(int index, enum usb_init_type init)
> >> +{
> >> +  struct fdtdec_phandle_args args;
> >> +  const void *blob = gd->fdt_blob;
> >> +  int node, dwc2_node;
> >> +  struct udevice *dev, *clk_dev;
> >> +  struct clk clk;
> >> +  int ret;
> >> +
> >> +  /* find the usb glue node */
> >> +  node = fdt_node_offset_by_compatible(blob, -1,
> >> +
> >> "amlogic,meson-g12a-usb-ctrl");
> >> +  if (node < 0) {
> >> +  debug("Not found usb-control node\n");
> >> +  return -ENODEV;
> >> +  }
> >> +
> >> +  if (!fdtdec_get_is_enabled(blob, node)) {
> >> +  debug("usb is disabled in the device tree\n");
> >> +  return -ENODEV;
> >> +  }
> >> +
> >> +  ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
> >> node, );
> >> +  if (ret) {
> >> +  debug("Not found usb-control device\n");
> >> +  return ret;
> >> +  }
> >> +
> >> +  /* find the dwc2 node */
> >> +  dwc2_node = fdt_node_offset_by_compatible(blob, node,
> >> +
> >> "amlogic,meson-g12a-usb");
> >> +  if (dwc2_node < 0) {
> >> +  debug("Not found dwc2 node\n");
> >> +  return -ENODEV;
> >> +  }
> >> +
> >> +  if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
> >> +  debug("dwc2 is disabled in the device tree\n");
> >> +  return -ENODEV;
> >> +  }
> >> +
> >> +  meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
> >> dwc2_node, "reg");
> >> +  if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
> >> +  debug("usbotg: can't get base address\n");
> >> +  return -ENODATA;
> >> +  }
> >> +
> >> +  /* Enable clock */
> >> +  ret = fdtdec_parse_phandle_with_args(blob, dwc2_node,
> >> "clocks",
> >> +   "#clock-cells", 0, 0,
> >> );
> >> +  if (ret) {
> >> +  debug("usbotg has no clocks defined in the device
> >> tree\n");
> >> +  return ret;
> >> +  }
> >> +
> >> +  ret = uclass_get_device_by_of_offset(UCLASS_CLK,
> >> args.node, _dev);
> >> +  if (ret)
> >> +  return ret;
> >> +
> >> +  if (args.args_count != 1) {
> >> +  debug("Can't find clock ID in the device tree\n");
> >> +  return -ENODATA;
> >> +  }
> >> +
> >> +  clk.dev = clk_dev;
> >> +  clk.id = args.args[0];
> >> +
> >> +  ret = clk_enable();
> >> +  if (ret) {
> >> +  debug("Failed to enable usbotg clock\n");
> >> +  return 

Re: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support

2019-05-06 Thread Neil Armstrong
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA512

Hi Lukasw,

Le 19/04/2019 08:17, Lukasz Majewski a écrit :
> Hi Neil,
> 
>> Adds support for Amlogic G12A USB Device mode.
>>
>> The DWC2 Controller behind the Glue can be connected to an OTG
>> capable PHY. The Glue setups the PHY mode.
>>
>> This patch implements Device mode support by adding a
>> board_usb_init/cleanup setting up the DWC2 controller and switch the
>> OTG capable port to Device before starting the DWC2 controller in
>> Device mode.
>>
>> Signed-off-by: Neil Armstrong 
> 
> I wanted to apply this series, but it turned out that it depends on:
> [U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
> board
> 
> Let's wait till the above one is pulled to master.

Do you want me to resend the serie rebased on master ?

Neil

> 
>> ---
>>  arch/arm/include/asm/arch-meson/usb.h |  12 +++
>>  arch/arm/mach-meson/board-g12a.c  | 126
>> ++ 2 files changed, 138 insertions(+)
>>  create mode 100644 arch/arm/include/asm/arch-meson/usb.h
>>
>> diff --git a/arch/arm/include/asm/arch-meson/usb.h
>> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
>> index 00..b794b5ce77
>> --- /dev/null
>> +++ b/arch/arm/include/asm/arch-meson/usb.h
>> @@ -0,0 +1,12 @@
>> +/* SPDX-License-Identifier: GPL-2.0+ */
>> +/*
>> + * Copyright (C) 2019 BayLibre, SAS
>> + * Author: Neil Armstrong 
>> + */
>> +
>> +#ifndef __MESON_USB_H__
>> +#define __MESON_USB_H__
>> +
>> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode
>> mode); +
>> +#endif /* __MESON_USB_H__ */
>> diff --git a/arch/arm/mach-meson/board-g12a.c
>> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd 100644
>> --- a/arch/arm/mach-meson/board-g12a.c
>> +++ b/arch/arm/mach-meson/board-g12a.c
>> @@ -12,7 +12,12 @@
>>  #include 
>>  #include 
>>  #include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>>  #include 
>> +#include 
>>  
>>  DECLARE_GLOBAL_DATA_PTR;
>>  
>> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
>> unsigned int flags) /* Enable power gate */
>>  clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
>>  }
>> +
>> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
>> +CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
>> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
>> +
>> +int board_usb_init(int index, enum usb_init_type init)
>> +{
>> +struct fdtdec_phandle_args args;
>> +const void *blob = gd->fdt_blob;
>> +int node, dwc2_node;
>> +struct udevice *dev, *clk_dev;
>> +struct clk clk;
>> +int ret;
>> +
>> +/* find the usb glue node */
>> +node = fdt_node_offset_by_compatible(blob, -1,
>> +
>> "amlogic,meson-g12a-usb-ctrl");
>> +if (node < 0) {
>> +debug("Not found usb-control node\n");
>> +return -ENODEV;
>> +}
>> +
>> +if (!fdtdec_get_is_enabled(blob, node)) {
>> +debug("usb is disabled in the device tree\n");
>> +return -ENODEV;
>> +}
>> +
>> +ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
>> node, );
>> +if (ret) {
>> +debug("Not found usb-control device\n");
>> +return ret;
>> +}
>> +
>> +/* find the dwc2 node */
>> +dwc2_node = fdt_node_offset_by_compatible(blob, node,
>> +
>> "amlogic,meson-g12a-usb");
>> +if (dwc2_node < 0) {
>> +debug("Not found dwc2 node\n");
>> +return -ENODEV;
>> +}
>> +
>> +if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
>> +debug("dwc2 is disabled in the device tree\n");
>> +return -ENODEV;
>> +}
>> +
>> +meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
>> dwc2_node, "reg");
>> +if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
>> +debug("usbotg: can't get base address\n");
>> +return -ENODATA;
>> +}
>> +
>> +/* Enable clock */
>> +ret = fdtdec_parse_phandle_with_args(blob, dwc2_node,
>> "clocks",
>> + "#clock-cells", 0, 0,
>> );
>> +if (ret) {
>> +debug("usbotg has no clocks defined in the device
>> tree\n");
>> +return ret;
>> +}
>> +
>> +ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node,
>> _dev);
>> +if (ret)
>> +return ret;
>> +
>> +if (args.args_count != 1) {
>> +debug("Can't find clock ID in the device tree\n");
>> +return -ENODATA;
>> +}
>> +
>> +clk.dev = clk_dev;
>> +clk.id = args.args[0];
>> +
>> +ret = clk_enable();
>> +if (ret) {
>> +debug("Failed to enable usbotg clock\n");
>> +return ret;
>> +}
>> +
>> +meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob,
>> dwc2_node,
>> +
>> "g-rx-fifo-size", 0);
>> +meson_g12a_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob,
>> dwc2_node,
>> +"g-np-tx-fifo-size",
>> 0);
>> +

Re: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support

2019-04-26 Thread Neil Armstrong
Hi,

On 23/04/2019 11:31, Neil Armstrong wrote:
> Hi Lukasz,
> 
> On 19/04/2019 08:17, Lukasz Majewski wrote:
>> Hi Neil,
>>
>>> Adds support for Amlogic G12A USB Device mode.
>>>
>>> The DWC2 Controller behind the Glue can be connected to an OTG
>>> capable PHY. The Glue setups the PHY mode.
>>>
>>> This patch implements Device mode support by adding a
>>> board_usb_init/cleanup setting up the DWC2 controller and switch the
>>> OTG capable port to Device before starting the DWC2 controller in
>>> Device mode.
>>>
>>> Signed-off-by: Neil Armstrong 
>>
>> I wanted to apply this series, but it turned out that it depends on:
>> [U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
>> board
>>
>> Let's wait till the above one is pulled to master.
> 
> I just sent a PR to Tom, will ping you when pulled to master.

Tom pulled it to master,

Thanks,
Neil

> 
> Thanks,
> Neil
> 
>>
>>> ---
>>>  arch/arm/include/asm/arch-meson/usb.h |  12 +++
>>>  arch/arm/mach-meson/board-g12a.c  | 126
>>> ++ 2 files changed, 138 insertions(+)
>>>  create mode 100644 arch/arm/include/asm/arch-meson/usb.h
>>>
>>> diff --git a/arch/arm/include/asm/arch-meson/usb.h
>>> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
>>> index 00..b794b5ce77
>>> --- /dev/null
>>> +++ b/arch/arm/include/asm/arch-meson/usb.h
>>> @@ -0,0 +1,12 @@
>>> +/* SPDX-License-Identifier: GPL-2.0+ */
>>> +/*
>>> + * Copyright (C) 2019 BayLibre, SAS
>>> + * Author: Neil Armstrong 
>>> + */
>>> +
>>> +#ifndef __MESON_USB_H__
>>> +#define __MESON_USB_H__
>>> +
>>> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode
>>> mode); +
>>> +#endif /* __MESON_USB_H__ */
>>> diff --git a/arch/arm/mach-meson/board-g12a.c
>>> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd 100644
>>> --- a/arch/arm/mach-meson/board-g12a.c
>>> +++ b/arch/arm/mach-meson/board-g12a.c
>>> @@ -12,7 +12,12 @@
>>>  #include 
>>>  #include 
>>>  #include 
>>> +#include 
>>> +#include 
>>> +#include 
>>> +#include 
>>>  #include 
>>> +#include 
>>>  
>>>  DECLARE_GLOBAL_DATA_PTR;
>>>  
>>> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
>>> unsigned int flags) /* Enable power gate */
>>> clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
>>>  }
>>> +
>>> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
>>> +   CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
>>> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
>>> +
>>> +int board_usb_init(int index, enum usb_init_type init)
>>> +{
>>> +   struct fdtdec_phandle_args args;
>>> +   const void *blob = gd->fdt_blob;
>>> +   int node, dwc2_node;
>>> +   struct udevice *dev, *clk_dev;
>>> +   struct clk clk;
>>> +   int ret;
>>> +
>>> +   /* find the usb glue node */
>>> +   node = fdt_node_offset_by_compatible(blob, -1,
>>> +
>>> "amlogic,meson-g12a-usb-ctrl");
>>> +   if (node < 0) {
>>> +   debug("Not found usb-control node\n");
>>> +   return -ENODEV;
>>> +   }
>>> +
>>> +   if (!fdtdec_get_is_enabled(blob, node)) {
>>> +   debug("usb is disabled in the device tree\n");
>>> +   return -ENODEV;
>>> +   }
>>> +
>>> +   ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
>>> node, );
>>> +   if (ret) {
>>> +   debug("Not found usb-control device\n");
>>> +   return ret;
>>> +   }
>>> +
>>> +   /* find the dwc2 node */
>>> +   dwc2_node = fdt_node_offset_by_compatible(blob, node,
>>> +
>>> "amlogic,meson-g12a-usb");
>>> +   if (dwc2_node < 0) {
>>> +   debug("Not found dwc2 node\n");
>>> +   return -ENODEV;
>>> +   }
>>> +
>>> +   if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
>>> +   debug("dwc2 is disabled in the device tree\n");
>>> +   return -ENODEV;
>>> +   }
>>> +
>>> +   meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
>>> dwc2_node, "reg");
>>> +   if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
>>> +   debug("usbotg: can't get base address\n");
>>> +   return -ENODATA;
>>> +   }
>>> +
>>> +   /* Enable clock */
>>> +   ret = fdtdec_parse_phandle_with_args(blob, dwc2_node,
>>> "clocks",
>>> +"#clock-cells", 0, 0,
>>> );
>>> +   if (ret) {
>>> +   debug("usbotg has no clocks defined in the device
>>> tree\n");
>>> +   return ret;
>>> +   }
>>> +
>>> +   ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node,
>>> _dev);
>>> +   if (ret)
>>> +   return ret;
>>> +
>>> +   if (args.args_count != 1) {
>>> +   debug("Can't find clock ID in the device tree\n");
>>> +   return -ENODATA;
>>> +   }
>>> +
>>> +   clk.dev = clk_dev;
>>> +   clk.id = args.args[0];
>>> +
>>> +   ret = clk_enable();
>>> +   if (ret) {
>>> +   debug("Failed to enable usbotg clock\n");
>>> +   return ret;
>>> +   }
>>> +
>>> +   meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob,
>>> dwc2_node,
>>> +
>>> "g-rx-fifo-size", 0);
>>> +   

Re: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support

2019-04-23 Thread Neil Armstrong
Hi Lukasz,

On 19/04/2019 08:17, Lukasz Majewski wrote:
> Hi Neil,
> 
>> Adds support for Amlogic G12A USB Device mode.
>>
>> The DWC2 Controller behind the Glue can be connected to an OTG
>> capable PHY. The Glue setups the PHY mode.
>>
>> This patch implements Device mode support by adding a
>> board_usb_init/cleanup setting up the DWC2 controller and switch the
>> OTG capable port to Device before starting the DWC2 controller in
>> Device mode.
>>
>> Signed-off-by: Neil Armstrong 
> 
> I wanted to apply this series, but it turned out that it depends on:
> [U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
> board
> 
> Let's wait till the above one is pulled to master.

I just sent a PR to Tom, will ping you when pulled to master.

Thanks,
Neil

> 
>> ---
>>  arch/arm/include/asm/arch-meson/usb.h |  12 +++
>>  arch/arm/mach-meson/board-g12a.c  | 126
>> ++ 2 files changed, 138 insertions(+)
>>  create mode 100644 arch/arm/include/asm/arch-meson/usb.h
>>
>> diff --git a/arch/arm/include/asm/arch-meson/usb.h
>> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
>> index 00..b794b5ce77
>> --- /dev/null
>> +++ b/arch/arm/include/asm/arch-meson/usb.h
>> @@ -0,0 +1,12 @@
>> +/* SPDX-License-Identifier: GPL-2.0+ */
>> +/*
>> + * Copyright (C) 2019 BayLibre, SAS
>> + * Author: Neil Armstrong 
>> + */
>> +
>> +#ifndef __MESON_USB_H__
>> +#define __MESON_USB_H__
>> +
>> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode
>> mode); +
>> +#endif /* __MESON_USB_H__ */
>> diff --git a/arch/arm/mach-meson/board-g12a.c
>> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd 100644
>> --- a/arch/arm/mach-meson/board-g12a.c
>> +++ b/arch/arm/mach-meson/board-g12a.c
>> @@ -12,7 +12,12 @@
>>  #include 
>>  #include 
>>  #include 
>> +#include 
>> +#include 
>> +#include 
>> +#include 
>>  #include 
>> +#include 
>>  
>>  DECLARE_GLOBAL_DATA_PTR;
>>  
>> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
>> unsigned int flags) /* Enable power gate */
>>  clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
>>  }
>> +
>> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
>> +CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
>> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
>> +
>> +int board_usb_init(int index, enum usb_init_type init)
>> +{
>> +struct fdtdec_phandle_args args;
>> +const void *blob = gd->fdt_blob;
>> +int node, dwc2_node;
>> +struct udevice *dev, *clk_dev;
>> +struct clk clk;
>> +int ret;
>> +
>> +/* find the usb glue node */
>> +node = fdt_node_offset_by_compatible(blob, -1,
>> +
>> "amlogic,meson-g12a-usb-ctrl");
>> +if (node < 0) {
>> +debug("Not found usb-control node\n");
>> +return -ENODEV;
>> +}
>> +
>> +if (!fdtdec_get_is_enabled(blob, node)) {
>> +debug("usb is disabled in the device tree\n");
>> +return -ENODEV;
>> +}
>> +
>> +ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
>> node, );
>> +if (ret) {
>> +debug("Not found usb-control device\n");
>> +return ret;
>> +}
>> +
>> +/* find the dwc2 node */
>> +dwc2_node = fdt_node_offset_by_compatible(blob, node,
>> +
>> "amlogic,meson-g12a-usb");
>> +if (dwc2_node < 0) {
>> +debug("Not found dwc2 node\n");
>> +return -ENODEV;
>> +}
>> +
>> +if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
>> +debug("dwc2 is disabled in the device tree\n");
>> +return -ENODEV;
>> +}
>> +
>> +meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
>> dwc2_node, "reg");
>> +if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
>> +debug("usbotg: can't get base address\n");
>> +return -ENODATA;
>> +}
>> +
>> +/* Enable clock */
>> +ret = fdtdec_parse_phandle_with_args(blob, dwc2_node,
>> "clocks",
>> + "#clock-cells", 0, 0,
>> );
>> +if (ret) {
>> +debug("usbotg has no clocks defined in the device
>> tree\n");
>> +return ret;
>> +}
>> +
>> +ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node,
>> _dev);
>> +if (ret)
>> +return ret;
>> +
>> +if (args.args_count != 1) {
>> +debug("Can't find clock ID in the device tree\n");
>> +return -ENODATA;
>> +}
>> +
>> +clk.dev = clk_dev;
>> +clk.id = args.args[0];
>> +
>> +ret = clk_enable();
>> +if (ret) {
>> +debug("Failed to enable usbotg clock\n");
>> +return ret;
>> +}
>> +
>> +meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob,
>> dwc2_node,
>> +
>> "g-rx-fifo-size", 0);
>> +meson_g12a_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob,
>> dwc2_node,
>> +"g-np-tx-fifo-size",
>> 0);
>> +meson_g12a_dwc2_data.tx_fifo_sz = 

Re: [U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support

2019-04-19 Thread Lukasz Majewski
Hi Neil,

> Adds support for Amlogic G12A USB Device mode.
> 
> The DWC2 Controller behind the Glue can be connected to an OTG
> capable PHY. The Glue setups the PHY mode.
> 
> This patch implements Device mode support by adding a
> board_usb_init/cleanup setting up the DWC2 controller and switch the
> OTG capable port to Device before starting the DWC2 controller in
> Device mode.
> 
> Signed-off-by: Neil Armstrong 

I wanted to apply this series, but it turned out that it depends on:
[U-Boot] [PATCH v2 0/6] ARM: meson: Add support for G12A based U200
board

Let's wait till the above one is pulled to master.

> ---
>  arch/arm/include/asm/arch-meson/usb.h |  12 +++
>  arch/arm/mach-meson/board-g12a.c  | 126
> ++ 2 files changed, 138 insertions(+)
>  create mode 100644 arch/arm/include/asm/arch-meson/usb.h
> 
> diff --git a/arch/arm/include/asm/arch-meson/usb.h
> b/arch/arm/include/asm/arch-meson/usb.h new file mode 100644
> index 00..b794b5ce77
> --- /dev/null
> +++ b/arch/arm/include/asm/arch-meson/usb.h
> @@ -0,0 +1,12 @@
> +/* SPDX-License-Identifier: GPL-2.0+ */
> +/*
> + * Copyright (C) 2019 BayLibre, SAS
> + * Author: Neil Armstrong 
> + */
> +
> +#ifndef __MESON_USB_H__
> +#define __MESON_USB_H__
> +
> +int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode
> mode); +
> +#endif /* __MESON_USB_H__ */
> diff --git a/arch/arm/mach-meson/board-g12a.c
> b/arch/arm/mach-meson/board-g12a.c index fc3764b960..1652970fbd 100644
> --- a/arch/arm/mach-meson/board-g12a.c
> +++ b/arch/arm/mach-meson/board-g12a.c
> @@ -12,7 +12,12 @@
>  #include 
>  #include 
>  #include 
> +#include 
> +#include 
> +#include 
> +#include 
>  #include 
> +#include 
>  
>  DECLARE_GLOBAL_DATA_PTR;
>  
> @@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode,
> unsigned int flags) /* Enable power gate */
>   clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
>  }
> +
> +#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
> + CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
> +static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
> +
> +int board_usb_init(int index, enum usb_init_type init)
> +{
> + struct fdtdec_phandle_args args;
> + const void *blob = gd->fdt_blob;
> + int node, dwc2_node;
> + struct udevice *dev, *clk_dev;
> + struct clk clk;
> + int ret;
> +
> + /* find the usb glue node */
> + node = fdt_node_offset_by_compatible(blob, -1,
> +
> "amlogic,meson-g12a-usb-ctrl");
> + if (node < 0) {
> + debug("Not found usb-control node\n");
> + return -ENODEV;
> + }
> +
> + if (!fdtdec_get_is_enabled(blob, node)) {
> + debug("usb is disabled in the device tree\n");
> + return -ENODEV;
> + }
> +
> + ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS,
> node, );
> + if (ret) {
> + debug("Not found usb-control device\n");
> + return ret;
> + }
> +
> + /* find the dwc2 node */
> + dwc2_node = fdt_node_offset_by_compatible(blob, node,
> +
> "amlogic,meson-g12a-usb");
> + if (dwc2_node < 0) {
> + debug("Not found dwc2 node\n");
> + return -ENODEV;
> + }
> +
> + if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
> + debug("dwc2 is disabled in the device tree\n");
> + return -ENODEV;
> + }
> +
> + meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob,
> dwc2_node, "reg");
> + if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
> + debug("usbotg: can't get base address\n");
> + return -ENODATA;
> + }
> +
> + /* Enable clock */
> + ret = fdtdec_parse_phandle_with_args(blob, dwc2_node,
> "clocks",
> +  "#clock-cells", 0, 0,
> );
> + if (ret) {
> + debug("usbotg has no clocks defined in the device
> tree\n");
> + return ret;
> + }
> +
> + ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node,
> _dev);
> + if (ret)
> + return ret;
> +
> + if (args.args_count != 1) {
> + debug("Can't find clock ID in the device tree\n");
> + return -ENODATA;
> + }
> +
> + clk.dev = clk_dev;
> + clk.id = args.args[0];
> +
> + ret = clk_enable();
> + if (ret) {
> + debug("Failed to enable usbotg clock\n");
> + return ret;
> + }
> +
> + meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> +
> "g-rx-fifo-size", 0);
> + meson_g12a_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> + "g-np-tx-fifo-size",
> 0);
> + meson_g12a_dwc2_data.tx_fifo_sz = fdtdec_get_int(blob,
> dwc2_node,
> +
> "g-tx-fifo-size", 0); +
> + /* Switch to peripheral mode */
> + ret = dwc3_meson_g12a_force_mode(dev,
> USB_DR_MODE_PERIPHERAL);
> + if (ret)
> + return ret;
> +
> + return 

[U-Boot] [PATCH v2 3/3] mach-meson: g12a: add DWC2 peripheral mode support

2019-04-01 Thread Neil Armstrong
Adds support for Amlogic G12A USB Device mode.

The DWC2 Controller behind the Glue can be connected to an OTG
capable PHY. The Glue setups the PHY mode.

This patch implements Device mode support by adding a board_usb_init/cleanup
setting up the DWC2 controller and switch the OTG capable port to Device
before starting the DWC2 controller in Device mode.

Signed-off-by: Neil Armstrong 
---
 arch/arm/include/asm/arch-meson/usb.h |  12 +++
 arch/arm/mach-meson/board-g12a.c  | 126 ++
 2 files changed, 138 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-meson/usb.h

diff --git a/arch/arm/include/asm/arch-meson/usb.h 
b/arch/arm/include/asm/arch-meson/usb.h
new file mode 100644
index 00..b794b5ce77
--- /dev/null
+++ b/arch/arm/include/asm/arch-meson/usb.h
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+/*
+ * Copyright (C) 2019 BayLibre, SAS
+ * Author: Neil Armstrong 
+ */
+
+#ifndef __MESON_USB_H__
+#define __MESON_USB_H__
+
+int dwc3_meson_g12a_force_mode(struct udevice *dev, enum usb_dr_mode mode);
+
+#endif /* __MESON_USB_H__ */
diff --git a/arch/arm/mach-meson/board-g12a.c b/arch/arm/mach-meson/board-g12a.c
index fc3764b960..1652970fbd 100644
--- a/arch/arm/mach-meson/board-g12a.c
+++ b/arch/arm/mach-meson/board-g12a.c
@@ -12,7 +12,12 @@
 #include 
 #include 
 #include 
+#include 
+#include 
+#include 
+#include 
 #include 
+#include 
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -148,3 +153,124 @@ void meson_eth_init(phy_interface_t mode, unsigned int 
flags)
/* Enable power gate */
clrbits_le32(G12A_MEM_PD_REG_0, G12A_MEM_PD_REG_0_ETH_MASK);
 }
+
+#if CONFIG_IS_ENABLED(USB_DWC3_MESON_G12A) && \
+   CONFIG_IS_ENABLED(USB_GADGET_DWC2_OTG)
+static struct dwc2_plat_otg_data meson_g12a_dwc2_data;
+
+int board_usb_init(int index, enum usb_init_type init)
+{
+   struct fdtdec_phandle_args args;
+   const void *blob = gd->fdt_blob;
+   int node, dwc2_node;
+   struct udevice *dev, *clk_dev;
+   struct clk clk;
+   int ret;
+
+   /* find the usb glue node */
+   node = fdt_node_offset_by_compatible(blob, -1,
+"amlogic,meson-g12a-usb-ctrl");
+   if (node < 0) {
+   debug("Not found usb-control node\n");
+   return -ENODEV;
+   }
+
+   if (!fdtdec_get_is_enabled(blob, node)) {
+   debug("usb is disabled in the device tree\n");
+   return -ENODEV;
+   }
+
+   ret = uclass_get_device_by_of_offset(UCLASS_SIMPLE_BUS, node, );
+   if (ret) {
+   debug("Not found usb-control device\n");
+   return ret;
+   }
+
+   /* find the dwc2 node */
+   dwc2_node = fdt_node_offset_by_compatible(blob, node,
+ "amlogic,meson-g12a-usb");
+   if (dwc2_node < 0) {
+   debug("Not found dwc2 node\n");
+   return -ENODEV;
+   }
+
+   if (!fdtdec_get_is_enabled(blob, dwc2_node)) {
+   debug("dwc2 is disabled in the device tree\n");
+   return -ENODEV;
+   }
+
+   meson_g12a_dwc2_data.regs_otg = fdtdec_get_addr(blob, dwc2_node, "reg");
+   if (meson_g12a_dwc2_data.regs_otg == FDT_ADDR_T_NONE) {
+   debug("usbotg: can't get base address\n");
+   return -ENODATA;
+   }
+
+   /* Enable clock */
+   ret = fdtdec_parse_phandle_with_args(blob, dwc2_node, "clocks",
+"#clock-cells", 0, 0, );
+   if (ret) {
+   debug("usbotg has no clocks defined in the device tree\n");
+   return ret;
+   }
+
+   ret = uclass_get_device_by_of_offset(UCLASS_CLK, args.node, _dev);
+   if (ret)
+   return ret;
+
+   if (args.args_count != 1) {
+   debug("Can't find clock ID in the device tree\n");
+   return -ENODATA;
+   }
+
+   clk.dev = clk_dev;
+   clk.id = args.args[0];
+
+   ret = clk_enable();
+   if (ret) {
+   debug("Failed to enable usbotg clock\n");
+   return ret;
+   }
+
+   meson_g12a_dwc2_data.rx_fifo_sz = fdtdec_get_int(blob, dwc2_node,
+"g-rx-fifo-size", 0);
+   meson_g12a_dwc2_data.np_tx_fifo_sz = fdtdec_get_int(blob, dwc2_node,
+   "g-np-tx-fifo-size", 0);
+   meson_g12a_dwc2_data.tx_fifo_sz = fdtdec_get_int(blob, dwc2_node,
+"g-tx-fifo-size", 0);
+
+   /* Switch to peripheral mode */
+   ret = dwc3_meson_g12a_force_mode(dev, USB_DR_MODE_PERIPHERAL);
+   if (ret)
+   return ret;
+
+   return dwc2_udc_probe(_g12a_dwc2_data);
+}
+
+int board_usb_cleanup(int index, enum usb_init_type init)
+{
+   const void *blob = gd->fdt_blob;
+   struct udevice *dev;
+   int node;
+   int