12a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* 22a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * Copyright (C) 2005 Mike Lee(eemike@gmail.com) 32a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * 42a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * This udc driver is now under testing and code is based on pxa2xx_udc.h 52a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * Please use it with your own risk! 62a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * 72a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * This program is free software; you can redistribute it and/or modify 82a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * it under the terms of the GNU General Public License as published by 92a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * the Free Software Foundation; either version 2 of the License, or 102a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis * (at your option) any later version. 112a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis */ 122a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 132a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifndef __LINUX_USB_GADGET_IMX_H 142a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define __LINUX_USB_GADGET_IMX_H 152a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 162a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#include <linux/types.h> 172a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 182a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* Helper macros */ 192a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EP_NO(ep) ((ep->bEndpointAddress) & ~USB_DIR_IN) /* IN:1, OUT:0 */ 202a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EP_DIR(ep) ((ep->bEndpointAddress) & USB_DIR_IN ? 1 : 0) 212a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define IMX_USB_NB_EP 6 222a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 232a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* Driver structures */ 242a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulisstruct imx_request { 252a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct usb_request req; 262a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct list_head queue; 272a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis unsigned int in_use; 282a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis}; 292a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 302a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulisenum ep0_state { 312a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis EP0_IDLE, 322a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis EP0_IN_DATA_PHASE, 332a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis EP0_OUT_DATA_PHASE, 342a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis EP0_CONFIG, 352a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis EP0_STALL, 362a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis}; 372a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 382a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulisstruct imx_ep_struct { 392a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct usb_ep ep; 402a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct imx_udc_struct *imx_usb; 412a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct list_head queue; 422a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis unsigned char stopped; 432a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis unsigned char fifosize; 442a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis unsigned char bEndpointAddress; 452a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis unsigned char bmAttributes; 462a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis}; 472a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 482a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulisstruct imx_udc_struct { 492a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct usb_gadget gadget; 502a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct usb_gadget_driver *driver; 512a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct device *dev; 522a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct imx_ep_struct imx_ep[IMX_USB_NB_EP]; 532a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct clk *clk; 54b633d28e2c5fbe1c8d163892644f57df04aa1421Darius Augulis struct timer_list timer; 552a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis enum ep0_state ep0state; 562a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis struct resource *res; 572a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis void __iomem *base; 582a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis unsigned char set_config; 592a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis int cfg, 602a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis intf, 612a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis alt, 622a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis usbd_int[7]; 632a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis}; 642a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 652a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB registers */ 662a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_FRAME (0x00) /* USB frame */ 672a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_SPEC (0x04) /* USB Spec */ 682a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_STAT (0x08) /* USB Status */ 692a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_CTRL (0x0C) /* USB Control */ 702a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_DADR (0x10) /* USB Desc RAM addr */ 712a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_DDAT (0x14) /* USB Desc RAM/EP buffer data */ 722a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_INTR (0x18) /* USB interrupt */ 732a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_MASK (0x1C) /* USB Mask */ 742a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_ENAB (0x24) /* USB Enable */ 752a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_STAT(x) (0x30 + (x*0x30)) /* USB status/control */ 762a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_INTR(x) (0x34 + (x*0x30)) /* USB interrupt */ 772a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_MASK(x) (0x38 + (x*0x30)) /* USB mask */ 782a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FDAT(x) (0x3C + (x*0x30)) /* USB FIFO data */ 792a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FDAT0(x) (0x3C + (x*0x30)) /* USB FIFO data */ 802a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FDAT1(x) (0x3D + (x*0x30)) /* USB FIFO data */ 812a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FDAT2(x) (0x3E + (x*0x30)) /* USB FIFO data */ 822a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FDAT3(x) (0x3F + (x*0x30)) /* USB FIFO data */ 832a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FSTAT(x) (0x40 + (x*0x30)) /* USB FIFO status */ 842a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FCTRL(x) (0x44 + (x*0x30)) /* USB FIFO control */ 85593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis#define USB_EP_LRFP(x) (0x48 + (x*0x30)) /* USB last rd f. pointer */ 86593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis#define USB_EP_LWFP(x) (0x4C + (x*0x30)) /* USB last wr f. pointer */ 872a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FALRM(x) (0x50 + (x*0x30)) /* USB FIFO alarm */ 882a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FRDP(x) (0x54 + (x*0x30)) /* USB FIFO read pointer */ 892a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define USB_EP_FWRP(x) (0x58 + (x*0x30)) /* USB FIFO write pointer */ 902a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Control Register Bit Fields.*/ 912a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define CTRL_CMDOVER (1<<6) /* UDC status */ 922a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define CTRL_CMDERROR (1<<5) /* UDC status */ 932a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define CTRL_FE_ENA (1<<3) /* Enable Font End logic */ 942a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define CTRL_UDC_RST (1<<2) /* UDC reset */ 952a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define CTRL_AFE_ENA (1<<1) /* Analog Font end enable */ 962a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define CTRL_RESUME (1<<0) /* UDC resume */ 972a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Status Register Bit Fields.*/ 982a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define STAT_RST (1<<8) 992a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define STAT_SUSP (1<<7) 1002a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define STAT_CFG (3<<5) 1012a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define STAT_INTF (3<<3) 1022a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define STAT_ALTSET (7<<0) 1032a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Interrupt Status/Mask Registers Bit fields */ 1042a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_WAKEUP (1<<31) /* Wake up Interrupt */ 1052a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_MSOF (1<<7) /* Missed Start of Frame */ 1062a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_SOF (1<<6) /* Start of Frame */ 1072a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_RESET_STOP (1<<5) /* Reset Signaling stop */ 1082a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_RESET_START (1<<4) /* Reset Signaling start */ 1092a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_RESUME (1<<3) /* Suspend to resume */ 1102a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_SUSPEND (1<<2) /* Active to suspend */ 1112a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_FRAME_MATCH (1<<1) /* Frame matched */ 1122a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define INTR_CFG_CHG (1<<0) /* Configuration change occurred */ 1132a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Enable Register Bit Fields.*/ 1142a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define ENAB_RST (1<<31) /* Reset USB modules */ 1152a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define ENAB_ENAB (1<<30) /* Enable USB modules*/ 1162a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define ENAB_SUSPEND (1<<29) /* Suspend USB modules */ 1172a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define ENAB_ENDIAN (1<<28) /* Endian of USB modules */ 1182a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define ENAB_PWRMD (1<<0) /* Power mode of USB modules */ 1192a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Descriptor Ram Address Register bit fields */ 1202a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define DADR_CFG (1<<31) /* Configuration */ 1212a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define DADR_BSY (1<<30) /* Busy status */ 1222a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define DADR_DADR (0x1FF) /* Descriptor Ram Address */ 1232a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Descriptor RAM/Endpoint Buffer Data Register bit fields */ 1242a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define DDAT_DDAT (0xFF) /* Descriptor Endpoint Buffer */ 1252a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Endpoint Status Register bit fields */ 1262a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_BCOUNT (0x7F<<16) /* Endpoint FIFO byte count */ 1272a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_SIP (1<<8) /* Endpoint setup in progress */ 1282a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_DIR (1<<7) /* Endpoint transfer direction */ 1292a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_MAX (3<<5) /* Endpoint Max packet size */ 1302a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_TYP (3<<3) /* Endpoint type */ 1312a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_ZLPS (1<<2) /* Send zero length packet */ 1322a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_FLUSH (1<<1) /* Endpoint FIFO Flush */ 1332a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPSTAT_STALL (1<<0) /* Force stall */ 1342a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Endpoint FIFO Status Register bit fields */ 1352a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_FRAME_STAT (0xF<<24) /* Frame status bit [0-3] */ 1362a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_ERR (1<<22) /* FIFO error */ 1372a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_UF (1<<21) /* FIFO underflow */ 1382a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_OF (1<<20) /* FIFO overflow */ 1392a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_FR (1<<19) /* FIFO frame ready */ 1402a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_FULL (1<<18) /* FIFO full */ 1412a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_ALRM (1<<17) /* FIFO alarm */ 1422a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FSTAT_EMPTY (1<<16) /* FIFO empty */ 1432a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Endpoint FIFO Control Register bit fields */ 1442a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define FCTRL_WFR (1<<29) /* Write frame end */ 1452a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* USB Endpoint Interrupt Status Regsiter bit fields */ 1462a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_FIFO_FULL (1<<8) /* fifo full */ 1472a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_FIFO_EMPTY (1<<7) /* fifo empty */ 1482a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_FIFO_ERROR (1<<6) /* fifo error */ 1492a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_FIFO_HIGH (1<<5) /* fifo high */ 1502a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_FIFO_LOW (1<<4) /* fifo low */ 1512a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_MDEVREQ (1<<3) /* multi Device request */ 1522a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_EOT (1<<2) /* fifo end of transfer */ 1532a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_DEVREQ (1<<1) /* Device request */ 1542a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#define EPINTR_EOF (1<<0) /* fifo end of frame */ 1552a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 1562a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* Debug macros */ 1572a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG 1582a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 1592a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_REQ */ 1602a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_TRX */ 1612a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_INIT */ 1622a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_EP0 */ 1632a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_EPX */ 1642a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_IRQ */ 1652a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_EPIRQ */ 1662a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis/* #define DEBUG_DUMP */ 1678f182e5ddc84a30d7014a753ae359d85b1238e7fDarius Augulis/* #define DEBUG_ERR */ 1682a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 1692a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_REQ 1702a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_REQ(dev, args...) dev_dbg(dev, ## args) 1712a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 1722a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_REQ(dev, args...) do {} while (0) 1732a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_REQ */ 1742a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 1752a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_TRX 1762a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_TRX(dev, args...) dev_dbg(dev, ## args) 1772a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 1782a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_TRX(dev, args...) do {} while (0) 1792a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_TRX */ 1802a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 1812a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_INIT 1822a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_INI(dev, args...) dev_dbg(dev, ## args) 1832a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 1842a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_INI(dev, args...) do {} while (0) 1852a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_INIT */ 1862a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 1872a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_EP0 1882a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis static const char *state_name[] = { 1892a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis "EP0_IDLE", 1902a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis "EP0_IN_DATA_PHASE", 1912a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis "EP0_OUT_DATA_PHASE", 1922a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis "EP0_CONFIG", 1932a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis "EP0_STALL" 1942a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis }; 1952a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_EP0(dev, args...) dev_dbg(dev, ## args) 1962a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 1972a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_EP0(dev, args...) do {} while (0) 1982a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_EP0 */ 1992a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2002a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_EPX 2012a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_EPX(dev, args...) dev_dbg(dev, ## args) 2022a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 2032a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_EPX(dev, args...) do {} while (0) 2042a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_EP0 */ 2052a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2062a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_IRQ 2072a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis static void dump_intr(const char *label, int irqreg, struct device *dev) 2082a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis { 2092a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis dev_dbg(dev, "<%s> USB_INTR=[%s%s%s%s%s%s%s%s%s]\n", label, 2102a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_WAKEUP) ? " wake" : "", 2112a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_MSOF) ? " msof" : "", 2122a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_SOF) ? " sof" : "", 2132a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_RESUME) ? " resume" : "", 2142a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_SUSPEND) ? " suspend" : "", 2152a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_RESET_STOP) ? " noreset" : "", 2162a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_RESET_START) ? " reset" : "", 2172a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_FRAME_MATCH) ? " fmatch" : "", 2182a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & INTR_CFG_CHG) ? " config" : ""); 2192a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 2202a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 2212a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_intr(x, y, z) do {} while (0) 2222a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_IRQ */ 2232a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2242a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_EPIRQ 225593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis static void dump_ep_intr(const char *label, int nr, int irqreg, 226593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis struct device *dev) 2272a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis { 2282a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis dev_dbg(dev, "<%s> EP%d_INTR=[%s%s%s%s%s%s%s%s%s]\n", label, nr, 2292a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_FIFO_FULL) ? " full" : "", 2302a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_FIFO_EMPTY) ? " fempty" : "", 2312a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_FIFO_ERROR) ? " ferr" : "", 2322a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_FIFO_HIGH) ? " fhigh" : "", 2332a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_FIFO_LOW) ? " flow" : "", 2342a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_MDEVREQ) ? " mreq" : "", 2352a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_EOF) ? " eof" : "", 2362a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_DEVREQ) ? " devreq" : "", 2372a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (irqreg & EPINTR_EOT) ? " eot" : ""); 2382a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 2392a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 2402a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_ep_intr(x, y, z, i) do {} while (0) 2412a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_IRQ */ 2422a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2432a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_DUMP 244593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis static void dump_usb_stat(const char *label, 245593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis struct imx_udc_struct *imx_usb) 2462a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis { 2472a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis int temp = __raw_readl(imx_usb->base + USB_STAT); 2482a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2492a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis dev_dbg(imx_usb->dev, 2502a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis "<%s> USB_STAT=[%s%s CFG=%d, INTF=%d, ALTR=%d]\n", label, 2512a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & STAT_RST) ? " reset" : "", 2522a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & STAT_SUSP) ? " suspend" : "", 2532a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & STAT_CFG) >> 5, 2542a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & STAT_INTF) >> 3, 2552a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & STAT_ALTSET)); 2562a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 2572a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 258593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis static void dump_ep_stat(const char *label, 259593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis struct imx_ep_struct *imx_ep) 2602a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis { 261593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis int temp = __raw_readl(imx_ep->imx_usb->base 262593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis + USB_EP_INTR(EP_NO(imx_ep))); 2632a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2642a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis dev_dbg(imx_ep->imx_usb->dev, 265593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis "<%s> EP%d_INTR=[%s%s%s%s%s%s%s%s%s]\n", 266593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis label, EP_NO(imx_ep), 2672a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_FIFO_FULL) ? " full" : "", 2682a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_FIFO_EMPTY) ? " fempty" : "", 2692a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_FIFO_ERROR) ? " ferr" : "", 2702a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_FIFO_HIGH) ? " fhigh" : "", 2712a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_FIFO_LOW) ? " flow" : "", 2722a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_MDEVREQ) ? " mreq" : "", 2732a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_EOF) ? " eof" : "", 2742a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_DEVREQ) ? " devreq" : "", 2752a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPINTR_EOT) ? " eot" : ""); 2762a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 277593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis temp = __raw_readl(imx_ep->imx_usb->base 278593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis + USB_EP_STAT(EP_NO(imx_ep))); 2792a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2802a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis dev_dbg(imx_ep->imx_usb->dev, 281593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis "<%s> EP%d_STAT=[%s%s bcount=%d]\n", 282593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis label, EP_NO(imx_ep), 2832a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPSTAT_SIP) ? " sip" : "", 2842a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPSTAT_STALL) ? " stall" : "", 2852a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & EPSTAT_BCOUNT) >> 16); 2862a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 287593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis temp = __raw_readl(imx_ep->imx_usb->base 288593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis + USB_EP_FSTAT(EP_NO(imx_ep))); 2892a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 2902a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis dev_dbg(imx_ep->imx_usb->dev, 291593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis "<%s> EP%d_FSTAT=[%s%s%s%s%s%s%s]\n", 292593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis label, EP_NO(imx_ep), 2932a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_ERR) ? " ferr" : "", 2942a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_UF) ? " funder" : "", 2952a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_OF) ? " fover" : "", 2962a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_FR) ? " fready" : "", 2972a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_FULL) ? " ffull" : "", 2982a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_ALRM) ? " falarm" : "", 2992a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis (temp & FSTAT_EMPTY) ? " fempty" : ""); 3002a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 3012a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 302593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis static void dump_req(const char *label, struct imx_ep_struct *imx_ep, 303593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis struct usb_request *req) 3042a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis { 3052a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis int i; 3062a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 3072a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis if (!req || !req->buf) { 308593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis dev_dbg(imx_ep->imx_usb->dev, 309593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis "<%s> req or req buf is free\n", label); 3102a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis return; 3112a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 3122a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 313593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis if ((!EP_NO(imx_ep) && imx_ep->imx_usb->ep0state 314593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis == EP0_IN_DATA_PHASE) 3152a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis || (EP_NO(imx_ep) && EP_DIR(imx_ep))) { 3162a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 317593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis dev_dbg(imx_ep->imx_usb->dev, 318593bef6c75e11d2edb5396bd9775cf49a4cda659Darius Augulis "<%s> request dump <", label); 3192a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis for (i = 0; i < req->length; i++) 3202a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis printk("%02x-", *((u8 *)req->buf + i)); 3212a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis printk(">\n"); 3222a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 3232a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis } 3242a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 3252a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 3262a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_ep_stat(x, y) do {} while (0) 3272a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_usb_stat(x, y) do {} while (0) 3282a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_req(x, y, z) do {} while (0) 3292a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG_DUMP */ 3302a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 3312a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#ifdef DEBUG_ERR 3322a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_ERR(dev, args...) dev_dbg(dev, ## args) 3332a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 3342a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_ERR(dev, args...) do {} while (0) 3352a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif 3362a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 3372a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#else 3382a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_REQ(dev, args...) do {} while (0) 3392a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_TRX(dev, args...) do {} while (0) 3402a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_INI(dev, args...) do {} while (0) 3412a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_EP0(dev, args...) do {} while (0) 3422a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_EPX(dev, args...) do {} while (0) 3432a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_ep_intr(x, y, z, i) do {} while (0) 3442a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_intr(x, y, z) do {} while (0) 3452a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_ep_stat(x, y) do {} while (0) 3462a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_usb_stat(x, y) do {} while (0) 3472a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define dump_req(x, y, z) do {} while (0) 3482a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis #define D_ERR(dev, args...) do {} while (0) 3492a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* DEBUG */ 3502a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis 3512a4f136fbdcd89d44d83ed54df2c492a89f5ba9cDarius Augulis#endif /* __LINUX_USB_GADGET_IMX_H */ 352