Vipin KUMAR wrote:
> USBD is a Synopsys IP. The earlier driver implements itself as specific to 
> spear
> SoCs. This patch implements this driver as a reusable driver for other 
> platforms
> as well.

Similar comments about 'IP'
Similar comments about Synopsys vs DW
Expand 'USBD' to be 'the usb device on the spear platforms'
'implements itself' -> 'is implementend'
'patch implement' -> 'patch moves .. to a common driver'

> 
> Signed-off-by: Vipin Kumar <vipin.ku...@st.com>
> ---
>  drivers/serial/usbtty.h                            |    4 +-
>  drivers/usb/gadget/Makefile                        |    2 +-
>  drivers/usb/gadget/{spr_udc.c => designware_udc.c} |  116 
> +++++++++++---------
>  include/configs/spear-common.h                     |    2 +-
>  include/usb/{spr_udc.h => designware_udc.h}        |    8 +-
>  5 files changed, 74 insertions(+), 58 deletions(-)
>  rename drivers/usb/gadget/{spr_udc.c => designware_udc.c} (91%)
>  rename include/usb/{spr_udc.h => designware_udc.h} (98%)
> 
> diff --git a/drivers/serial/usbtty.h b/drivers/serial/usbtty.h
> index a23169a..38b407f 100644
> --- a/drivers/serial/usbtty.h
> +++ b/drivers/serial/usbtty.h
> @@ -33,8 +33,8 @@
>  #include <usb/musb_udc.h>
>  #elif defined(CONFIG_PXA27X)
>  #include <usb/pxa27x_udc.h>
> -#elif defined(CONFIG_SPEAR3XX) || defined(CONFIG_SPEAR600)
> -#include <usb/spr_udc.h>
> +#elif defined(CONFIG_DW_UDC)
> +#include <usb/designware_udc.h>
>  #endif
>  
>  #include <version_autogenerated.h>
> diff --git a/drivers/usb/gadget/Makefile b/drivers/usb/gadget/Makefile
> index 1d7362d..3820f36 100644
> --- a/drivers/usb/gadget/Makefile
> +++ b/drivers/usb/gadget/Makefile
> @@ -28,11 +28,11 @@ LIB       := $(obj)libusb_gadget.a
>  ifdef CONFIG_USB_DEVICE
>  COBJS-y += core.o
>  COBJS-y += ep0.o
> +COBJS-$(CONFIG_DW_UDC) += designware_udc.o
>  COBJS-$(CONFIG_OMAP1510) += omap1510_udc.o
>  COBJS-$(CONFIG_OMAP1610) += omap1510_udc.o
>  COBJS-$(CONFIG_MPC885_FAMILY) += mpc8xx_udc.o
>  COBJS-$(CONFIG_PXA27X) += pxa27x_udc.o
> -COBJS-$(CONFIG_SPEARUDC) += spr_udc.o
>  endif
>  
>  COBJS        := $(COBJS-y)
> diff --git a/drivers/usb/gadget/spr_udc.c 
> b/drivers/usb/gadget/designware_udc.c
> similarity index 91%
> rename from drivers/usb/gadget/spr_udc.c
> rename to drivers/usb/gadget/designware_udc.c
> index f2b06d6..e550426 100644
> --- a/drivers/usb/gadget/spr_udc.c
> +++ b/drivers/usb/gadget/designware_udc.c
> @@ -29,14 +29,13 @@
>  
>  #include <usbdevice.h>
>  #include "ep0.h"
> -#include <usb/spr_udc.h>
> +#include <usb/designware_udc.h>
>  #include <asm/arch/hardware.h>
> -#include <asm/arch/spr_misc.h>
>  
>  #define UDC_INIT_MDELAY              80      /* Device settle delay */
>  
>  /* Some kind of debugging output... */
> -#ifndef DEBUG_SPRUSBTTY
> +#ifndef DEBUG_DWUSBTTY
>  #define UDCDBG(str)
>  #define UDCDBGA(fmt, args...)
>  #else
> @@ -251,7 +250,7 @@ static void usbputpcktofifo(int epNum, u8 *bufp, u32 len)
>  }
>  
>  /*
> - * spear_write_noniso_tx_fifo - Write the next packet to TxFIFO.
> + * dw_write_noniso_tx_fifo - Write the next packet to TxFIFO.
>   * @endpoint:                Endpoint pointer.
>   *
>   * If the endpoint has an active tx_urb, then the next packet of data from 
> the
> @@ -263,7 +262,7 @@ static void usbputpcktofifo(int epNum, u8 *bufp, u32 len)
>   * transmitted in this packet.
>   *
>   */
> -static void spear_write_noniso_tx_fifo(struct usb_endpoint_instance
> +static void dw_write_noniso_tx_fifo(struct usb_endpoint_instance
>                                      *endpoint)
>  {
>       struct urb *urb = endpoint->tx_urb;
> @@ -307,7 +306,7 @@ static void spear_write_noniso_tx_fifo(struct 
> usb_endpoint_instance
>   * Handle SETUP USB interrupt.
>   * This function implements TRM Figure 14-14.
>   */
> -static void spear_udc_setup(struct usb_endpoint_instance *endpoint)
> +static void dw_udc_setup(struct usb_endpoint_instance *endpoint)
>  {
>       u8 *datap = (u8 *)&ep0_urb->device_request;
>       int ep_addr = endpoint->endpoint_address;
> @@ -344,11 +343,11 @@ static void spear_udc_setup(struct 
> usb_endpoint_instance *endpoint)
>               endpoint->tx_urb = ep0_urb;
>               endpoint->sent = 0;
>               /*
> -              * Write packet data to the FIFO.  spear_write_noniso_tx_fifo
> +              * Write packet data to the FIFO.  dw_write_noniso_tx_fifo
>                * will update endpoint->last with the number of bytes written
>                * to the FIFO.
>                */
> -             spear_write_noniso_tx_fifo(endpoint);
> +             dw_write_noniso_tx_fifo(endpoint);
>  
>               writel(0x0, &inep_regs_p[ep_addr].write_done);
>       }
> @@ -361,7 +360,7 @@ static void spear_udc_setup(struct usb_endpoint_instance 
> *endpoint)
>  /*
>   * Handle endpoint 0 RX interrupt
>   */
> -static void spear_udc_ep0_rx(struct usb_endpoint_instance *endpoint)
> +static void dw_udc_ep0_rx(struct usb_endpoint_instance *endpoint)
>  {
>       u8 dummy[64];
>  
> @@ -395,7 +394,7 @@ static void spear_udc_ep0_rx(struct usb_endpoint_instance 
> *endpoint)
>  /*
>   * Handle endpoint 0 TX interrupt
>   */
> -static void spear_udc_ep0_tx(struct usb_endpoint_instance *endpoint)
> +static void dw_udc_ep0_tx(struct usb_endpoint_instance *endpoint)
>  {
>       struct usb_device_request *request = &ep0_urb->device_request;
>       int ep_addr;
> @@ -444,7 +443,7 @@ static void spear_udc_ep0_tx(struct usb_endpoint_instance 
> *endpoint)
>                        * need a zero-length terminating packet.
>                        */
>                       UDCDBG("ACK control read data stage packet");
> -                     spear_write_noniso_tx_fifo(endpoint);
> +                     dw_write_noniso_tx_fifo(endpoint);
>  
>                       ep_addr = endpoint->endpoint_address;
>                       writel(0x0, &inep_regs_p[ep_addr].write_done);
> @@ -452,7 +451,7 @@ static void spear_udc_ep0_tx(struct usb_endpoint_instance 
> *endpoint)
>       }
>  }
>  
> -static struct usb_endpoint_instance *spear_find_ep(int ep)
> +static struct usb_endpoint_instance *dw_find_ep(int ep)
>  {
>       int i;
>  
> @@ -469,11 +468,11 @@ static struct usb_endpoint_instance *spear_find_ep(int 
> ep)
>   * The ep argument is a physical endpoint number for a non-ISO IN endpoint
>   * in the range 1 to 15.
>   */
> -static void spear_udc_epn_rx(int ep)
> +static void dw_udc_epn_rx(int ep)
>  {
>       int nbytes = 0;
>       struct urb *urb;
> -     struct usb_endpoint_instance *endpoint = spear_find_ep(ep);
> +     struct usb_endpoint_instance *endpoint = dw_find_ep(ep);
>  
>       if (endpoint) {
>               urb = endpoint->rcv_urb;
> @@ -494,20 +493,28 @@ static void spear_udc_epn_rx(int ep)
>   * The ep argument is a physical endpoint number for a non-ISO IN endpoint
>   * in the range 16 to 30.
>   */
> -static void spear_udc_epn_tx(int ep)
> +static void dw_udc_epn_tx(int ep)
>  {
> -     struct usb_endpoint_instance *endpoint = spear_find_ep(ep);
> +     struct usb_endpoint_instance *endpoint = dw_find_ep(ep);
> +
> +     if (!endpoint)
> +             return;

This is a change not related to the change of 'spear' -> 'dw'
There are a number of other changes.
This patch must be split.

>  
>       /*
>        * We need to transmit a terminating zero-length packet now if
>        * we have sent all of the data in this URB and the transfer
>        * size was an exact multiple of the packet size.
>        */
> -     if (endpoint && endpoint->tx_urb && endpoint->tx_urb->actual_length) {
> -             if (endpoint->last == endpoint->tx_packetSize) {
> -                     /* handle zero length packet here */
> -                     writel(0x0, &inep_regs_p[ep].write_done);
> -             }
> +     if (endpoint->tx_urb &&
> +         (endpoint->last == endpoint->tx_packetSize) &&
> +         (endpoint->tx_urb->actual_length - endpoint->sent -
> +          endpoint->last == 0)) {
> +             /* handle zero length packet here */
> +             writel(0x0, &inep_regs_p[ep].write_done);
> +
> +     }
> +
> +     if (endpoint->tx_urb && endpoint->tx_urb->actual_length) {
>               /* retire the data that was just sent */
>               usbd_tx_complete(endpoint);
>               /*
> @@ -516,7 +523,7 @@ static void spear_udc_epn_tx(int ep)
>                */
>               if (endpoint->tx_urb && endpoint->tx_urb->actual_length) {
>                       /* write data to FIFO */
> -                     spear_write_noniso_tx_fifo(endpoint);
> +                     dw_write_noniso_tx_fifo(endpoint);
>                       writel(0x0, &inep_regs_p[ep].write_done);
>  
>               } else if (endpoint->tx_urb
> @@ -549,8 +556,6 @@ int udc_init(void)
>  
>       readl(&plug_regs_p->plug_pending);
>  
> -     udc_disconnect();
> -

This is another change.

>       for (i = 0; i < UDC_INIT_MDELAY; i++)
>               udelay(1000);
>  
> @@ -562,10 +567,9 @@ int udc_init(void)
>       writel(~0x0, &udc_regs_p->endp_int_mask);
>  
>       writel(DEV_CONF_FS_SPEED | DEV_CONF_REMWAKEUP | DEV_CONF_SELFPOW |
> -            /* Dev_Conf_SYNCFRAME | */
>              DEV_CONF_PHYINT_16, &udc_regs_p->dev_conf);
>  
> -     writel(0x0, &udc_regs_p->dev_cntl);
> +     writel(DEV_CNTL_SD, &udc_regs_p->dev_cntl);
>  
>       /* Clear all interrupts pending */
>       writel(DEV_INT_MSK, &udc_regs_p->dev_int);
> @@ -589,6 +593,9 @@ void udc_setup_ep(struct usb_device_instance *device,
>       char *tt;
>       u32 endp_intmask;
>  
> +     if ((ep != 0) && (udc_device->device_state < STATE_ADDRESSED))
> +             return;
> +

Here too.


>       tt = getenv("usbtty");
>       if (!tt)
>               tt = "generic";
> @@ -648,9 +655,6 @@ void udc_setup_ep(struct usb_device_instance *device,
>               writel(packet_size | ((buffer_size / sizeof(int)) << 16),
>                      &out_p->endp_maxpacksize);
>  
> -             writel((packet_size << 19) | ENDP_EPTYPE_CNTL,
> -                    &udc_regs_p->udc_endp_reg[ep_num]);
> -
>       } else if ((ep_addr & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) {
>               /* Setup the IN endpoint */
>               writel(0x0, &in_p->endp_status);
> @@ -709,7 +713,17 @@ void udc_setup_ep(struct usb_device_instance *device,
>  /* Turn on the USB connection by enabling the pullup resistor */
>  void udc_connect(void)
>  {
> -     u32 plug_st;
> +     u32 plug_st, dev_cntl;
> +
> +     dev_cntl = readl(&udc_regs_p->dev_cntl);
> +     dev_cntl |= DEV_CNTL_SD;
> +     writel(dev_cntl, &udc_regs_p->dev_cntl);
> +
> +     udelay(1000);
> +
> +     dev_cntl = readl(&udc_regs_p->dev_cntl);
> +     dev_cntl &= ~DEV_CNTL_SD;
> +     writel(dev_cntl, &udc_regs_p->dev_cntl);
>  
>       plug_st = readl(&plug_regs_p->plug_state);
>       plug_st &= ~(PLUG_STATUS_PHY_RESET | PLUG_STATUS_PHY_MODE);
> @@ -721,6 +735,8 @@ void udc_disconnect(void)
>  {
>       u32 plug_st;
>  
> +     writel(DEV_CNTL_SD, &udc_regs_p->dev_cntl);
> +
>       plug_st = readl(&plug_regs_p->plug_state);
>       plug_st |= (PLUG_STATUS_PHY_RESET | PLUG_STATUS_PHY_MODE);
>       writel(plug_st, &plug_regs_p->plug_state);
> @@ -765,7 +781,7 @@ void udc_startup_events(struct usb_device_instance 
> *device)
>        * DEVICE_HUB_CONFIGURED and DEVICE_RESET events here.
>        * DEVICE_HUB_CONFIGURED causes a transition to the state STATE_POWERED,
>        * and DEVICE_RESET causes a transition to the state STATE_DEFAULT.
> -      * The SPEAr USB client controller has the capability to detect when the
> +      * The DW USB client controller has the capability to detect when the
>        * USB cable is connected to a powered USB bus, so we will defer the
>        * DEVICE_HUB_CONFIGURED and DEVICE_RESET events until later.
>        */
> @@ -776,7 +792,7 @@ void udc_startup_events(struct usb_device_instance 
> *device)
>  /*
>   * Plug detection interrupt handling
>   */
> -void spear_udc_plug_irq(void)
> +void dw_udc_plug_irq(void)
>  {
>       if (readl(&plug_regs_p->plug_state) & PLUG_STATUS_ATTACHED) {
>               /*
> @@ -790,11 +806,6 @@ void spear_udc_plug_irq(void)
>               UDCDBG("device attached and powered");
>               udc_state_transition(udc_device->device_state, STATE_POWERED);
>       } else {
> -             /*
> -              * USB cable detached
> -              * Reset the PHY and switch the mode.
> -              */
> -             udc_disconnect();
>               writel(~0x0, &udc_regs_p->dev_int_mask);
>  
>               UDCDBG("device detached or unpowered");
> @@ -805,18 +816,23 @@ void spear_udc_plug_irq(void)
>  /*
>   * Device interrupt handling
>   */
> -void spear_udc_dev_irq(void)
> +void dw_udc_dev_irq(void)
>  {
>       if (readl(&udc_regs_p->dev_int) & DEV_INT_USBRESET) {
>               writel(~0x0, &udc_regs_p->endp_int_mask);
>  
> -             udc_connect();
> -
>               writel(readl(&inep_regs_p[0].endp_cntl) | ENDP_CNTL_FLUSH,
>                      &inep_regs_p[0].endp_cntl);
>  
>               writel(DEV_INT_USBRESET, &udc_regs_p->dev_int);
>  
> +             /*
> +              * This endpoint0 specific register can be programmed only
> +              * after the phy clock is initialized
> +              */
> +             writel((EP0_MAX_PACKET_SIZE << 19) | ENDP_EPTYPE_CNTL,
> +                             &udc_regs_p->udc_endp_reg[0]);
> +
>               UDCDBG("device reset in progess");
>               udc_state_transition(udc_device->device_state, STATE_DEFAULT);
>       }
> @@ -870,7 +886,7 @@ void spear_udc_dev_irq(void)
>  /*
>   * Endpoint interrupt handling
>   */
> -void spear_udc_endpoint_irq(void)
> +void dw_udc_endpoint_irq(void)
>  {
>       while (readl(&udc_regs_p->endp_int) & ENDP0_INT_CTRLOUT) {
>  
> @@ -878,13 +894,13 @@ void spear_udc_endpoint_irq(void)
>  
>               if ((readl(&outep_regs_p[0].endp_status) & ENDP_STATUS_OUTMSK)
>                   == ENDP_STATUS_OUT_SETUP) {
> -                     spear_udc_setup(udc_device->bus->endpoint_array + 0);
> +                     dw_udc_setup(udc_device->bus->endpoint_array + 0);
>                       writel(ENDP_STATUS_OUT_SETUP,
>                              &outep_regs_p[0].endp_status);
>  
>               } else if ((readl(&outep_regs_p[0].endp_status) &
>                           ENDP_STATUS_OUTMSK) == ENDP_STATUS_OUT_DATA) {
> -                     spear_udc_ep0_rx(udc_device->bus->endpoint_array + 0);
> +                     dw_udc_ep0_rx(udc_device->bus->endpoint_array + 0);
>                       writel(ENDP_STATUS_OUT_DATA,
>                              &outep_regs_p[0].endp_status);
>  
> @@ -897,13 +913,13 @@ void spear_udc_endpoint_irq(void)
>       }
>  
>       if (readl(&udc_regs_p->endp_int) & ENDP0_INT_CTRLIN) {
> -             spear_udc_ep0_tx(udc_device->bus->endpoint_array + 0);
> +             dw_udc_ep0_tx(udc_device->bus->endpoint_array + 0);
>  
>               writel(ENDP_STATUS_IN, &inep_regs_p[0].endp_status);
>               writel(ENDP0_INT_CTRLIN, &udc_regs_p->endp_int);
>       }
>  
> -     while (readl(&udc_regs_p->endp_int) & ENDP_INT_NONISOOUT_MSK) {
> +     if (readl(&udc_regs_p->endp_int) & ENDP_INT_NONISOOUT_MSK) {
>               u32 epnum = 0;
>               u32 ep_int = readl(&udc_regs_p->endp_int) &
>                   ENDP_INT_NONISOOUT_MSK;
> @@ -919,7 +935,7 @@ void spear_udc_endpoint_irq(void)
>               if ((readl(&outep_regs_p[epnum].endp_status) &
>                    ENDP_STATUS_OUTMSK) == ENDP_STATUS_OUT_DATA) {
>  
> -                     spear_udc_epn_rx(epnum);
> +                     dw_udc_epn_rx(epnum);
>                       writel(ENDP_STATUS_OUT_DATA,
>                              &outep_regs_p[epnum].endp_status);
>               } else if ((readl(&outep_regs_p[epnum].endp_status) &
> @@ -941,7 +957,7 @@ void spear_udc_endpoint_irq(void)
>               if (readl(&inep_regs_p[epnum].endp_status) & ENDP_STATUS_IN) {
>                       writel(ENDP_STATUS_IN,
>                              &outep_regs_p[epnum].endp_status);
> -                     spear_udc_epn_tx(epnum);
> +                     dw_udc_epn_tx(epnum);
>  
>                       writel(ENDP_STATUS_IN,
>                              &outep_regs_p[epnum].endp_status);
> @@ -963,13 +979,13 @@ void udc_irq(void)
>        * host requests.
>        */
>       while (readl(&plug_regs_p->plug_pending))
> -             spear_udc_plug_irq();
> +             dw_udc_plug_irq();
>  
>       while (readl(&udc_regs_p->dev_int))
> -             spear_udc_dev_irq();
> +             dw_udc_dev_irq();
>  
>       if (readl(&udc_regs_p->endp_int))
> -             spear_udc_endpoint_irq();
> +             dw_udc_endpoint_irq();
>  }
>  
>  /* Flow control */
> diff --git a/include/configs/spear-common.h b/include/configs/spear-common.h
> index 99923de..61bc45f 100644
> --- a/include/configs/spear-common.h
> +++ b/include/configs/spear-common.h
> @@ -33,7 +33,7 @@
>  #define CONFIG_PHY_RESET_DELAY                       (10000)         /* in 
> usec */
>  
>  /* USBD driver configuration */
> -#define CONFIG_SPEARUDC
> +#define CONFIG_DW_UDC
>  #define CONFIG_USB_DEVICE
>  #define CONFIG_USB_TTY
>  
> diff --git a/include/usb/spr_udc.h b/include/usb/designware_udc.h
> similarity index 98%
> rename from include/usb/spr_udc.h
> rename to include/usb/designware_udc.h
> index 2c332d5..47509ba 100644
> --- a/include/usb/spr_udc.h
> +++ b/include/usb/designware_udc.h
> @@ -21,8 +21,8 @@
>   * MA 02111-1307 USA
>   */
>  
> -#ifndef __SPR_UDC_H
> -#define __SPR_UDC_H
> +#ifndef __DW_UDC_H
> +#define __DW_UDC_H
>  
>  /*
>   * Defines for  USBD
> @@ -116,7 +116,7 @@ struct udc_regs {
>  #define  DEV_CNTL_TSHLDEN            0x00000080
>  #define  DEV_CNTL_BURSTEN            0x00000100
>  #define  DEV_CNTL_DMAMODE            0x00000200
> -#define  DEV_CNTL_SOFTDISCONNECT     0x00000400
> +#define  DEV_CNTL_SD                 0x00000400

The more descriptive 'SOFTDISCONNECT' is preferred to 'SD'
Revert

Tom

>  #define  DEV_CNTL_SCALEDOWN          0x00000800
>  #define  DEV_CNTL_BURSTLENU          0x00010000
>  #define  DEV_CNTL_BURSTLENMSK                0x00ff0000
> @@ -227,4 +227,4 @@ void udc_startup_events(struct usb_device_instance 
> *device);
>  void udc_setup_ep(struct usb_device_instance *device, unsigned int ep,
>                 struct usb_endpoint_instance *endpoint);
>  
> -#endif /* __SPR_UDC_H */
> +#endif /* __DW_UDC_H */

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to